K8s采用Helm部署mongodb-replica
在现代云原生架构中,将有状态应用(如数据库)容器化并部署在 Kubernetes 上已成为主流趋势。这不仅能带来高可用性、弹性伸缩的优势,还能统一应用的运维管理模式。MongoDB 作为业界领先的 NoSQL 数据库,其副本集(Replica Set)模式是保障数据冗余和高可用的生产标准。
本文将以一个实战项目的视角,详细阐述如何利用 Helm——Kubernetes 的包管理器——在 K8s 集群中快速、规范地部署一套生产可用的 MongoDB 副本集,并集成 Prometheus 监控。
为什么选择 Helm 部署 MongoDB?
- 标准化与可复用:Helm Chart 将部署 MongoDB 所需的所有 K8s 资源(StatefulSet, Service, Secret, ConfigMap, ServiceMonitor 等)打包管理,实现了“基础设施即代码”(IaC),极大提升了部署的标准化和可复用性。
- 简化复杂性:部署一个高可用的 MongoDB 副本集涉及复杂的网络配置(如 Headless Service)、节点间认证、持久化存储以及监控集成。Helm 将这些复杂配置抽象为可配置的参数,让我们可以通过简单的变量设置来完成部署。
- 生命周期管理:Helm 不仅负责安装,还简化了应用的升级、回滚和卸载流程,使得 MongoDB 集群的维护变得轻而易举。
项目准备
为了实现灵活配置与一键部署,我们将项目结构设计为两个核心文件和一个环境变量文件:
.env
: 存储所有可配置的变量,如命名空间、密码、副本数等。install.sh
: 核心部署脚本,负责拉取 Helm Chart 并根据.env
中的配置执行安装或升级。uninstall.sh
(未在文中展示,但与README.md
对应): 负责清理和卸载应用。README.md
: 项目说明与操作指南。
Step 1: 核心配置 (.env
)
这是整个部署的“控制中心”。我们将所有需要定制的参数都提取到这个文件中,以便在不修改部署脚本的情况下,适应不同环境的需求。
1 | 命名空间 |
关键配置解读:
STORAGE_CLASS_NAME
: 指定 MongoDB 数据持久化使用的存储类。请确保您的 K8s 集群中已存在名为nfs
(或您自定义的名称) 的StorageClass
。REPLICA_COUNT
: 副本集节点数,生产环境强烈建议为奇数(如3, 5)以保证选举机制正常工作。MONGO_REPLICA_SET_KEY
: 副本集内部成员间通信的认证密钥,是保障安全的重要配置。在实际部署前,请务必使用openssl rand -base64 756
命令生成一个新的密钥来替换默认值。metrics.*
相关配置:这部分是与 Prometheus Operator 集成的关键,PROMETHEUS_RELEASE_LABEL
需要配置为您的 Prometheus Operator 实例的release
标签值,以便ServiceMonitor
能够被正确发现。
Step 2: 核心安装脚本 (install.sh
)
这个脚本封装了 helm upgrade --install
命令,它是一个幂等操作:如果 Release 不存在,则安装;如果已存在,则升级。这使得初次安装和后续更新都使用同一命令,非常便捷。
1 | !/usr/bin/env bash |
关键 Helm 参数解析:
--set architecture=replicaset
: 明确指定部署模式为副本集。--set-string auth.*
: 将.env
中定义的密码、密钥等安全信息传递给 Chart。使用--set-string
可以避免 Helm 对长字符串进行不必要的类型转换。--set podAntiAffinityPreset=soft
: 设置Pod反亲和性。这是一个非常重要的生产实践,它会“尽力”将 MongoDB 的各个 Pod 调度到不同的物理节点上,从而避免单点故障。--set resources.*
: 为 MongoDB Pod 和监控 Exporter Pod 设置了明确的 CPU 和内存请求(requests)与限制(limits)。这是保障 K8s 集群资源稳定性和服务质量(QoS)的最佳实践。--set metrics.enabled=true
及metrics.serviceMonitor.enabled=true
: 启用内置的 Prometheus Exporter Sidecar,并创建一个ServiceMonitor
CRD 资源,实现与 Prometheus 的自动集成。
部署与验证
遵循 README.md
中的指南,我们可以轻松完成部署和验证。
1. 安装应用
在项目根目录下,直接执行安装脚本:
1 | bash install.sh |
Helm 会开始创建所有必需的 K8s 资源。您可以通过 kubectl get pods -n mongodb -w
来观察 Pod 的启动过程。
2. 验证应用
初步验证
等待所有 Pod 变为 Running
状态后,使用 helm status my-mongodb-replica -n mongodb
或 kubectl get all -n mongodb
查看所有资源是否都已就绪。
进阶验证:连接数据库
为了确认副本集是否正常工作,我们需要从集群内部连接它。
获取 Root 密码:密码被安全地存储在 K8s Secret 中。
1
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace mongodb my-mongodb-replica -o jsonpath="{.data.mongodb-root-password}" | base64 -d)
启动一个临时客户端 Pod:这是在 K8s 中进行内部服务连通性测试的标准方法。
1
kubectl run --namespace mongodb my-mongodb-replica-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:8.0.10-debian-12-r1 --command -- bash
使用
mongosh
连接副本集:在客户端 Pod 的 shell 中,使用由 Headless Service 提供的稳定网络标识符来连接整个副本集。1
mongosh admin --host "my-mongodb-replica-0.my-mongodb-replica-headless.mongodb.svc.cluster.local:27017,my-mongodb-replica-1.my-mongodb-replica-headless.mongodb.svc.cluster.local:27017,my-mongodb-replica-2.my-mongodb-replica-headless.mongodb.svc.cluster.local:27017" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
成功连接并看到副本集的主节点提示符(如
rs0:PRIMARY>
),表示副本集已成功建立。
监控验证
- 访问您的 Prometheus UI,在
Status -> Targets
页面,查找mongodb-exporter
相关的 target,确认其状态为UP
。 - 访问您的 Grafana,导入官方推荐的 Dashboard ID
12079
或20867
。如果能看到 MongoDB 的各项性能指标(如连接数、QPS、内存使用率等)被正确渲染,则证明监控通路已完全打通。
应用生命周期管理
更新
当需要修改配置时(例如,增加副本数、调整资源限制),只需更新 .env
文件中的相应变量,然后重新执行 install.sh
脚本即可。Helm 的幂等性会智能地计算出变更并应用到集群中。
卸载
执行卸载脚本 bash uninstall.sh
(其核心是 helm uninstall
命令) 会删除所有由 Helm 创建的资源。
特别注意:默认情况下,为了防止数据丢失,Helm 不会删除与 StatefulSet 关联的持久卷声明(PVC)。如果需要彻底清理(包括数据),您需要手动删除这些 PVC。
1 | 查看PVC |
总结
通过将 Helm Chart 与清晰的配置文件、自动化的部署脚本相结合,我们构建了一套健壮、可重复且易于维护的 MongoDB 副本集部署方案。该方案不仅覆盖了高可用性、安全性、持久化等生产核心要素,还无缝集成了云原生监控体系。这套方法论充分体现了 DevOps 的精神,将复杂的数据库运维工作转变为简单、可靠的代码化流程,为基于 Kubernetes 的数据驱动型应用提供了坚实的基础。
K8s采用Helm部署mongodb-replica