spec.settings.tls 的按字段参考说明,请参阅
配置 → TLS/SSL 配置
和 API 参考文档。
前置条件
- 由 Operator 管理的正在运行中的 ClickHouse 集群 (参见 简介) 。
- 集群中已安装 cert-manager。
- 具有访问集群命名空间的
kubectl权限。
Secret。推荐使用 cert-manager 生成并轮换该 Secret,但任何能够按预期格式写入 Secret 的工具都可以。
operator 要求的证书格式
spec.settings.tls.serverCertSecret 指向一个包含服务器密钥对的 Secret,即可启用 TLS:
这正是 cert-manager 为
Certificate 资源写入的布局,因此
无需进行转换。operator 会将该密钥对挂载到每个 pod (容器组) 的
/etc/clickhouse-server/tls/ 路径下,并将其配置到 ClickHouse 的 openSSL 中。
当
tls.enabled: true 时,serverCertSecret 是必填项。验证
webhook 会拒绝启用了 TLS 却未设置该项的集群,也会在
未设置 enabled: true 的情况下拒绝 required: true。1
使用 cert-manager 引导 CA
最容易复现的设置方式是使用自签名 CA,再由它签发服务器
证书。这样你就能获得一个稳定的 在生产环境中,请将自签名引导签发方替换为你实际使用的签发方 (企业 CA、Vault、ACME 等) 。只有步骤 2 会发生变化——集群连接方式
完全相同。
ca.crt,供客户端信任。2
签发服务器证书
从 CA 签发方申请一个叶子证书。cert-manager 会创建名为
dnsNames 必须覆盖
客户端访问这些 pod (容器组) 时使用的地址。Operator 会创建一个名为
<cluster-name>-clickhouse-headless 的单个 无头 Service,并且每个副本 pod (容器组) 都可通过
<cluster-name>-clickhouse-<shard>-<index>-0.<cluster-name>-clickhouse-headless.<namespace>.svc.cluster.local 进行访问。
对该无头 Service 域名使用通配符即可覆盖所有副本:Operator 不会创建集群级 (负载均衡) 的 Service。如果你
想要一个可供连接的稳定单一端点,请自行创建一个选择该集群的 Pod (容器组) 的
ClusterIP Service,
并将其 DNS name 添加到上面的 dnsNames 中。clickhouse-cert 的 Secret,其中包含 tls.crt、tls.key 和
ca.crt,并会在证书到期前刷新它。请确认它已存在:3
为集群启用 TLS
将集群指向该 Secret:
Operator 的作用
当设置tls.enabled: true 时,Operator 会:- 在每个 pod (容器组) 和无头 Service 上开放安全端口:
9440(原生 TLS) 和8443(HTTPS) 。这些端口会与现有端口一并添加。 - 将 Secret 挂载 到
/etc/clickhouse-server/tls/,并生成 ClickHouse 的openSSL配置块,其中包含verificationMode: relaxed、disableProtocols: sslv2,sslv3和preferServerCiphers: true。这些都是 默认值——如需覆盖,请参见自定义 TLS 设置。
required: true 时,Operator 还会:- 移除不安全端口
9000(原生) 和8123(HTTP) ——这样就只保留 TLS 版本,因此明文客户端将无法再连接。 - 将 pod (容器组) 的 liveness probe 切换到安全的原生端口
9440,这样即使 没有明文 listener,健康检查仍可正常工作。
TLS 端口
8443 和 9440 会被 webhook 无条件
保留,即使 TLS 关闭时也是如此,因此之后切换 tls.enabled 时绝不会与
spec.additionalPorts 条目发生冲突。请参见
Configuration → additionalPorts。4
通过 TLS 连接
设置 HTTPS (端口 直接从 Secret 中获取
required: true 后,客户端必须使用安全端口并信任该 CA。通过
无头 Service 访问特定的副本 pod (容器组) (如果你创建了自己的 ClusterIP
Service,也可以通过它访问) 。原生协议 (clickhouse-client,端口 9440) :8443) :ca.crt,用于本地测试:加密 Keeper 流量
KeeperCluster 上单独启用——为 Keeper
service 签发证书 (步骤 1–2,使用 Keeper service 的 dnsNames) ,并引用该证书:
2281 上开放其安全客户端端口。一旦 Keeper 启用 TLS,ClickHouse 集群
会自动通过 TLS 连接到它——无需在
ClickHouseCluster 端进行额外设置。ClickHouse 会根据系统
信任存储以及你配置的任何 caBundle 来验证 Keeper 证书。
自定义 CA 证书包
caBundle:
openSSL 客户端信任存储
(caConfig) 中。系统信任存储仍会继续生效 —— 你的私有 CA 会在额外信任
公网根证书的同时一并被信任,因此到公网端点的连接仍可正常工作。对于
自签名设置,请将 caBundle 指向 cert-manager 写入的同一个 Secret 中 ca.crt 键
(如 cluster_with_ssl 示例所示) 。
自定义 TLS 设置
openSSL 块只是默认配置,并非上限。它会被写入主 server configuration;spec.settings.extraConfig 下的任何内容都会渲染到
config.d/99-extra-config.yaml,而 ClickHouse 会在最后进行 merge——因此会覆盖
生成的值。
如果要进一步加固这些默认设置——例如,要求严格的对等端验证,并将
最低 protocol 提高到 TLS 1.2——请设置你想修改的 openSSL.server 配置项:
openSSL 服务器设置
,extraConfig 的合并方式请参阅
Configuration → 嵌入式额外配置。
验证与排查故障
另请参阅
- 配置 → TLS/SSL 配置 — 字段参考
- 配置 →
additionalPorts— 保留端口 - API 参考文档 → ClusterTLSSpec
openSSL服务器设置 — 可通过extraConfig覆盖的 TLS 选项