ONES Helm 集群部署说明(内置数据库)
适用场景:适用于 POC 验证及希望快速完成环境搭建的场景。该方式使用内置数据库,由 Helm 自动创建 CRD、RBAC 和 PVC,并完成数据库初始化,提供更高程度的部署自动化和开箱体验;ONES 运行时组件仍遵循最小权限原则。
本文将引导您在 Kubernetes 集群中使用 Helm 部署 ONES,并使用 ONES 内置中间件。
本部署方式适用于
v7.25.0或更高版本的 ONES。
通过 Helm 部署 ONES 时,暂不支持部署 ONES 监控告警与日志平台 ones-telemetry。该组件当前
依赖 root 运行权限及较高的 Cluster Scope 权限。
必要条件
- 部署前需准备可用的 Kubernetes 集群,且集群版本为
v1.22或更高版本。 - 部署前需准备私有镜像仓和镜像导入主机,用于导入 ONES 离线镜像;集群节点需能从该仓库 拉取镜像。
- ONES 采用集群多副本 部署。
- 使用 ONES 内置中间件(内置数据库)。
- Kubernetes 已提供可动态创建存储卷的
ReadWriteMany和ReadWriteOnceStorageClass,并分别 提供回收策略为Retain的对应 StorageClass。 - Helm 需要创建 CRD、Namespace、RBAC 和 PVC,因此执行 Helm 的 Kubernetes 身份必须具备 Helm 部署所需的 Kubernetes 身份最小权限清单。
功能特性
- 支持单 Namespace 部署:所有 ONES 资源统一部署在同一个 Namespace 中。默认 Namespace 为
ones,也支持自定义,详见使用其他 Namespace。 - 内置中间件:MySQL、Kafka、Redis、TiKV 和 ClickHouse 随 ONES 一起部署。
- 自动创建安装资源:Helm 自动创建 ONES 和内置 MySQL 所需的 CRD、Namespace Scope RBAC 和 PVC,无需分别应用 CRD、RBAC、PVC 清单。
- 最小化权限:ONES 组件运行时仅使用 Namespace Scope 权限,不需要 Cluster Scope 权限。
- 支持声明式交付 GitOps:安装、升级和配置变更可以通过代码及 YAML 纳入 GitOps 和 CI/CD
流程。非敏感配置通过
values.yaml管理;密码、Token 等敏感配置通过Secret/ones-secret-config管理。 - 支持指定负载的节点访问:支持通过节点 Label 或节点名称限定 ONES 工作 负载可调度的节点范围, 默认不限制。
默认资源与容量
Helm 集群部署开箱默认配置一般仅能满足 200 人以下的中小型团队约一年的使用需求。以下为 默认容量基础信息:
- ONES 工作负载:默认运行约
110个 Pod。由于容器数量较多,CPU Limit 总和约为160核、内存 Limit 总和约为170 GiB(不同版本略有差异)。 - 内置 MySQL:默认运行 3 个 MySQL 实例,每个实例的 CPU Limit 为
4核、内存 Limit 为8 GiB,合计 CPU Limit 为12核、内存 Limit 为24 GiB。 - PVC:默认约
29个,总容量约为2206 Gi(不同版本略有差异)。主要的大容量 PVC 包括:- 内置 MySQL:7 个 PVC,其中 3 个每个
200 Gi、4 个每个1 Gi,容量合计约为604 Gi。 - 附件存储:1 个 PVC,容量为
300 Gi。 - ClickHouse:2 个 PVC,每个容量为
100 Gi。 - TiKV:3 个 PVC,每个容量为
100 Gi。 - Kafka:3 个 PVC,每个容量为
200 Gi。
- 内置 MySQL:7 个 PVC,其中 3 个每个
补充说明
- 内置 MySQL 默认的单实例
4C/8GiB配置仅支持导入少量数据进行测试。如果需要导入大量 数据,或进行性能测试、压力测试,需要提高 MySQL 的 CPU 和内存上限,并同步调整 MySQL 配置参数。 - CPU Limit 和内存 Limit 是各容器对应资源上限的累加值,实际运行时各容器通常不会同时
达到上限。200 人以下的中小型团队正常使用时,加上内置 MySQL 后,容器总体资源消耗通常
约为
28核 CPU 和100 GiB内存。 - ONES 工作负载与内置 MySQL 的 CPU Limit 总和约为
172核,内存 Limit 总和约为194 GiB(不同版本略有差异)。如需使用 ResourceQuota 对 Namespace 进行资源限制, 建议默认将limits.cpu配置为200,limits.memory配置为250Gi。 - 仅用于短期、少量且数据量极少的测试时,可以将
pvcOnesFileVolumeSize、pvcMysqlDataVolumeSize、clickhouseDataVolumeSize、pvcTidbTikvolumeSize和pvcKafkaDataVolumeSize统一调整为20Gi。调整后,ONES 其他 PVC 总容量约为382 Gi, 内置 MySQL 数据 PVC 总容量约为60 Gi,规划时可按约450 Gi评估。 - 如果需要支持更大的团队规模、数据量或并发量,请在部署前联系 ONES 技术支持进行容量评估, 并调整 Pod 的 CPU、内存上限、PVC 容量及其他相关配置项。
操作步骤
- 导入 ONES 和内置 MySQL 镜像。
- 配置集群私有化配置。
- 创建 Namespace。
- 创建敏感配置 Secret。
- 安装 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 和内置 MySQL 镜像
- 生产环境:使用客户私有镜像仓,并在安装前导入目标 ONES 版本的主体镜像和内置 MySQL 镜像。
- 临时测试:可以直接使用 ONES 公网镜像仓,并跳过本步骤。
注意:ONES 不保证公网镜像仓的可用性,请勿将其用于生产环境。
按照 ONES 镜像导入私有镜像仓中的步骤,根据 Kubernetes 节点 架构导入业务镜像和内置 MySQL 镜像。可以使用预制离线包导入,也可以选择附录中的 Docker 在线导入方式。
镜像导入完成后,返回 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"
# Deploy and initialize the built-in MySQL automatically.
internalComponentMysqlEnable: true
mysqlManualInitDBEnable: false
# Built-in MySQL resource limits for each MySQL instance.
mysqlCPULimit: "4000m"
mysqlMemoryLimit: "8Gi"
# Optional CPU and memory overrides for containers generated by mysql-operator.
# Empty values preserve the mysql-operator defaults.
mysqlContainerInitCPURequest: "0"
mysqlContainerInitCPULimit: "4000m"
mysqlContainerInitMemoryRequest: "0"
mysqlContainerInitMemoryLimit: "8Gi"
mysqlContainerInitOnlyCPURequest: "0"
mysqlContainerInitOnlyCPULimit: "4000m"
mysqlContainerInitOnlyMemoryRequest: "0"
mysqlContainerInitOnlyMemoryLimit: "8Gi"
mysqlContainerIncrementalRestoreCPURequest: "0"
mysqlContainerIncrementalRestoreCPULimit: "4000m"
mysqlContainerIncrementalRestoreMemoryRequest: "0"
mysqlContainerIncrementalRestoreMemoryLimit: "8Gi"
mysqlContainerCPURequest: "0"
mysqlContainerCPULimit: "4000m"
mysqlContainerMemoryRequest: "0"
mysqlContainerMemoryLimit: "8Gi"
mysqlContainerSidecarCPURequest: "0"
mysqlContainerSidecarCPULimit: "2000m"
mysqlContainerSidecarMemoryRequest: "0"
mysqlContainerSidecarMemoryLimit: "2Gi"
mysqlContainerXbackupServerCPURequest: "0"
mysqlContainerXbackupServerCPULimit: "2000m"
mysqlContainerXbackupServerMemoryRequest: "0"
mysqlContainerXbackupServerMemoryLimit: "2Gi"
mysqlContainerMetricsExporterCPURequest: "0"
mysqlContainerMetricsExporterCPULimit: "100m"
mysqlContainerMetricsExporterMemoryRequest: "0"
mysqlContainerMetricsExporterMemoryLimit: "512Mi"
mysqlContainerPtHeartbeatCPURequest: "0"
mysqlContainerPtHeartbeatCPULimit: "100m"
mysqlContainerPtHeartbeatMemoryRequest: "0"
mysqlContainerPtHeartbeatMemoryLimit: "256Mi"
mysqlContainerFluentdCPURequest: "0"
mysqlContainerFluentdCPULimit: "500m"
mysqlContainerFluentdMemoryRequest: "0"
mysqlContainerFluentdMemoryLimit: "256Mi"
mysqlContainerMasterTakeoverCPURequest: "0"
mysqlContainerMasterTakeoverCPULimit: "200m"
mysqlContainerMasterTakeoverMemoryRequest: "0"
mysqlContainerMasterTakeoverMemoryLimit: "256Mi"
mysqlContainerPtKillCPURequest: "0"
mysqlContainerPtKillCPULimit: "100m"
mysqlContainerPtKillMemoryRequest: "0"
mysqlContainerPtKillMemoryLimit: "256Mi"
# Optional securityContext overrides for containers generated by mysql-operator.
# fsGroup and fsGroupChangePolicy are Pod-level Kubernetes fields.
mysqlContainerInitRunAsUser: "1000"
mysqlContainerInitRunAsGroup: "1000"
mysqlContainerInitOnlyRunAsUser: "1000"
mysqlContainerInitOnlyRunAsGroup: "1000"
mysqlContainerIncrementalRestoreRunAsUser: "1000"
mysqlContainerIncrementalRestoreRunAsGroup: "1000"
mysqlContainerRunAsUser: "1000"
mysqlContainerRunAsGroup: "1000"
mysqlContainerSidecarRunAsUser: "1000"
mysqlContainerSidecarRunAsGroup: "1000"
mysqlContainerXbackupServerRunAsUser: "1000"
mysqlContainerXbackupServerRunAsGroup: "1000"
mysqlContainerMetricsExporterRunAsUser: "1000"
mysqlContainerMetricsExporterRunAsGroup: "1000"
mysqlContainerPtHeartbeatRunAsUser: "1000"
mysqlContainerPtHeartbeatRunAsGroup: "1000"
mysqlContainerFluentdRunAsUser: "1000"
mysqlContainerFluentdRunAsGroup: "1000"
mysqlContainerMasterTakeoverRunAsUser: "1000"
mysqlContainerMasterTakeoverRunAsGroup: "1000"
mysqlContainerPtKillRunAsUser: "1000"
mysqlContainerPtKillRunAsGroup: "1000"
mysqlPodRunAsUser: "1000"
mysqlPodRunAsGroup: "1000"
mysqlPodFSGroup: "1000"
mysqlPodFSGroupChangePolicy: "OnRootMismatch"
# Legacy mysql container ownership settings.
mysqlContainerFsgroup: 1000
# mysqlContainerRunasuser sets the legacy/root-compatible user ID used by the MySQL container.
# When podSecurityContextNonRootEnabled=true, built-in MySQL follows podSecurityContextRunAsUser instead.
mysqlContainerRunasuser: 1000
# 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 and built-in middleware PVCs.
storageClassNameForReadWriteMany: "<REPLACE_WITH_RWX_STORAGECLASS>"
storageClassNameForReadWriteManyWithRetain: "<REPLACE_WITH_RWX_RETAIN_STORAGECLASS>"
storageClassNameForReadWriteOnce: "<REPLACE_WITH_RWO_STORAGECLASS>"
storageClassNameForReadWriteOnceWithRetain: "<REPLACE_WITH_RWO_RETAIN_STORAGECLASS>"
# Capacity of each large data PVC.
pvcOnesFileVolumeSize: "300Gi"
pvcMysqlDataVolumeSize: "200Gi"
clickhouseDataVolumeSize: "100Gi"
pvcTidbTikvolumeSize: "100Gi"
pvcKafkaDataVolumeSize: "200Gi"
# Helm creates CRDs, Namespace Scope RBAC, and PVCs.
enableNamespaceAutoCreate: false
enableCRDAutoCreate: true
enableRBACAutoCreate: true
enablePVCAutoReconcile: true
enableLocalStorageAutoCreate: false
需要根据实际环境调整以下配置:
| 配置项 | 说明 |
|---|---|
systemArchitecture | Kubernetes 节点架构,可选 amd64、arm64 |
defaultLanguage | ONES 默认语言:zh、en、ja、de、zh-Hant-HK |
clickhouseTimeZone、projectAPITimezone、timezone | ONES 服务使用的 IANA 时区,三项填写相同的值 |
storageClassNameForReadWriteMany | 支持 ReadWriteMany 的 StorageClass |
storageClassNameForReadWriteManyWithRetain | 支持 ReadWriteMany 且回收策略为 Retain 的 StorageClass |
storageClassNameForReadWriteOnce | 支持 ReadWriteOnce、底层存储介质为 SSD 的 StorageClass |
storageClassNameForReadWriteOnceWithRetain | 支持 ReadWriteOnce、底层存储介质为 SSD,且回收策略为 Retain 的 StorageClass |
StorageClass 要求
Retain可以避免误删 PVC 时底层数据被一并清理。storageClassNameForReadWriteOnce和storageClassNameForReadWriteOnceWithRetain必须使用 SSD 介质存储。不建议使用 NFS 代替ReadWriteOnceStorageClass,否则可能明显影响 I/O 性能。- 请确认所选 StorageClass 的访问模式、回收策略、容量,以及能否动态创建存储卷。
- 存储驱动应支持
fsGroup和fsGroupChangePolicy,确保 UID/GID1000/1000的容器可以 读写数据卷。- 如不明确,请联系 Kubernetes 管理员或存储供应商确认。
- 执行
kubectl get storageclass查看集群中的 StorageClass。
当 ResourceQuota 要求每个容器必须配置 CPU、内存 request 和 limit 时,请保留上述迁移容器 资源配置。配置缺失会导致版本升级时 Migration Job 无法创建 Pod。
第 3 步:创建 Namespace
kubectl create namespace "${NAMESPACE}"
如需使用 ResourceQuota,请在安装 ONES 前完成 Namespace 配额配置。