Clickhouse Kubernetes Operator 实测:哪种方案更适合生产?

本文在 VKE Kubernetes v1.34.1-vke.4 上,对 KubeBlocks、Altinity Operator、ClickHouse 官方 Operator 三条自建路线做了真实集群测试。测试覆盖部署门槛、拓扑支持、Day-2 运维、TLS、备份恢复和监控等能力,适合正在评估 ClickHouse Kubernetes 自建方案的工程师参考。

ClickHouse Cloud 是托管服务路线,本文把它作为"自建还是托管"的参照,不参与三条 Operator 的功能排名。

一、为什么要做这次对比?

把 ClickHouse 跑在 Kubernetes 上,第一步通常并不难。真正拉开差距的,往往是部署之后的一系列工程问题:

  • standalone 和 keeper-backed cluster 分别能否稳定创建;

  • shard / replica 如何扩缩,扩完之后数据和状态能否收敛;

  • 参数修改、重启、停止、启动等 Day-2 操作是否有清晰入口;

  • 备份和恢复能否完成数据级闭环;

  • TLS、监控这些生产高频能力能否稳定落地。

这篇文章关心的不是"某个 YAML 能不能把 Pod 拉起来",而是一个更实际的问题:如果团队要在 Kubernetes 上自建 ClickHouse,哪条路线更接近生产可用。

测试环境如下:

项目 说明
平台 VKE,Kubernetes v1.34.1-vke.4
节点 3 节点,单节点 4c16G
时间 2026 年 4 月
命名空间 kb-systemclickhouse-labaltinity-labch-operator-lab

实测对象如下:

方案 固定版本 / 路径 维护方 证据强度
KubeBlocks ClickHouse v1.0.2 ApeCloud
Altinity Operator for ClickHouse 0.25.6 Altinity
ClickHouse 官方 Operator v0.0.4 ClickHouse 官方

托管路线仅作参考:

方案 固定版本 / 路径 维护方 证据强度
ClickHouse Cloud 官网托管服务入口 ClickHouse 官方 文档和控制台观察

二、先说结论

KubeBlocks 的证据覆盖最完整;Altinity 和 ClickHouse 官方 Operator 都已经进入可用区间,但优势和短板并不相同。

方案 推荐判断 更适合谁 主要风险 / 保留
KubeBlocks 本轮测试范围内证据覆盖最完整 想要完整自建路线、统一 Day-2 接口、重视 backup / restore 闭环的团队 恢复相关资源命名需要控制长度
Altinity keeper-backed 路线和 patch 风格 Day-2 运维已成立 ClickHouse 专项团队,接受以 ClickHouseInstallation 为中心的运维接口 本轮基于 0.25.6 验证,后续版本仍值得跟踪
官方 Operator keeper-backed、TLS、metrics 方向已成立 更偏好上游语义、看重 TLS / metrics 的团队 项目发布时间短;standalone 当前 API 不支持

ClickHouse Cloud 更适合不想自建、希望直接使用托管能力的团队。它属于托管服务维度,不进入三条自建 Operator 的功能排名。

测试方法上,KubeBlocks、Altinity、官方 Operator 都以真实集群实测为准;ClickHouse Cloud 只做文档和控制台形态分析。每个功能点尽量保留输入动作、资源状态变化和 ClickHouse 侧验证结果。

三、部署体验:门槛差异很明显

先看安装阶段的整体结果。

方案 安装入口 结论
KubeBlocks Helm 安装控制面 + 启用 ClickHouse addon 安装路径已验证
Altinity 官方 Helm chart 0.25.6 Operator 与样本集群已验证
官方 Operator 官方 release asset clickhouse-operator.yaml + cert-manager v1.19.2 controller-manager 与样本集群已验证
ClickHouse Cloud 官网托管入口 控制台形态已查看,仅作托管路线参考

KubeBlocks:安装路径完整验证

bash 复制代码
helm repo add kubeblocks https://apecloud.github.io/helm-charts
helm install kubeblocks kubeblocks/kubeblocks \
  --namespace kb-system --create-namespace

kbcli addon enable clickhouse

本轮实际验证时,控制面和 addon 就绪后再创建测试命名空间与 ClickHouse 集群:

bash 复制代码
kubectl create namespace clickhouse-lab

kubectl -n kb-system get pod
kubectl get clusterdefinition clickhouse

# standalone 样本
kubectl apply -f kb-clickhouse-standalone.yaml
kubectl -n clickhouse-lab get cluster kb-clickhouse-standalone
kubectl -n clickhouse-lab get pod,pvc

# keeper-backed 样本
kubectl apply -f kb-clickhouse-ha.yaml
kubectl -n clickhouse-lab get cluster kb-clickhouse-ha-rqld
kubectl -n clickhouse-lab get pod -l app.kubernetes.io/instance=kb-clickhouse-ha-rqld

安装完成后,kubeblocks 主控制器、ClickHouse addon、kubeblocks-dataprotectionStorageProvider/miniominio-clusterminio-clickhouse-backuprepo 都进入可用状态。后续功能测试都基于这条路径展开。

Altinity:Operator 与样本集群已验证

Altinity Operator 固定使用 0.25.6。需要说明的是,release-0.26.0 已在 2026-02-20 发布;读者评估生产方案时,可以继续关注更新版本的变化。

实际安装与核验命令如下:

bash 复制代码
kubectl create namespace altinity-lab

helm repo add altinity https://helm.altinity.com
helm repo update
helm install altinity-clickhouse-operator \
  altinity/altinity-clickhouse-operator \
  --namespace altinity-lab \
  --version 0.25.6

kubectl -n altinity-lab get deploy,pod
kubectl -n altinity-lab get chi,clickhousekeeperinstallation

Operator 启动后开始 watch ClickHouseInstallation / ClickHouseKeeperInstallation。后续 keeper-backed cluster、登录、replicated 样本、scale-in 都验证通过。

ClickHouse 官方 Operator:项目很新,基础路径可用

ClickHouse 官方 Operator 固定使用官方 v0.0.4 release asset clickhouse-operator.yaml。这个项目的第一个 release v0.0.1 发布于 2026-01-29,v0.0.4 发布于 2026-04-17,整体仍处在很早期的产品阶段。因此,文中 Day-2 能力覆盖较少,更适合理解为项目阶段差异,而不是简单归因于设计缺陷。

本轮使用 release manifest 安装 controller,并用 CR 状态确认控制循环已经工作:

bash 复制代码
kubectl create namespace ch-operator-lab

kubectl apply -f clickhouse-operator.yaml
kubectl -n clickhouse-operator-system get deploy,pod

kubectl -n ch-operator-lab get keepercluster,clickhousecluster
kubectl -n ch-operator-lab get pod

安装完成后,clickhouse-operator-controller-manager 正常进入 ClickHouseCluster / KeeperCluster 控制循环。后续 keeper-backed cluster、登录、replicated 样本、scale-in 都验证通过。

ClickHouse Cloud:托管路线,不是另一种 Operator

把 ClickHouse Cloud 放进来,是为了给"自建还是托管"这个决策提供参照。控制台可以看到 SQL ConsoleData sourcesDashboardsBackupsMonitoring 等入口,产品形态明显是 SaaS,而不是 Kubernetes Operator。

不过,ClickHouse Cloud 的产品形态、交付边界和运维责任都与自建 Operator 不同。它在本文中只作为托管路线补充,不参与自建路线排名。

四、功能实测结果

先看总览矩阵。这里写的是最终可落地结论,不展开所有中间排障过程。

功能 KubeBlocks Altinity 官方 Operator
控制面安装 已验证 已验证 已验证
Standalone 创建 已验证 已验证 不支持
Keeper-backed 创建 已验证 已验证 已验证
登录验证 已验证 已验证 已验证
Replicated 样本 已验证 已验证 已验证
Restart / Stop / Start 已验证 已验证 无原生入口
Volume Expansion 已验证 已验证 已验证
TLS 已验证 已验证 已验证
Backup / Restore 已验证 已验证 暂未形成闭环
Prometheus 监控 已验证 已验证 已验证
Day-2 scale 已验证 已验证 已验证
HA switchover 已验证 不支持 不支持
Day-2 API 统一性 OpsRequest patch 风格 patch 风格

4.1 拓扑支持

KubeBlocks 的 kb-clickhouse-standalonekb-clickhouse 都完成了真实创建。Altinity 的 keeper-backed cluster 创建成功;最小 standalone 样本 altinity-proof-s1 也已 Completed,Pod 2/2 Running,并完成登录、TLS 和备份恢复验证。

拓扑验证不是只看 CR 创建成功,而是同时看 CR 状态、Pod 状态和 ClickHouse 内部查询:

bash 复制代码
# KubeBlocks
kubectl -n clickhouse-lab get cluster kb-clickhouse-standalone kb-clickhouse
kubectl -n clickhouse-lab get pod -l app.kubernetes.io/instance=kb-clickhouse

KB_CH_POD=$(kubectl -n clickhouse-lab get pod \
  -l app.kubernetes.io/instance=kb-clickhouse-ha-rqld \
  --no-headers | awk '/clickhouse/ {print $1; exit}')

kubectl -n clickhouse-lab exec -it "${KB_CH_POD}" \
  -c clickhouse -- clickhouse-client \
  --user admin --password password123 \
  --query "SELECT version(), currentUser()"

# Altinity
kubectl -n altinity-lab get chi
kubectl -n altinity-lab get clickhousekeeperinstallation
kubectl -n altinity-lab get pod -l clickhouse.altinity.com/chi

kubectl -n altinity-lab exec -it chi-altinity-proof-s1-standalone-0-0-0 \
  -c clickhouse -- clickhouse-client \
  --user user1 --password qwerty \
  --query "SELECT version(), currentUser()"

# ClickHouse 官方 Operator
kubectl -n ch-operator-lab get keepercluster,clickhousecluster
kubectl -n ch-operator-lab get pod

kubectl -n ch-operator-lab exec -it official-clickhouse-s1-clickhouse-0-0-0 \
  -- clickhouse-client \
  --query "SELECT version()"

官方 Operator 的 standalone 并非测试遗漏,而是当前 API 语义上不成立:ClickHouseCluster 校验要求 spec.keeperClusterRef,当前 release 无法表达无 keeper 的 standalone。官方文档和示例本身也按 no Keeper-less mode 设计,每个 ClickHouseCluster 都要绑定自己的 KeeperCluster。这更接近明确的产品边界,不是实现缺陷。

keeper-backed / replicated 路线方面,三条自建方案都拿到了可用样本。

4.2 Keeper / 高可用相关行为

当前 keeper HA 验证状态如下:

方案 keeper HA 当前证据 现阶段结论
KubeBlocks 已验证 3-keeper 基线、scale-out、指定候选 switchover 和配置优先级恢复 已验证
Altinity keeper-backed 基线已验证 不支持 switchover
官方 Operator keeper-backed 基线已验证 不支持 switchover

KubeBlocks 已验证 3-keeper 基线、scale-out 和 switchover。当前配置下,3-keeper 集群稳定 RunningHorizontalScaling 能收敛到 Succeed。在 kb-clickhouse-ha-rqld 上执行 OpsRequest/kb-clickhouse-ha-rqld-switchover 后,请求收敛到 Succeed,leader 切到指定候选实例,/keeper/config 中三条 server.* priority 也恢复为 1

当时的 keeper 扩容和指定候选切主动作如下:

yaml 复制代码
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: kb-clickhouse-ha-rqld-keeper-scale-out
  namespace: clickhouse-lab
spec:
  clusterName: kb-clickhouse-ha-rqld
  type: HorizontalScaling
  horizontalScaling:
    - componentName: ch-keeper
      scaleOut:
        replicaChanges: 2
bash 复制代码
kubectl apply -f keeper-scale-out.yaml
kubectl -n clickhouse-lab get opsrequest kb-clickhouse-ha-rqld-keeper-scale-out -w
kubectl -n clickhouse-lab get pod -l apps.kubeblocks.io/component-name=ch-keeper
yaml 复制代码
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: kb-clickhouse-ha-rqld-switchover
  namespace: clickhouse-lab
spec:
  clusterName: kb-clickhouse-ha-rqld
  type: Switchover
  switchover:
    - componentName: ch-keeper
      instanceName: kb-clickhouse-ha-rqld-ch-keeper-0
      candidateName: kb-clickhouse-ha-rqld-ch-keeper-1
bash 复制代码
kubectl apply -f keeper-switchover.yaml
kubectl -n clickhouse-lab get opsrequest kb-clickhouse-ha-rqld-switchover -w
kubectl -n clickhouse-lab describe opsrequest kb-clickhouse-ha-rqld-switchover

Altinity 和官方 Operator 都归为"不支持 switchover"。

4.3 弹性扩缩容与 Day-2 动作

KubeBlocks 的 Day-2 scale 已验证完成。vertical scale、scale-out shard 和 scale-in shard 都实际验证通过,请求能够收敛,集群保持 Running

Altinity 拿到了一组 patch 风格 Day-2 证据:keeper-backed CHI restart、stop/start、volume expansion、scale-in(2 -> 1)都已验证通过。官方 Operator 也拿到了 keeper-backed CHI scale-in(2 -> 1)和 volume expansion 证据,但 restart / stop / start 没有原生字段,因此归为"无原生入口"。

KubeBlocks 的 Day-2 操作都落在 OpsRequest 上。下面是 restart、volume expansion 和 shard scale-in 的实际写法:

yaml 复制代码
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: kb-clickhouse-restart
  namespace: clickhouse-lab
spec:
  clusterName: kb-clickhouse
  type: Restart
  restart:
    - componentName: clickhouse
yaml 复制代码
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: kb-clickhouse-volumeexpand
  namespace: clickhouse-lab
spec:
  clusterName: kb-clickhouse
  type: VolumeExpansion
  volumeExpansion:
    - componentName: clickhouse
      volumeClaimTemplates:
        - name: data
          storage: 30Gi
yaml 复制代码
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
  name: kb-clickhouse-scale-in
  namespace: clickhouse-lab
spec:
  clusterName: kb-clickhouse
  type: HorizontalScaling
  horizontalScaling:
    - componentName: clickhouse
      shards: 1

提交后统一用同一组命令观察进度:

bash 复制代码
kubectl apply -f kb-clickhouse-restart.yaml
kubectl -n clickhouse-lab get opsrequest kb-clickhouse-restart -w

kubectl apply -f kb-clickhouse-volumeexpand.yaml
kubectl -n clickhouse-lab get opsrequest kb-clickhouse-volumeexpand -w
kubectl -n clickhouse-lab get pvc

kubectl apply -f kb-clickhouse-scale-in.yaml
kubectl -n clickhouse-lab get opsrequest kb-clickhouse-scale-in -w
kubectl -n clickhouse-lab get cluster kb-clickhouse
kubectl -n clickhouse-lab get pod

Altinity 的 Day-2 操作是直接 patch ClickHouseInstallation 字段:

bash 复制代码
# restart
kubectl -n altinity-lab patch chi altinity-proof \
  --type=merge \
  -p '{"spec":{"restart":"RollingUpdate"}}'

# stop / start
kubectl -n altinity-lab patch chi altinity-proof \
  --type=merge \
  -p '{"spec":{"stop":"1"}}'

kubectl -n altinity-lab patch chi altinity-proof \
  --type=merge \
  -p '{"spec":{"stop":"0"}}'

# scale-in: 2 -> 1
kubectl -n altinity-lab patch chi altinity-proof \
  --type=merge \
  -p '{"spec":{"configuration":{"clusters":[{"name":"s1","layout":{"replicasCount":1}}]}}}'

kubectl -n altinity-lab get chi altinity-proof -w
kubectl -n altinity-lab get pod

官方 Operator 的 scale-in 和 volume expansion 也通过 patch CR 完成:

bash 复制代码
# scale-in: 2 -> 1
kubectl -n ch-operator-lab patch clickhousecluster official-clickhouse-s1 \
  --type=merge \
  -p '{"spec":{"replicas":1}}'

# volume expansion
kubectl -n ch-operator-lab patch clickhousecluster official-clickhouse-s1 \
  --type=merge \
  -p '{"spec":{"dataVolumeClaimSpec":{"resources":{"requests":{"storage":"30Gi"}}}}}'

kubectl -n ch-operator-lab get clickhousecluster official-clickhouse-s1 -w
kubectl -n ch-operator-lab get pod,pvc

三条路线最显著的接口差异是:KubeBlocks 把 Day-2 入口集中到 OpsRequest;Altinity 主要通过 patch ClickHouseInstallation 自身字段完成运维动作;官方 Operator 以 patch ClickHouseCluster 为主,但原生字段暴露不如 Altinity 直接。

已有的 Day-2 耗时数据如下:

能力 KubeBlocks Altinity 官方 Operator
水平 / 拓扑变更入口 OpsRequest patch ClickHouseInstallation patch ClickHouseCluster
重启入口 OpsRequest patch spec.restart=RollingUpdate 无原生入口
Stop / Start 入口 OpsRequest patch spec.stop=1/0 无原生入口
Restart 耗时 ~31s ~34s 不适用
Stop 耗时 ~11s ~13s 不适用
Start 耗时 ~31s ~52s 不适用
Volume expansion 入口 VolumeExpansion OpsRequest patch spec.templates.volumeClaimTemplates[*].spec.resources.requests.storage patch spec.dataVolumeClaimSpec.resources.requests.storage
Volume expansion 耗时 ~28s ~62s ~41s
Scale-in 入口 HorizontalScaling OpsRequestcomponentName=clickhouse, shards=1 patch ClickHouseInstallation.replicasCount patch ClickHouseCluster.replicas
Scale-in 耗时 ~4sOpsRequest 收敛到 Succeed,额外 shard clickhouse-qdm 被移除,Cluster 保持 Running ~6s 内 CHI status 从 hosts=2 缩到 hosts=1;最终单副本收敛受 controller 恢复过程影响,不硬写单一总耗时 ~6s 内只剩单个 ClickHouse pod,约 46s 回到 Ready=True
进度跟踪 OpsRequest ClickHouseInstallation.status + controller 事件 KeeperCluster / ClickHouseCluster.status + controller 事件

4.4 参数配置

参数配置不进入本轮主结论矩阵。三条路线都可以通过各自 CR 或配置文件表达参数,但动态参数变更涉及在线生效范围、重启边界和回滚路径,单独展开会比这篇文章更长。因此,这里只把它作为后续深挖项,不作为本轮选型判断的决定性指标。

4.5 TLS

KubeBlocks 的 TLS 已验证通过。在 chs-tls-fix 上,用 user-provided 证书和 1Gi 内存重新验证后,集群持续 Running。Pod 内执行 clickhouse-client --host localhost --port 9440 --secure --user admin --password password123 登录成功,返回 25.9.7.56 / admin

TLS 验证命令如下:

bash 复制代码
kubectl -n clickhouse-lab get cluster chs-tls-fix
kubectl -n clickhouse-lab get secret chs-tls-fix-clickhouse-tls-certs

TLS_POD=$(kubectl -n clickhouse-lab get pod \
  -l app.kubernetes.io/instance=chs-tls-fix \
  --no-headers | awk '/clickhouse/ {print $1; exit}')

kubectl -n clickhouse-lab exec -it "${TLS_POD}" \
  -c clickhouse -- clickhouse-client \
  --host localhost \
  --port 9440 \
  --secure \
  --user admin \
  --password password123 \
  --query "SELECT version(), currentUser()"

Altinity 的 TLS 也已验证通过。altinity-proof-s1 通过 configuration.files 挂载证书,并启用 tcp_port_secure: 9440 / https_port: 8443。Pod 内执行 clickhouse-client --secure --accept-invalid-certificate --port 9440 --user user1 --password qwerty 登录成功,返回 25.9.7.56 / user1

bash 复制代码
kubectl -n altinity-lab get chi altinity-proof

kubectl -n altinity-lab exec -it chi-altinity-proof-s1-standalone-0-0-0 \
  -c clickhouse -- clickhouse-client \
  --secure \
  --accept-invalid-certificate \
  --port 9440 \
  --user user1 \
  --password qwerty \
  --query "SELECT version(), currentUser()"

官方 Operator 拿到了一组可用的 TLS 证据:在已稳定运行的 official-clickhouse-s1 上开启 TLS,复用 keeper identity 和 cluster secret,手工创建证书 Secret 后重新收敛到 Ready=True。Pod 内执行 clickhouse-client --secure --accept-invalid-certificate --port 9440 登录成功,返回 25.9.7.56

bash 复制代码
kubectl -n ch-operator-lab get secret official-clickhouse-tls
kubectl -n ch-operator-lab get clickhousecluster official-clickhouse-s1

kubectl -n ch-operator-lab exec -it official-clickhouse-s1-clickhouse-0-0-0 \
  -- clickhouse-client \
  --secure \
  --accept-invalid-certificate \
  --port 9440 \
  --query "SELECT version()"

4.6 Backup / Restore

KubeBlocks 的 backup / restore 已完成数据级闭环验证。前提方面,VolumeSnapshot* CRD、snapshot-controller、默认 VolumeSnapshotClasskubeblocks-dataprotection、对象存储 CSI、StorageProvider/miniominio-clusterminio-clickhouse-backuprepo 都已补齐。

standalone full backup kb-clickhouse-standalone-full-backup 已完成。数据恢复验证继续使用 kb-clickhouse-standalone 作为 source,在 restore_proof.rows_v1 中写入固定 5 行,再执行 full backup chs-proof-b1 并恢复到 chs-proof-r1

测试数据写入和备份 CR 创建过程如下:

bash 复制代码
SRC_POD=$(kubectl -n clickhouse-lab get pod \
  -l app.kubernetes.io/instance=kb-clickhouse-standalone \
  --no-headers | awk '/clickhouse/ {print $1; exit}')

kubectl -n clickhouse-lab exec -it "${SRC_POD}" \
  -c clickhouse -- clickhouse-client \
  --user admin --password password123 \
  --multiquery --query "
    CREATE DATABASE IF NOT EXISTS restore_proof;
    DROP TABLE IF EXISTS restore_proof.rows_v1;
    CREATE TABLE restore_proof.rows_v1
    (
      id UInt64,
      value String
    )
    ENGINE = MergeTree
    ORDER BY id;
    INSERT INTO restore_proof.rows_v1 VALUES
      (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e');
    SELECT count(), sum(id), groupArray((id, value)) FROM restore_proof.rows_v1;
  "
yaml 复制代码
apiVersion: dataprotection.kubeblocks.io/v1alpha1
kind: Backup
metadata:
  name: chs-proof-b1
  namespace: clickhouse-lab
spec:
  backupMethod: full
  backupPolicyName: kb-clickhouse-standalone-clickhouse-backup-policy
  deletionPolicy: Delete
bash 复制代码
kubectl apply -f chs-proof-b1.yaml
kubectl -n clickhouse-lab get backup chs-proof-b1 -w
kubectl -n clickhouse-lab describe backup chs-proof-b1

恢复流程中的 preparedatapostready 都进入 Completed,restore cluster 进入 Running,admin 登录验证成功。source 和 restore 两边对 restore_proof.rows_v1 的校验结果完全一致:count()=5sum(id)=15groupArray((id, value)) 也完全相同。

恢复集群通过 restore annotation 创建:

yaml 复制代码
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: chs-proof-r1
  namespace: clickhouse-lab
  annotations:
    kubeblocks.io/restore-from-backup: '{"clickhouse":{"name":"chs-proof-b1","namespace":"clickhouse-lab","volumeRestorePolicy":"Parallel"}}'
spec:
  clusterDef: clickhouse
  topology: standalone
  terminationPolicy: Delete
  shardings:
    - name: clickhouse
      shards: 1
      template:
        name: clickhouse
        componentDef: clickhouse-1
        replicas: 1
        systemAccounts:
          - name: admin
            secretRef:
              name: chs-proof-r1-account
              namespace: clickhouse-lab
        resources:
          requests:
            cpu: "500m"
            memory: 1Gi
          limits:
            cpu: "500m"
            memory: 1Gi
        volumeClaimTemplates:
          - name: data
            spec:
              accessModes: [ReadWriteOnce]
              resources:
                requests:
                  storage: 20Gi
---
apiVersion: v1
kind: Secret
metadata:
  name: chs-proof-r1-account
  namespace: clickhouse-lab
type: Opaque
data:
  password: cGFzc3dvcmQxMjM=
bash 复制代码
kubectl apply -f chs-proof-r1.yaml
kubectl -n clickhouse-lab get restore -w
kubectl -n clickhouse-lab get cluster chs-proof-r1 -w

RESTORE_POD=$(kubectl -n clickhouse-lab get pod \
  -l app.kubernetes.io/instance=chs-proof-r1 \
  --no-headers | awk '/clickhouse/ {print $1; exit}')

kubectl -n clickhouse-lab exec -it "${RESTORE_POD}" \
  -c clickhouse -- clickhouse-client \
  --user admin --password password123 \
  --query "SELECT count(), sum(id), groupArray((id, value)) FROM restore_proof.rows_v1"

TLS 场景也做了同样的数据级闭环:TLS 源集群写入 tls_restore.rows_v1 后,full backup rtls-b3 完成,恢复到独立 TLS 目标集群 rtls-r。恢复端查询结果与源端一致:count()=5sum(id)=15,5 行样本数据完全匹配。

bash 复制代码
kubectl -n clickhouse-lab get backup rtls-b3
kubectl -n clickhouse-lab get cluster rtls-r

kubectl -n clickhouse-lab exec -it rtls-r-clickhouse-phs-0 \
  -c clickhouse -- clickhouse-client \
  --secure \
  --accept-invalid-certificate \
  --host 127.0.0.1 \
  --port 9440 \
  --user admin \
  --password password123 \
  --query "SELECT count(), sum(id) FROM tls_restore.rows_v1"

需要保留的边界是:恢复流程会派生一些 Kubernetes 资源名和 label,集群名、备份名、恢复名过长时可能触发长度限制,需要通过命名规范来规避。就本轮结论而言,KubeBlocks 已经完成普通路径和 TLS 路径的数据级恢复闭环。

Altinity 也完成了数据级闭环验证。

altinity-proof-s1 对接同一套 MinIO 备份仓库,在 altinity_proof.rows_v1 写入 5 行固定数据后执行备份,远端备份列表显示 altinity-proof-b1 已上传,包含 all:10.54KiB,data:817B,arch:10.00KiB,meta:555B

bash 复制代码
kubectl -n altinity-lab exec -it chi-altinity-proof-s1-standalone-0-0-0 \
  -c clickhouse -- clickhouse-client \
  --user user1 --password qwerty \
  --multiquery --query "
    CREATE DATABASE IF NOT EXISTS altinity_proof;
    DROP TABLE IF EXISTS altinity_proof.rows_v1;
    CREATE TABLE altinity_proof.rows_v1
    (
      id UInt64,
      value String
    )
    ENGINE = MergeTree
    ORDER BY id;
    INSERT INTO altinity_proof.rows_v1 VALUES
      (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e');
    SELECT count(), sum(id) FROM altinity_proof.rows_v1;
  "

kubectl -n altinity-lab exec -it chi-altinity-proof-s1-standalone-0-0-0 \
  -c clickhouse-backup -- clickhouse-backup \
  create_remote -t altinity_proof.rows_v1 altinity-proof-b1

kubectl -n altinity-lab exec -it chi-altinity-proof-s1-standalone-0-0-0 \
  -c clickhouse-backup -- clickhouse-backup list remote

随后创建独立恢复集群 altinity-proof-r1,将 altinity-proof-b1 恢复到目标集群。最终恢复端查询结果与源端一致:count()=5sum(id)=15groupArray((id, value)) 也完全相同。

bash 复制代码
kubectl -n altinity-lab exec -it chi-altinity-proof-r1-standalone-0-0-0 \
  -c clickhouse-backup -- clickhouse-backup \
  download -t altinity_proof.rows_v1 altinity-proof-b1

kubectl -n altinity-lab exec -it chi-altinity-proof-r1-standalone-0-0-0 \
  -c clickhouse-backup -- clickhouse-backup \
  restore --schema --data --rm -t altinity_proof.rows_v1 altinity-proof-b1

kubectl -n altinity-lab exec -it chi-altinity-proof-r1-standalone-0-0-0 \
  -c clickhouse -- clickhouse-client \
  --user user1 --password qwerty \
  --query "SELECT count(), sum(id), groupArray((id, value)) FROM altinity_proof.rows_v1"

官方 Operator 在 v0.0.4 中暂未形成 backup / restore 数据级闭环。

4.7 Prometheus 监控

KubeBlocks 拿到了最小正向证据:集群原本没有 PodMonitor CRD,测试中从 Prometheus Operator 官方 v0.90.1 bundle 中提取并安装了 podmonitors.monitoring.coreos.com 这个 CRD,没有额外安装整套 Prometheus 栈。之后在 kb-clickhouse-standalone 上创建 PodMonitor,workload 的 http-metrics:8001/metrics 已成功返回 Prometheus 文本。

KubeBlocks workload metrics 的验证命令如下:

yaml 复制代码
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: kb-clickhouse-pod-monitor
  namespace: clickhouse-lab
spec:
  podMetricsEndpoints:
    - path: /metrics
      port: http-metrics
      scheme: http
  namespaceSelector:
    matchNames:
      - clickhouse-lab
  selector:
    matchLabels:
      app.kubernetes.io/instance: kb-clickhouse-standalone
bash 复制代码
kubectl apply -f kb-clickhouse-pod-monitor.yaml
kubectl -n clickhouse-lab get podmonitor kb-clickhouse-pod-monitor

METRICS_POD=$(kubectl -n clickhouse-lab get pod \
  -l app.kubernetes.io/instance=kb-clickhouse-standalone \
  --no-headers | awk '/clickhouse/ {print $1; exit}')

kubectl -n clickhouse-lab port-forward "pod/${METRICS_POD}" 8001:8001
curl -s localhost:8001/metrics | head

Altinity 的 Prometheus 监控已验证。PodMonitor/altinity-operator-pod-monitor 创建成功,altinity-clickhouse-operator-metrics:9999/metrics 已返回 Prometheus 文本;上游 README 和文档也给出了 ClickHouse workload metrics 路线。

bash 复制代码
kubectl -n altinity-lab get podmonitor altinity-operator-pod-monitor
kubectl -n altinity-lab port-forward deploy/altinity-clickhouse-operator 9999:9999
curl -s localhost:9999/metrics | head

官方 Operator 也完成了 Prometheus 验证:PodMonitor/official-clickhouse-pod-monitor 创建成功,official-clickhouse-s1 workload 的 :9363/metrics 可抓,controller 自身的 clickhouse-operator-metrics-service:8080/metrics 也已返回 Prometheus 文本。

bash 复制代码
kubectl -n ch-operator-lab get podmonitor official-clickhouse-pod-monitor
kubectl -n ch-operator-lab port-forward pod/official-clickhouse-s1-clickhouse-0-0-0 9363:9363
curl -s localhost:9363/metrics | head

kubectl -n clickhouse-operator-system port-forward \
  service/clickhouse-operator-metrics-service 8080:8080
curl -s localhost:8080/metrics | head

五、综合对比

下表只比较三条自建路线。ClickHouse Cloud 是托管服务,不参与自建功能对比。

功能 KubeBlocks Altinity 官方 Operator
控制面安装 已验证 已验证 已验证
Standalone 创建 已验证 已验证 不支持
Keeper-backed 创建 已验证 已验证 已验证
登录验证 已验证 已验证 已验证
Replicated 样本 已验证 已验证 已验证
Restart / Stop / Start 已验证 已验证 无原生入口
Volume expansion 已验证 已验证 已验证
TLS 已验证 已验证 已验证
Backup / Restore 已验证 已验证 暂未形成闭环
PodMonitor / Metrics 已验证 已验证 已验证
Day-2 scale 已验证 已验证 已验证
HA switchover 已验证 不支持 不支持

这张表看的是各方案在本轮评测中的最终结论,不表示三条路线在每一项上的证据强度完全一样。比如,KubeBlocks 和 Altinity 都完成了数据级恢复验证,但两者暴露给用户的入口和自动化程度并不完全相同。

方案 证据强度 关键词摘要 主要风险 最终判断
KubeBlocks install、双拓扑、SQL、restart、stop/start、扩容、switchover、TLS、监控、backup / restore 恢复相关资源命名需要控制长度 本轮测试范围内证据覆盖最完整;backup / restore 已做数据级校验;keeper switchover 与 Day-2 scale 已验证
Altinity install、standalone、keeper、replicated、scale-in、restart、stop/start、扩容、TLS、Prometheus、backup / restore 本轮基于 0.25.6 验证,后续版本仍值得跟踪 standalone 和 keeper-backed 使用路径都已成立;TLS 和 Prometheus 已验证通过;backup / restore 已做数据级校验
官方 Operator install、keeper、replicated、scale-in、扩容、TLS、workload metrics 项目发布时间很短;当前 release 要求 keeperClusterRef keeper-backed 使用路径已成立;TLS / metrics 已验证;standalone 在当前 API 下不成立

从现有证据看,三条路线的差异可以压缩成三句话:

  • KubeBlocks 的覆盖面最广,backup / restore 是平台侧 API 闭环。

  • Altinity 的 standalone 和 keeper-backed 路线都能真实工作,TLS 和备份恢复也已验证通过。

  • 官方 Operator 拿到了 keeper-backed、TLS 和 metrics 的正向证据,但项目仍处在早期,Day-2 API 和 backup / restore 路线还不够完整。

六、什么场景选什么?

先看速查表:

你的情况 推荐优先评估
多数据库统一平台 + 需要平台侧 backup / restore API KubeBlocks
ClickHouse 专项团队 + 接受 patch 风格运维 Altinity
偏好上游语义 + 看重 TLS / metrics 官方 Operator
不想自建,只关心托管 ClickHouse Cloud

如果你要的是一条覆盖面最完整、接口最统一、最像平台产品的自建路线,优先评估 KubeBlocks。它最大的优势不是"最早验证通过",而是 backup / restore 已经通过平台侧 API 拿到数据级闭环,restart、stop/start、volume expansion、监控等能力也都完成了验证。

如果你是 ClickHouse 专项团队,接受以 ClickHouseInstallation 为中心的 CR 模型,并且更看重 patch 风格 Day-2 动作,Altinity 已经进入值得认真评估的区间。它的问题不在 keeper-backed 基线,也不在 TLS 或备份恢复能力;主要保留在统一平台入口和跨数据库运维抽象上。

如果你更偏好上游语义,同时看重 TLS / metrics 这两条线,官方 Operator 已经具备继续深挖的价值。当前需要注意的是:项目发布时间还很短,release 仍停在 v0.0.x,standalone 在当前 API 下不成立,整体能力还在快速补齐阶段。

ClickHouse Cloud 应该被看作托管路线,而不是"另一个更省事的 Operator"。更合适的比较方式,是把它放在"托管 vs 自建"的框架里单独分析,而不是放进这篇自建路线评测的同一套功能矩阵里。

七、结语

截至 2026 年 4 月,三条自建路线都拿到了真实业务层验证。本文不想把问题简化成"谁第一、谁第二",更准确的结论是:每条路线都已经有可用部分,但证据强度、接口形态和生产覆盖面不同。

KubeBlocks 在本文测试范围内覆盖面最完整。双拓扑、SQL、restart、stop/start、扩容、switchover、监控和 backup / restore 都已拿到直接证据,其中 backup / restore 做到了数据级闭环,TLS 也已完成验证。

Altinity 和官方 Operator 不能简单归为"并列第二"。Altinity 的 patch 风格 Day-2 动作、TLS、Prometheus 和备份恢复都已经拿到正向证据;它的主要保留是统一平台入口和跨数据库运维抽象不如 KubeBlocks 完整。官方 Operator 已经验证 keeper-backed、TLS 和 metrics,但项目太新,standalone 也不在当前 API 边界内。

现在能成立的判断是:KubeBlocks 在本文场景里证据最完整;Altinity 和官方 Operator 都已经进入可用区间,但不能把"可用区间"直接写成同一强度的支持结论。backup / restore 仍然是三条路线差异最大的功能项,差异不只在能不能恢复数据,也在恢复入口、自动化程度和平台化程度。

测试时间:2026 年 4 月 参考:KubeBlocks 文档 / Altinity Operator GitHub / ClickHouse 官方 Operator GitHub

开源仓库:github.com/apecloud/ku...

详细文档和快速开始指南:kubeblocks.com/addons/clic...

相关推荐
2501_921939262 小时前
MHA高可用
数据库·mysql
彩色的黑'''2 小时前
[root@localhost ~]#,Linux系统的命令提示符为啥现在变成-bash-4.2#了,哪里设置的
linux·运维·bash
树下水月2 小时前
文件分片上传接口(Easyswoole)被nginx拦截,并返回状态码400和408的抓包排查过程
运维·nginx
_Evan_Yao2 小时前
MySQL 基础:SELECT、WHERE、JOIN 的第一次使用
数据库·mysql
南境十里·墨染春水3 小时前
linux学习进展 shell编程
linux·运维·学习
weixin_444012933 小时前
c++如何将std--vector直接DUMP到二进制文件_指针地址直写【附代码】
jvm·数据库·python
woxihuan1234563 小时前
Go语言中--=运算符详解:位右移赋值操作的原理与应用
jvm·数据库·python
goyeer3 小时前
【ITIL4】32服务实践 - 问题管理(Problem Management)
linux·运维·服务器·企业数字化·it管理·itil·it治理
java1234_小锋3 小时前
SpringBoot为什么要禁止循环依赖?
java·数据库·spring boot