ClickHouseCluster 配置
基本配置
副本和分片
- 副本:每个分片中的 ClickHouse 实例数 (用于高可用)
- 分片:水平分片的数量 (用于扩缩容)
replicas: 3、shards: 2 的集群将总共创建 6 个 ClickHouse pod (容器组) 。
Keeper 集成
keeperClusterRef.namespace 时,operator 必须同时监听这两个命名空间。如果配置了 WATCH_NAMESPACE,请将 ClickHouse 和 Keeper 所在的命名空间都包含在该列表中。
KeeperCluster 配置
存储配置
dataVolumeClaimSpec (标准 Kubernetes
PersistentVolumeClaimSpec) 配置持久化存储。Operator 会将其转换为每个副本对应的 PersistentVolumeClaim,
并将其挂载到数据路径 /var/lib/clickhouse:
仅当底层存储类支持卷扩容时,Operator 才能修改现有的 PVC。
集群域
spec.clusterDomain 用于设置 operator 在构建并写入 ClickHouse server
配置的 pod (容器组) 完全限定主机名时所使用的 Kubernetes DNS 后缀。默认值为 cluster.local,并且在
ClickHouseCluster 和 KeeperCluster 中都可用。
<pod>.<headless-service>.<namespace>.svc.<clusterDomain>。该后缀会传递到
生成配置的两个部分中:
- 在
ClickHouseCluster中,其值会用于remote_servers里的副本主机名 (跨副本和Distributed查询) 。 - 在
KeeperCluster中,其值会用于构建 ClickHouse 用于协调的 Keeper 节点主机名。
仅当你的集群中
kubelet 节点代理使用的 --cluster-domain
不是 cluster.local 时,才应覆盖此值。如果该值与实际的集群域不一致,
ClickHouse 将无法解析 Keeper 和副本主机名——协调以及
Distributed 查询都会因 DNS 解析错误而失败。请在
ClickHouseCluster 及其引用的 KeeperCluster 中设置相同的值。多磁盘 (JBOD) 存储
additionalVolumeClaimTemplates 会为每个 ClickHouse 副本挂载额外磁盘;而要使用这些磁盘,仍必须配置主 dataVolumeClaimSpec。
每一项都是一个 PVC 模板——即一个 metadata.name 加上一个 PVC spec。
这些磁盘的协调方式与主数据磁盘完全相同——都作为 StatefulSet 的 volumeClaimTemplates——因此 StatefulSet 控制器会为每个副本创建并保留一个 PVC,名称为 <name>-<statefulset>-0。
/var/lib/clickhouse/disks/<name>,并将其添加到自动生成的 ClickHouse 存储配置中。
名称中的连字符在 ClickHouse 的磁盘标识符中会转换为下划线;挂载路径则保留原始名称。
主数据磁盘和每个附加磁盘都会被放入 default 存储策略中的同一个卷,因此 ClickHouse 会以轮询方式将新的数据分区片段分布到所有这些磁盘上。
可用容量等于所有磁盘容量之和,且每个未设置自身 storage_policy 的表 (包括 system.* 表) 都会使用这组组合存储。
PVC 名称必须匹配
^[a-z]([-a-z0-9]*[a-z0-9])?$,并且不得与主数据卷名称冲突。
与主数据磁盘一样,附加磁盘集合在创建时即固定:创建后添加、删除或重命名条目都会被拒绝。
与主数据磁盘一样,删除集群时会保留附加 PVC。
如果存储类支持扩容,则可以扩展现有条目的存储大小。集群域
spec.clusterDomain 用于设置 operator 在构建其写入 ClickHouse server
配置中的 pod (容器组) 完全限定主机名时所使用的 Kubernetes DNS 后缀。
其默认值为 cluster.local,并且 ClickHouseCluster 和 KeeperCluster
都提供了该字段。
<pod>.<headless-service>.<namespace>.svc.<clusterDomain>。该后缀会传入
生成配置中的两个部分:
- 对于
ClickHouseCluster,其值会用于remote_servers中的副本主机名 (用于跨副本和Distributed查询) 。 - 对于
KeeperCluster,其值会用于构建 Keeper 节点主机名, ClickHouse 会使用这些主机名进行协调。
只有在集群的
kubelet 节点代理 使用了非 cluster.local 的 --cluster-domain
时,才应覆盖此值。如果该值与实际集群域不一致,
ClickHouse 将无法解析 Keeper 和副本主机名——协调以及
Distributed 查询都会因 DNS 解析错误而失败。请在
ClickHouseCluster 及其引用的 KeeperCluster 上设置相同的值。pod (容器组) 配置
自动拓扑分散与亲和性
确保您的 Kubernetes 集群在不同可用区中具备足够的节点,以满足分布约束要求。
手动配置
pod (容器组) 中断预算
默认值
apply,也能避免意外丢失仲裁。
对于一个包含 3 个分片且
replicas: 3 的 ClickHouseCluster,operator 会创建 3 个 PDB,每个分片 1 个,且每个都设置为 minAvailable: 1。
覆盖默认设置
spec.podDisruptionBudget 覆盖 minAvailable 或 maxUnavailable (两者只能指定一个) :
maxUnavailable 形式:
unhealthyPodEvictionPolicy 字段传递到生成的 PDB 中——当你需要允许仍处于 NotReady 状态的 pod (容器组) 被驱逐时,这会很有用:
策略
spec.podDisruptionBudget.policy 允许你选择 operator 以多大力度管理 PDB:
示例——在开发集群上完全禁用 PDB 管理:
集群范围内停用
ENABLE_PDB 环境变量,在整个集群范围内停用 PDB 管理。设置 ENABLE_PDB=false 后,无论 spec.podDisruptionBudget.policy 如何,operator 都会跳过 所有 ClickHouseCluster 和 KeeperCluster 的 PDB reconcile 步骤,并且完全不监视 PodDisruptionBudget 资源。因此,operator 的 ServiceAccount 无需具备 poddisruptionbudgets.policy/v1 的 RBAC 权限;当 operator 以受限的 ServiceAccount 运行,且该账户刻意不包含这些权限时,这一点尤其有用。
容器配置
自定义镜像
容器资源
环境变量
卷挂载
可以为同一个
mountPath 指定多个卷挂载。
Operator 会将所有已指定的挂载创建为一个投影卷。TLS/SSL 配置
配置安全端点
SSL 证书 Secret 格式
tls.crt- PEM 编码的服务器证书tls.key- PEM 编码的私钥
此格式兼容由 cert-manager 生成的证书。
通过 TLS 进行 ClickHouse-Keeper 通信
caBundle 来验证 Keeper 节点证书。
要信任私有 CA (例如自签名 CA 或内部 CA) ,请提供自定义 CA 证书包引用:
外部 Secret
spec.externalSecret 将 operator 指向一个预先创建的 Secret:
这里引用的 Secret 必须与 ClickHouseCluster 位于同一命名空间。该 operator 绝不会删除并非由其创建的 Secret。
必需的键
一个完整的 Secret 如下所示:
策略:Observe 与 Manage
spec.externalSecret.policy 用于控制 Operator 如何处理缺失的必需键:
即使设置了
policy: Manage,该 Secret 也必须已存在于命名空间中——Operator 绝不会自行创建 Secret,它只会将生成的键写入现有的 Secret。 如果引用的 Secret 不存在,则无论采用哪种 policy,协调都会因 ExternalSecretNotFound 而被阻塞。Observe。当你希望实现自给自足的引导,同时仍保留对 Secret 对象本身的所有权 (例如为了备份) 时,请选择 Manage。
状态条件和故障排查
ClickHouseCluster.status.conditions 中暴露 ExternalSecretValid 条件。协调过程看起来卡住时,请检查它:
当 Secret 无效时,operator 会将协调重新入队,因此一旦补齐缺失的键,下一次协调就会自动生效——无需重启 Pod (容器组) 。
所需键的集合取决于当前运行的 ClickHouse 版本。只有在 operator 的版本探测检测到 ClickHouse
25.12 或更高版本后,才会校验 named-collections-key。在较旧版本中,Secret 可以不包含该键。附加端口
8123 HTTP、9000 native、9009 interserver、9001 management、9363 Prometheus 指标,以及启用 TLS 时对应的 8443/9440 TLS 端口变体。若要让 ClickHouse 监听更多协议 (如 MySQL、PostgreSQL、gRPC 或其他自定义端口) ,请在 spec.additionalPorts 中声明:
containerPorts 和无头 Service 中。完整示例见 examples/custom_protocols.yaml。
端到端示例:MySQL wire 协议
9004 上对外暴露 ClickHouse:
字段约束
保留端口和名称
additionalPorts 条目。所有与 TLS 相关的端口都会被无条件保留,以确保后续切换 spec.settings.tls.enabled 时,不会破坏原本有效的集群。
以下名称也会被拒绝——它们是 operator 的内部协议类型标识符 (而非便于人工阅读的别名) :
被拒绝的请求会产生如下错误:
版本探测与升级通道
- 版本报告 — 对于
ClickHouseCluster,一个 KubernetesJob会将容器镜像运行一次,以检测当前运行的 ClickHouse 版本;对于KeeperCluster,operator 会从正在运行的副本中读取由 server 上报的版本。检测到的版本会记录到.status.version中,并用于其他协调步骤 (例如,名为外部 Secret的 named-collections key 仅在 ClickHouse25.12及以上版本中才需要) 。 - 升级通道 — 定期检查公开的 ClickHouse 发布源 (
https://clickhouse.com/data/version_date.tsv) 。operator 会通过VersionUpgradedstatus condition 报告是否有新版本可用。它绝不会自行升级 cluster——镜像标签始终由用户控制。
选择发布渠道
spec.upgradeChannel 用于指定 operator 要对照比较的上游发行版集合。ClickHouseCluster 和 KeeperCluster 都有这个相同的字段。
^(lts|stable|\d+\.\d+)?$ 验证) :
对于生产环境,通常更建议将通道固定为明确的
<major>.<minor> (例如 25.8) 。这样可以把集群锁定在预期的 major 发行线上,并且当某个副本因某种原因漂移到其他 major 版本时,Operator 会显示 WrongReleaseChannel 警告——这一点在镜像通过摘要 (@sha256:...) 而不是便于人类阅读的标签引用时尤其重要。对于不担心 major 版本跳变的开发集群,默认的空值也完全适用。
状态条件
可使用以下方式检查它们:
覆盖版本探测 Job
ClickHouseCluster。KeeperCluster 不再运行版本探测 Job——它的版本会直接从正在运行的 Keeper 副本中读取——因此 spec.versionProbeTemplate 已弃用,在那里不会产生任何效果。
该探测是通过一个常规的 Kubernetes Job 实现的。如果你的集群设置了准入策略,要求指定的 Tolerations、节点选择器或安全上下文,或者你想限制已完成的探测 Job 保留的时间,可以通过 spec.versionProbeTemplate 覆盖该模板:
version-probe 是 operator 的默认名称——containers: 下对应的条目会按名称与其匹配,因此 operator 会在默认配置的基础上,将用户提供的字段深度合并进去。
Operator 级别的控制
在隔离网络环境中,或者不允许访问
clickhouse.com 出站流量时,请设置 --disable-version-update-checks=true。
ClickHouse 设置
默认用户密码
spec.settings.defaultUserPassword 用于为内置 default
用户设置密码。请提供你创建的 Secret (推荐) 或 ConfigMap 中某个键的值,
而不要直接将密码内联写在 CR 中:
secret 或 configMap 其中之一,并且两者都必须同时包含 name (对象)
和 key (保存密码的条目) 。
密码类型
passwordType 用于告知 ClickHouse 如何解析该值。其默认值为
password (明文) ;其他可选项为哈希形式,例如
password_sha256_hex 和 password_double_sha1_hex。建议优先使用哈希类型,以避免
存储 明文。完整列表请参见
ClickHouse user settings。
使用 Secret 的完整示例
使用
passwordType: password 时,pod (容器组) 内的 clickhouse-client 会配置
为使用该密码,这样在调试时会更方便。使用 ConfigMap
password_sha256_hex 摘要:
不要将明文密码放在 ConfigMap 中。任何明文
(
passwordType: password) 值都应使用 Secret。配置中的自定义用户
数据库同步
服务器日志
spec.settings.logger 配置 ClickHouse 服务器日志。每个字段都是可选的,并且都有安全的默认值,因此即使你从未改动过,集群也会默认以 trace 级别同时将日志输出到容器控制台和磁盘上的轮转文件。
operator 始终会保持控制台日志开启,以确保
kubectl logs 可用;当 logToFile 为 true 时,还会额外启用文件日志。使用默认值的集群会生成如下 logger 块:
spec.settings.logger 块也适用于 KeeperCluster;不过,operator 会改为将日志文件写入 /var/log/clickhouse-keeper/。
无论
logToFile 如何设置,控制台日志始终保持开启,因此即使禁用文件日志,kubectl logs 仍可正常使用。将日志发送到可解析 JSON 的结构化日志存储时,请设置 jsonLogs: true。自定义配置
内嵌额外配置
extraConfig 添加自定义的 ClickHouse 配置:
有用链接:
嵌入式附加用户配置
extraUsersConfig 指定额外的 ClickHouse 用户配置。这对于直接在集群规范中定义用户、profile、配额和授权非常有用。
extraUsersConfig 存储在 k8s 的 ConfigMap 对象中。请避免在其中以明文形式存放 secret。