ONES Helm 集群部署说明(外置数据库)
适用场景:采用外置数据库,且对权限隔离和变更审计有严格合规要求的部署场景。部署过程 遵循最小权限原则,CRD、RBAC、PVC 等 Kubernetes 资源及数据库 SQL 均可纳入现有审批流程, 由相应管理员审核并执行。
本文将引导您在 Kubernetes 集群中使用 Helm 完成 ONES 集群部署。
本部署方式适用于
v7.25.0或更高版本的 ONES。
通过 Helm 部署 ONES 时,暂不支持部署 ONES 监控告警与日志平台 ones-telemetry。该组件当前
依赖 root 运行权限及较高的 Cluster Scope 权限。
当前对外提供的 Helm 安装方式要求如下。
必要条件
- 部署前需准备可用的 Kubernetes 集群,且集群版本为
v1.22或更高版本。 - 部署前需准备私有镜像仓和镜像导入主机,用于导入 ONES 离线镜像;集群节点需能从该仓库 拉取镜像。
- ONES 采用集群多副本部署。
- MySQL 由客户外置提供。
部署前还需完成以下内容的人工审批,并由相应管理员执行:
- 创建 Namespace。
- 创建 CRD、RBAC 和 PVC。
- 审批并执行数据库初始化 SQL。
- 创建
Secret/ones-secret-config。
功能特性
- 支持单 Namespace 部署:所有 ONES 资源统一部署在同一个 Namespace 中。默认 Namespace 为
ones,也支持自定义,详见使用其他 Namespace。 - 最小化权限:ONES 组件运行时仅需 Namespace Scope 权限,不需要 Cluster Scope 权限。
- 支持资源与权限审批:Namespace、CRD、RBAC 和 PVC 由客户的 Kubernetes 集群管理员创建, 便于纳入客户内部的资源申请和权限审批流程。
- 支持 SQL 审批:数据库初始化 SQL 可在执行前由客户 DBA 审核,并纳入客户现有的 数据库变更审批流程。
- 支持声明式交付 GitOps:安装、升级和配置变更均可通过代码及 YAML 声明纳入 GitOps 和
CI/CD 流程。非敏感配置通过
values.yaml管理;密码、Token 等敏感配置通过Secret/ones-secret-config独立管理。 - 支持指定负载的节点访问:支持通过节点 Label 或节点名称,限定 ONES 工作负载可调度的节点范围; 默认不限制节点范围。
默认资源 与容量
Helm 集群部署开箱默认配置一般仅能满足 200 人以下的中小型团队约一年的使用需求。以下为 默认容量基础信息:
- 外置 MySQL:至少需要
4 vCPU、8 GiB内存和200 GB存储空间。 - ONES 工作负载:默认运行约
110个 Pod。由于容器数量较多,CPU Limit 总和约为160核、内存 Limit 总和约为170 GiB(不同版本略有差异)。 - PVC:默认申请约
22个,总容量约为1602 Gi(不同版本略有差异)。其中,容量 大于等于100 Gi的 PVC 共 9 个,合计约1400 Gi:- 附件存储:1 个 PVC,容量为
300 Gi。 - ClickHouse:2 个 PVC,每个容量为
100 Gi。 - TiKV:3 个 PVC,每个容量为
100 Gi。 - Kafka:3 个 PVC,每个容量为
200 Gi。
- 附件存储:1 个 PVC,容量为
补充说明
- CPU Limit 和内存 Limit 是各容器对应资源上限的累加值,实际运行时各容器通常不会同时
达到上限。200 人以下的中小型团队正常使用时,容器总体资源消耗通常约为
20核 CPU 和80 GiB内存。 - 仅用于短期、少量且数据量极少的测试时,可以在创建 PVC 前,将附件存储、ClickHouse、
TiKV 和 Kafka 的单个 PVC 容量调整为
20Gi。调整后,PVC 总容量约为382Gi,规划时 可按约400Gi评估。该配置不适用于生产环境。 - 外置 MySQL 可用内存较小时,需要由 DBA 根据实际内存调整 MySQL 内存相关参数,避免 MySQL 进程因内存使用超限触发 OOM。
- 如需使用 ResourceQuota 对 Namespace 进行资源限制,建议默认将
limits.cpu配置为200,limits.memory配置为200Gi。
如果需要支持更大的团队规模、数据量或并发量,可以在部署前联系 ONES 技术支持进行容量 评估,并调整 Pod 的 CPU、内存上限、PVC 容量及其他相关配置项;也可以先使用默认配置, 后续遇到资源瓶颈时再进行扩容。
操作步骤
- ONES 镜像导入私有仓。
- 配置集群私有化配置。
- 创建 Namespace。
- 创建 ONES CRD 和 RBAC。
- 创建 PVC。
- 配置并初始化外置数据库。
- 安装 ONES。
- 观察部署进度并验收。
- 网关对接。
准备部署参数
先在终端执行以下命令,根据实际环境准备部署参数。本文后续命令均复用这些参数,请在同一 终端会话中执行:
# 必须改为本次计划部署的 ONES 版本
ONES_VERSION="v7.25.0"
# ONES 使用的 Namespace
NAMESPACE="ones"
# ONES Helm 仓库地址
HELM_REPO_URL="https://packages.ones.cn/release/helm"
mkdir -p ~/ones/${NAMESPACE}
cd ~/ones/${NAMESPACE}
- 全球区域将
HELM_REPO_URL设置为https://packages.ones.com/release/helm。 - 使用其他 Namespace 时,只需修改
NAMESPACE;YAML 清单中的 Namespace 也需要保持一致。 - 每个 Namespace 使用独立的
~/ones/${NAMESPACE}工作目录,统一保存安装配置、资源清单和 操作记录,避免同一台主机管理多套 ONES 时发生文件冲突。
第 1 步:ONES 镜像导入私有仓
- 生产环境:建议使用客户私有镜像仓。安装前,请按照 ONES 镜像导入私有镜像仓导入所选 ONES 版本需要的全部镜像。
- 临时测试:可以直接使用 ONES 公网镜像仓,并跳过本步骤。
注意:ONES 不保证公网镜像仓的可用性,请勿将其用于生产环境。
镜像导入完成后,返回 ONES 操作目录,再继续后续步骤:
cd ~/ones/${NAMESPACE}
第 2 步:配置集群私有化配置
确认当前目录并创建 values.yaml:
cd ~/ones/${NAMESPACE}
vi ~/ones/${NAMESPACE}/values.yaml
写入以下配置:
# Use the multi-replica deployment mode.
onesSystemScale: "common-ha"
# Target Kubernetes node architecture. Supported values: amd64 and arm64.
systemArchitecture: "amd64"
# Disable the built-in MySQL and use a customer-provided database.
internalComponentMysqlEnable: false
mysqlManualInitDBEnable: true
# Keep the configuration supplied by Helm and only generate missing secrets.
initConfigDone: "true"
# Default resource requests and limits for containers without precise rules.
workloadResourceOverrides: |
default.containers.resources.requests.cpu=0
default.containers.resources.limits.cpu=1000m
default.containers.resources.requests.memory=0
default.containers.resources.limits.memory=512Mi
default.initContainers.resources.requests.cpu=0
default.initContainers.resources.limits.cpu=500m
default.initContainers.resources.requests.memory=0
default.initContainers.resources.limits.memory=256Mi
# Database migration resources required when ResourceQuota enforces requests and limits.
migrationContainerCPURequest: "0"
migrationContainerCPULimit: "4000m"
migrationContainerMemoryRequest: "0"
migrationContainerMemoryLimit: "10Gi"
migrationInitContainerCPURequest: "0"
migrationInitContainerCPULimit: "500m"
migrationInitContainerMemoryRequest: "0"
migrationInitContainerMemoryLimit: "128Mi"
# Language and time zone.
defaultLanguage: "zh"
clickhouseTimeZone: "Asia/Shanghai"
projectAPITimezone: "Asia/Shanghai"
timezone: "Asia/Shanghai"
# Optional NodePort for temporary test access. Do not use it as the production gateway.
# accessNodePort: "30011"
# StorageClass used by ONES PVCs.
storageClassNameForReadWriteMany: "<REPLACE_WITH_RWX_STORAGECLASS>"
storageClassNameForReadWriteManyWithRetain: "<REPLACE_WITH_RWX_RETAIN_STORAGECLASS>"
storageClassNameForReadWriteOnce: "<REPLACE_WITH_RWO_STORAGECLASS>"
storageClassNameForReadWriteOnceWithRetain: "<REPLACE_WITH_RWO_RETAIN_STORAGECLASS>"
# Namespace, CRD, RBAC, and PVC are prepared by the customer administrator.
enableNamespaceAutoCreate: false
enableCRDAutoCreate: false
enableRBACAutoCreate: false
enablePVCAutoReconcile: false
需要根据实际环境调整以下配置:
| 配置项 | 说明 |
|---|---|
systemArchitecture | Kubernetes 节点架构,可选 amd64、arm64 |
defaultLanguage | ONES 默认语言:zh(简体中文)、en(English)、ja(日本語)、de(Deutsch)、zh-Hant-HK(繁體中文) |
clickhouseTimeZone、projectAPITimezone、timezone | ONES 服务使用的 IANA 时区,三项填写相同的值。例如:Asia/Shanghai、America/New_York、Asia/Tokyo、Europe/Berlin、Asia/Hong_Kong |
storageClassNameForReadWriteMany | 支持 ReadWriteMany 的 StorageClass |
storageClassNameForReadWriteManyWithRetain | 支持 ReadWriteMany 且回收策略为 Retain 的 StorageClass |
storageClassNameForReadWriteOnce | 支持 ReadWriteOnce、底层存储介质为 SSD 的 StorageClass |
storageClassNameForReadWriteOnceWithRetain | 支持 ReadWriteOnce、底层存储介质为 SSD,且回收策略为 Retain 的 StorageClass |
当 ResourceQuota 要求每个容器必须配置 CPU、内存的 request 和 limit 时,请保留上述 8 项 迁移容器资源配置。配置缺失会导致版本升级时 Migration Job 无法创建 Pod。
补充说明
Retain可以避免误删 PVC 时底层数据被一并清理。
storageClassNameForReadWriteOnce和storageClassNameForReadWriteOnceWithRetain必须使用 SSD 介质存储。不建议使用 NFS 代替ReadWriteOnceStorageClass,否则可能明显影响 I/O 性能。请确认所选 StorageClass 的访问模式和回收策略;如不明确,请联系 Kubernetes 管理员或 存储供应商。
执行以下命令查看集群中的 StorageClass:
kubectl get storageclass
第 3 步:创建 Namespace
kubectl create namespace "${NAMESPACE}"
Namespace 资源说明
- 工作负载规模:默认运行约
110个 Pod。由于容器数量较多,CPU Limit 总和约为160核、内存 Limit 总和约为170 GiB(不同版本略有差异)。 - 实际资源消耗:CPU Limit 和内存 Limit 是各容器对应资源上限的累加值,各容器通常不会
同时达到 上限。200 人以下的中小型团队正常使用时,总体资源消耗通常约为
20核 CPU 和80 GiB内存。 - ResourceQuota 建议:如需使用 ResourceQuota 对 Namespace 进行资源限制,建议将
limits.cpu配置为200,limits.memory配置为200Gi。
第 4 步:创建 ONES CRD 和 RBAC
创建 ONES CRD 和 Namespace Scope 最小权限 RBAC:
kubectl apply --server-side \
-f "https://packages.ones.cn/release/kubernetes-mainfest/${ONES_VERSION}/ones/common/ones-cluster-crd.yaml"
kubectl -n "${NAMESPACE}" apply \
-f "https://packages.ones.cn/release/kubernetes-mainfest/${ONES_VERSION}/ones/common/ones-cluster-rbac-mini.yaml"
CRD 使用 Server-Side Apply,避免大型 CRD 写入
kubectl.kubernetes.io/last-applied-configuration 注解后超过 Kubernetes 注解大小限制。
确认资源已创建:
kubectl get crd migrations.ones.ai onesclusters.ones.ai
kubectl -n "${NAMESPACE}" get serviceaccount,role,rolebinding
第 5 步:创建 PVC
返回 ONES 操作目录,确保 PVC 清单保存在固定位置:
cd ~/ones/${NAMESPACE}
5.1 获取 PVC 清单
curl -fL \
"https://packages.ones.cn/release/kubernetes-mainfest/${ONES_VERSION}/ones/cluster/ones-cluster-pvc.yaml" \
-o ~/ones/${NAMESPACE}/ones-cluster-pvc.yaml
查看 PVC 清单:
cat ~/ones/${NAMESPACE}/ones-cluster-pvc.yaml
清单开头的 PVC LIST 注释信息列出了 PVC 名称、访问模式、回收策略和容量。如果需要走
内部资源申请流程,可根据该清单申请所需的存储资源。
5.2 替换 StorageClass
编辑 ones-cluster-pvc.yaml:
vi ~/ones/${NAMESPACE}/ones-cluster-pvc.yaml
使用第 2 步“配置集群私有化配置”中 values.yaml 填写的 StorageClass,替换清单中的
对应占位符:
| PVC 清单占位符 | values.yaml 配置项 |
|---|---|
__storageClassNameForReadWriteMany__ | storageClassNameForReadWriteMany |
__storageClassNameForReadWriteManyWithRetain__ | storageClassNameForReadWriteManyWithRetain |
__storageClassNameForReadWriteOnce__ | storageClassNameForReadWriteOnce |
__storageClassNameForReadWriteOnceWithRetain__ | storageClassNameForReadWriteOnceWithRetain |
执行以下命令检查。命令无输出表示所有 StorageClass 占位符均已替换:
grep -n '__storageClassName' ~/ones/${NAMESPACE}/ones-cluster-pvc.yaml
5.3 创建 PVC
PVC 权限要求
ONES 容器使用 UID/GID
1000/1000读写数据卷。应用 PVC 清单前,请确认:
- 数据卷权限:满足以下任一条件:
- 数据卷的用户和用户组为
1000:1000,目录权限为0755。- 数据卷目录权限为
0777。- 存储驱动:支持 Kubernetes 的
fsGroup和fsGroupChangePolicy。如果存储驱动不支持上述能力,请联系 Kubernetes 管理员或存储供应商协助配置数据卷权限。
创建 PVC:
kubectl -n "${NAMESPACE}" apply -f ~/ones/${NAMESPACE}/ones-cluster-pvc.yaml
kubectl -n "${NAMESPACE}" get pvc
第 6 步:配置并初始化外置数据库
返回 ONES 操作目录,确保数据库说明、SQL 包和 Secret 配置保存在固定位置:
cd ~/ones/${NAMESPACE}
6.1 获取数据库初始化说明
curl -fsSL \
"https://packages.ones.cn/release/${ONES_VERSION}/database/init-database.md" \
-o ~/ones/${NAMESPACE}/init-database.md
cat ~/ones/${NAMESPACE}/init-database.md
默认获取英文版说明。如需中文版,请将上述 URL 和文件名中的 init-database.md 替换为
init-database-cn.md。
init-database.md 包含以下说明:
- 下载并审核数据库初始化 SQL 包。
- 创建
ones-secret-config.yaml,填写外置数据库连接和账号信息。 - 使用配置的密码替换 SQL 密码占位符。
- 创建数据库账号、数据库和表,并完成账号授权。
请按照 init-database.md 中的操作说 明,完成 ones-secret-config.yaml 的创建和数据库初始化。
6.2 补充初始团队配置和镜像仓配置
编辑上一步创建的 ones-secret-config.yaml:
vi ~/ones/${NAMESPACE}/ones-secret-config.yaml
在 stringData.secret.yaml 下追加初始团队配置;使用客户私有镜像仓时,同时追加镜像仓配置:
apiVersion: v1
kind: Secret
metadata:
name: ones-secret-config
namespace: "<填写 ONES Namespace,例如 ones>"
type: Opaque
stringData:
secret.yaml: |
# 此处省略上一步已经填写的 MySQL 配置
# 初始团队配置
teamName: "<初始团队名称>"
ownerName: "<初始管理员名称>"
ownerEmail: "<初始管理员邮箱>"
ownerPassword: "<初始管理员密码>"
# 镜像仓配置
dockerRegistryHost: "registry.example.com"
dockerRegistryUserName: "<私有镜像仓库用户名>"
dockerRegistryToken: "<私有镜像仓库密码或 Token>"
dockerRegistryBasepathForOnesImage: "/ones/"
配置说明:
-
初始管理员密码:
ownerPassword长度为 8~32 个字符,必须同时包含大写字母、 小写字母和数字,不能包含空格或全角字符。部署完成后可在 ONES 中修改。 -
镜像路径:
dockerRegistryBasepathForOnesImage用于指定私有镜像仓中存放 ONES 镜像的 URL 子路径,必须以/开头和结尾。 -
临时测试场景,可使用公网镜像仓:ONES 不保证公网镜像仓的可用性,请勿将其用于生产环境。
中国区:
dockerRegistryHost: "registry.ones.cn"
dockerRegistryUserName: ""
dockerRegistryToken: ""
dockerRegistryBasepathForOnesImage: "/ones/"全球:
dockerRegistryHost: "public.ecr.aws"
dockerRegistryUserName: ""
dockerRegistryToken: ""
dockerRegistryBasepathForOnesImage: "/registry.ones.com/"
完成配置后,应用 Secret:
kubectl -n "${NAMESPACE}" apply -f ~/ones/${NAMESPACE}/ones-secret-config.yaml
kubectl -n "${NAMESPACE}" get secret ones-secret-config
不要将 ones-secret-config.yaml 提交到 Git 仓库或发送到不受控的日志系统。
第 7 步:安装 ONES
数据库初始化完成后,返回 ONES 操作目录,并确认安装所需配置文件存在:
cd ~/ones/${NAMESPACE}
ls -l ~/ones/${NAMESPACE}/values.yaml ~/ones/${NAMESPACE}/ones-secret-config.yaml
7.1 检查客户端和集群
安装机需要能够访问目标 Kubernetes 集群,并已安装 kubectl 和 Helm:
kubectl cluster-info
helm version
执行后确认命令指向目标生产集群。
7.2 添加 Helm 仓库
使用准备部署参数时设置的 Helm 仓库:
helm repo add ones \
"${HELM_REPO_URL}" \
--force-update
helm repo update
helm search repo ones/ones-cluster --versions
确认列表中存在需要安装的 ONES 版本。
7.3 安装指定 ONES 版本
helm install ones ones/ones-cluster \
--version "${ONES_VERSION}" \
--namespace "${NAMESPACE}" \
-f ~/ones/${NAMESPACE}/values.yaml \
--atomic \
--timeout 30m
第 8 步:观察部署进度并验收
8.1 观察 installer-operator 调度进度
kubectl -n "${NAMESPACE}" logs -f deployment/installer-operator
日志以 [当前步骤/总步骤] 显示 Bootstrap 进度。如果调度失败,查看汇总错误:
kubectl -n "${NAMESPACE}" logs installer-operator-error
修复外部依赖或配置问题后,installer-operator 会重新调度 Bootstrap。