如何使用 CouchDB Operator 2.5 创建三节点集群并启用 TLS?

解读

在国内金融、运营商、政务云等场景,CouchDB 常被用作离线优先业务(如移动工单、智能柜员机)的中央汇聚节点。面试官抛出该题,核心想验证四点:

  1. 是否熟悉 CouchDB Operator 2.5 的 CRD 模型(非早期 Helm 方式);
  2. 能否把“三节点”翻译成 Kubernetes 资源拓扑(StatefulSet+PV+Headless Service);
  3. 是否理解 TLS 在 CouchDB 中的双重含义:外层 HTTP 层(chttpd)与内层 Erlang 分发层(epmd);
  4. 是否具备 国产化交付习惯:镜像源、证书管理(国密双证、RSA 混合)、Namespace 级 RBAC、审计日志。
    回答时务必先讲“ Operator 生命周期”,再落地到 YAML 片段,最后给出验证命令,体现可交付、可运维、可审计。

知识点

  • CouchDB Operator 2.5 CRD:CouchDBCluster/v1beta2,字段 sizetlscertificatesSource
  • 三节点仲裁: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+IssuerCertificate 对象,满足国密 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"

拓展思考

  1. 滚动升级与证书轮换:Operator 2.5 支持 spec.tls.rotateOnExpiry=true,结合 cert-manager 可实现 零中断轮换;若使用国密双证,需保证新证书 SAN 不变,否则 Erlang 节点会拒绝加入。
  2. 跨 AZ 高可用:在阿里云 ACK 上,给 podAntiAffinitytopologyKey: topology.kubernetes.io/zone,确保三节点分布在 至少两个可用区,同时把 storageClassvolumeBindingMode 设为 WaitForFirstConsumer,避免云盘跨区挂载失败。
  3. 监控与告警:CouchDB Exporter 2.5 已支持 TLS 采集,在 Prometheus ServiceMonitor 里挂 tlsConfig.secretName,可抓取 couchdb_httpd_tls_handshake_errors 指标,实现 国密合规场景下的加密可观测。