直接用 MongoDB Community Kubernetes Operator 部署副本集最稳妥,它自动处理初始化、主节点选举、故障转移和 TLS 配置;必须设置全局唯一且合规的 spec.replicaSetName,严格配比 members 与 arbiters,启用 TLS 直通、podAntiAffinity 和 cert-manager 轮换以保障高可用与安全。

直接用 MongoDBCommunity Kubernetes Operator 部署副本集是当前最稳妥的选择——它能自动处理初始化、主节点选举、故障转移和 TLS 配置,避免手写 StatefulSet 时漏掉 mongod --replSet 参数或网络发现逻辑这类致命错误。
必须设置 spec.replicaSetName 且全局唯一
副本集名称不是可选字段,也不是随便起个名字就行。Operator 会用它生成内部 DNS 名称(如 rs0-0.rs0.mongodb.svc.cluster.local),如果多个副本集共用同一个 replicaSetName,DNS 解析会冲突,导致成员无法互相识别。
-
replicaSetName必须符合 MongoDB 命名规则:只能含字母、数字、连字符,不能以连字符开头或结尾,长度不超过 64 字符 - 同一 Kubernetes 命名空间内不能重复;跨命名空间也建议不重名,防止 Ops Manager 或备份工具误识别
- 不要用
rs0这类通用名,推荐带环境和项目前缀,例如prod-order-db-rs
members 和 arbiters 的配比直接影响选举可靠性
副本集至少需要 3 个投票节点才能容忍 1 个节点宕机。但 arbiters 不存储数据,只参与投票——它节省资源,却不能替代数据节点。
- 生产环境建议设
members: 3,arbiters: 0;避免把仲裁节点和主节点部署在同一可用区 - 如果资源受限,可用
members: 2+arbiters: 1,但必须确保仲裁节点与其中一个数据节点物理隔离(不同 Node、不同 AZ) -
arbiters数量必须严格小于members,否则选举可能卡住:Operator 不校验这点,但 mongod 启动时会报错arbiter count must be less than members
外部访问必须绕过 TLS 终止,走直通(TLS passthrough)
多集群或跨 VPC 访问时,如果负载均衡器做了 TLS 终止,mongod 之间建立 replica set 连接会失败——因为 MongoDB 副本集通信要求端到端 TLS 加密,且证书 CN 必须匹配 Pod 的 DNS 名称。
- LoadBalancer 类型服务的注解要明确指定 TLS 直通,例如 AWS ALB 需加
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"和service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "27017" -
spec.externalAccess下必须填externalDomain,比如mongodb-prod.example.com,Operator 会用它生成每个 Pod 的 SAN 证书条目 - 别依赖默认的
publishNotReadyAddresses: false——副本集初始化期间 Pod 就绪探针会反复失败,必须显式设为true,否则 LB 不暴露地址,初始化永远卡住
NodeAffinity 和 PodAntiAffinity 不是可选项,而是高可用底线
默认调度器可能把所有副本集 Pod 调度到同一台 Node 或同一可用区,单点故障风险极高。Operator 支持原生声明式拓扑控制,不用额外写 DaemonSet 或污点。
- 用
spec.podSpec.affinity.nodeAffinity绑定到特定硬件类型(如m5.2xlarge实例标签),避免混部影响 IO 性能 - 必须配置
podAntiAffinity,按topologyKey: topology.kubernetes.io/zone强制分散到不同可用区;若集群只有单可用区,则用topologyKey: kubernetes.io/hostname - 注意:
podAntiAffinity规则对 StatefulSet 的序号敏感,Operator 生成的 Pod 标签含statefulset.kubernetes.io/pod-name,需在 affinity 中引用对应 labelSelector
真正容易被忽略的是证书生命周期——Operator 用 cert-manager 自动轮换,但轮换窗口必须大于 MongoDB 的 sslMode: requireSSL 连接重试间隔,否则滚动更新时会出现短暂连接中断。别只盯着 CR YAML,得查 cert-manager 的 Issuer 配置和 Certificate 资源的 renewBefore 字段。











