必须显式设置architecture=replicaset,否则Bitnami MongoDB Chart默认以standalone模式部署,不支持热升级;replicaSet.name须全小写、无下划线、符合DNS子域名规则,且StorageClass需显式指定并确保PVC绑定成功。

能,但必须显式启用副本集模式,否则默认是单节点部署,且后续无法热升级为副本集。
必须设置 architecture=replicaset 才生效
Bitnami 的 mongodb Chart 默认使用 standalone 架构,即使你写了 replicaSet.enabled: true,若没指定 architecture,它仍会忽略副本集配置并启动单节点。
-
helm install命令里必须带--set architecture=replicaset,这是硬性前提 -
values.yaml中也要同步设architecture: replicaset,二者必须一致,否则 Helm 会以命令行参数为准,但容易引发配置错觉 - 如果已用
standalone部署过,不能通过helm upgrade切换到副本集——Chart 不支持该变更,必须helm uninstall后重装
replicaSet.name 必须全小写、无下划线、符合 DNS 子域名规则
MongoDB 副本集名称在内部被用作 DNS 主机名的一部分(如 my-replicaset-0.my-replicaset-headless.default.svc.cluster.local),Kubernetes 对 headless Service 的子域名有严格限制。
- 错误示例:
name: MyReplicaSet(含大写)、name: my_replicaset(含下划线)、name: rs-1(数字开头)都会导致 Pod 启动失败,日志中出现Invalid replica set name或 DNS 解析超时 - 正确示例:
name: rs0、name: prod-mongo、name: mgo - 该字段一旦设定,就不能变更;改名等于重建整个副本集
StorageClass 和 PVC 绑定失败是“无法解析”报错的主因
所谓“无法解析”,90% 指 MongoDB Pod 启动后反复 CrashLoopBackOff,kubectl logs 显示 Failed to resolve hostname 或 connection refused,本质是 StatefulSet 的 Pod 无法挂载 PVC,进而无法初始化数据目录和启动 mongod 进程。
- 检查
kubectl get pvc是否全部处于Bound状态;若为Pending,说明 StorageClass 配置错误或 Provisioner 不可用 - 确保
values.yaml中global.storageClass显式指定为集群中存在的 StorageClass 名(如openebs-jiva-default),留空会触发默认 StorageClass,而很多集群没配默认项 - NFS 类 StorageClass 需额外验证:NFS Server 可达、export 权限开放、Pod 能 mount(可进容器执行
mount -t nfs4测试)
连接验证时别直连 StatefulSet 名,要用 Headless Service
副本集成员间通信和客户端连接都依赖 Headless Service(如 my-mongodb-headless),而非普通 ClusterIP Service。直接连 my-mongodb 会导致路由失败或只连到 Primary,失去副本集语义。
- 连接字符串应为:
mongodb://user:pass@my-mongodb-headless:27017/db?replicaSet=rs0 - 验证副本集状态:进任意 Pod 执行
mongo --eval "rs.status().members.map(m => m.name)",输出应包含全部三个成员(如["my-mongodb-0.my-mongodb-headless.default.svc.cluster.local:27017", ...]) - 若成员显示为
localhost:27017,说明extraFlags里漏了--bind_ip_all或bindIp配置错误,需在values.yaml中补上extraFlags: ["--bind_ip_all"]
副本集不是“开箱即高可用”,每个节点的网络可解析性、存储可挂载性、DNS 域名合规性,三者缺一不可。最容易被跳过的其实是 StorageClass 显式声明和 replicaSet.name 的命名约束——它们不出现在错误日志第一屏,但直接决定整个部署是否能走出 InitContainer 阶段。











