如何使用 CouchDB Operator 2.5 创建三节点集群并启用 TLS?
解读
在国内金融、运营商、政务云等场景,CouchDB 常被用作离线优先业务(如移动工单、智能柜员机)的中央汇聚节点。面试官抛出该题,核心想验证四点:
- 是否熟悉 CouchDB Operator 2.5 的 CRD 模型(非早期 Helm 方式);
- 能否把“三节点”翻译成 Kubernetes 资源拓扑(StatefulSet+PV+Headless Service);
- 是否理解 TLS 在 CouchDB 中的双重含义:外层 HTTP 层(chttpd)与内层 Erlang 分发层(epmd);
- 是否具备 国产化交付习惯:镜像源、证书管理(国密双证、RSA 混合)、Namespace 级 RBAC、审计日志。
回答时务必先讲“ Operator 生命周期”,再落地到 YAML 片段,最后给出验证命令,体现可交付、可运维、可审计。
知识点
- CouchDB Operator 2.5 CRD:CouchDBCluster/v1beta2,字段
size、tls、certificatesSource; - 三节点仲裁:CouchDB 使用 quorum=2,三节点是最小奇数容错单元;
- TLS 证书链:
– 外层:chttpd 使用标准 X.509,需 SAN 覆盖<clusterName>-<idx>.<svc>.<ns>.svc.cluster.local;
– 内层:Erlang 分发需 sameCN=true 或+PBE密码套件,否则节点无法加入集群; - 国产化镜像:
registry.cn-shanghai.aliyuncs.com/couchdb/couchdb:3.3.2-2.5.0(阿里云 ACR 同步官方镜像,已通过信通院可信云评估); - ** cert-manager 集成**:使用 Cert-Manager 1.12+ 的
Issuer与Certificate对象,满足国密 SM2 双证时需在spec.secretName里同时挂 SM2 与 RSA 证书,CouchDB 会自动选 RSA 做外层、SM2 做内层; - 验证命令:
kubectl exec -it <pod> -- curl -k https://localhost:6984/_up返回"status":"ok"且cluster_nodes三节点均列全。
答案
步骤一:准备命名空间与 RBAC(符合等保 2.0 三级要求)
kubectl create ns couchdb-prod
kubectl label ns couchdb-prod pod-security.kubernetes.io/enforce=restricted
kubectl apply -f https://raw.githubusercontent.com/apache/couchdb-operator/2.5.0/deploy/rbac.yaml
步骤二:安装 cert-manager(若已装可跳过)
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml
步骤三:创建自签 Issuer(生产可换 CA 或国密中间件)
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: couchdb-issuer
namespace: couchdb-prod
spec:
selfSigned: {}
步骤四:生成三节点证书(含全部 SAN)
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: couchdb-tls
namespace: couchdb-prod
spec:
secretName: couchdb-tls-secret
duration: 8760h
renewBefore: 720h
commonName: couchdb
dnsNames:
- couchdb-0.couchdb-svc.couchdb-prod.svc.cluster.local
- couchdb-1.couchdb-svc.couchdb-prod.svc.cluster.local
- couchdb-2.couchdb-svc.couchdb-prod.svc.cluster.local
- couchdb-svc.couchdb-prod.svc.cluster.local
issuerRef:
name: couchdb-issuer
kind: Issuer
步骤五:创建 CouchDBCluster CR(核心字段已加粗)
apiVersion: couchdb.databases.apache.org/v1beta2
kind: CouchDBCluster
metadata:
name: couchdb
namespace: couchdb-prod
spec:
size: 3
image: registry.cn-shanghai.aliyuncs.com/couchdb/couchdb:3.3.2-2.5.0
tls:
enabled: true
certificatesSource: secret
secretName: couchdb-tls-secret
persistentVolumeClaim:
spec:
storageClassName: **cbs-csi** # 腾讯云 CFS 或阿里云 ESSD
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 100Gi
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 4Gi
adminPassword:
secretKeyRef:
name: couchdb-admin
key: password
步骤六:验证
# 等待集群 Ready
kubectl -n couchdb-prod wait --for=condition=Ready couchdbcluster/couchdb --timeout=300s
# 检查节点互认
kubectl -n couchdb-prod exec couchdb-0 -- curl -k https://couchdb-0.couchdb-svc:6984/_membership | jq '.cluster_nodes | length'
# 输出应为 3
# 审计日志确认 TLS 握手成功
kubectl -n couchdb-prod logs couchdb-0 -c couchdb | grep "TLS handshake successful"
拓展思考
- 滚动升级与证书轮换:Operator 2.5 支持
spec.tls.rotateOnExpiry=true,结合 cert-manager 可实现 零中断轮换;若使用国密双证,需保证新证书 SAN 不变,否则 Erlang 节点会拒绝加入。 - 跨 AZ 高可用:在阿里云 ACK 上,给
podAntiAffinity加topologyKey: topology.kubernetes.io/zone,确保三节点分布在 至少两个可用区,同时把storageClass的volumeBindingMode设为WaitForFirstConsumer,避免云盘跨区挂载失败。 - 监控与告警:CouchDB Exporter 2.5 已支持 TLS 采集,在 Prometheus ServiceMonitor 里挂
tlsConfig.secretName,可抓取couchdb_httpd_tls_handshake_errors指标,实现 国密合规场景下的加密可观测。