Skip to content

MongoDB Kubernetes 部署

Kubernetes 部署基础

Kubernetes 部署优势

  • 自动化容器编排和管理
  • 高可用性和故障恢复
  • 弹性伸缩能力
  • 统一的部署和管理平台
  • 资源利用率优化

MongoDB Kubernetes 部署方式

  • MongoDB Operator:官方推荐的部署方式
  • StatefulSet:手动部署MongoDB副本集
  • Helm Charts:使用Helm包管理工具部署
  • Docker Compose:适用于开发和测试环境

MongoDB Operator 部署

MongoDB Operator 介绍

MongoDB Operator是MongoDB官方提供的Kubernetes Operator,用于在Kubernetes上自动化部署、管理和监控MongoDB集群。

支持的集群类型

  • 副本集:适用于大多数生产环境
  • 分片集群:适用于大规模数据场景
  • 单节点:适用于开发和测试环境

部署MongoDB Operator

1. 安装Operator

bash
# 添加MongoDB Operator仓库
helm repo add mongodb https://mongodb.github.io/helm-charts
helm repo update

# 安装MongoDB Operator
helm install mongodb-operator mongodb/mongodb-operator

2. 部署MongoDB副本集

创建副本集配置文件
yaml
# mongodb-replicaset.yaml
apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
  name: mongodb-replicaset
spec:
  members: 3
  type: ReplicaSet
  version: "6.0.5"
  security:
    authentication:
      modes: ["SCRAM-SHA-256"]
  users:
    - name: admin
      db: admin
      passwordSecretRef:
        name: mongodb-admin-password
      roles:
        - name: clusterAdmin
          db: admin
        - name: userAdminAnyDatabase
          db: admin
        - name: readWriteAnyDatabase
          db: admin
      scramCredentialsSecretName: my-scram
  additionalMongodConfig:
    storage.wiredTiger.engineConfig.journalCompressor: zlib

---
apiVersion: v1
kind: Secret
metadata:
  name: mongodb-admin-password
type: Opaque
stringData:
  password: "your-strong-password"
部署副本集
bash
kubectl apply -f mongodb-replicaset.yaml

3. 验证部署

bash
# 查看Pod状态
kubectl get pods

# 查看副本集状态
kubectl exec -it mongodb-replicaset-0 -c mongod -- mongosh -u admin -p your-strong-password --authenticationDatabase admin --eval "rs.status()"

StatefulSet 部署

StatefulSet 部署优势

  • 稳定的网络标识符
  • 稳定的持久存储
  • 有序的部署和扩展
  • 有序的滚动更新

部署MongoDB副本集

1. 创建存储类

yaml
# storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: mongodb-storage-class
provisioner: kubernetes.io/aws-ebs # 根据云提供商选择
parameters:
  type: gp3
  iopsPerGB: "100"
  throughput: "125"
reclaimPolicy: Retain
allowVolumeExpansion: true

2. 创建StatefulSet配置

yaml
# mongodb-statefulset.yaml
apiVersion: v1
kind: Service
metadata:
  name: mongodb
  labels:
    app: mongodb
spec:
  ports:
  - port: 27017
    name: mongodb
  clusterIP: None
  selector:
    app: mongodb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb
spec:
  serviceName: "mongodb"
  replicas: 3
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - name: mongodb
        image: mongo:6.0.5
        command:
          - mongod
          - --replSet
          - rs0
          - --bind_ip
          - 0.0.0.0
          - --smallfiles
          - --noprealloc
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongodb-data
          mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: mongodb-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "mongodb-storage-class"
      resources:
        requests:
          storage: 10Gi

3. 部署StatefulSet

bash
kubectl apply -f storage-class.yaml
kubectl apply -f mongodb-statefulset.yaml

4. 初始化副本集

bash
# 连接到第一个Pod
kubectl exec -it mongodb-0 -- mongosh

# 初始化副本集
rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongodb-0.mongodb.default.svc.cluster.local:27017" },
    { _id: 1, host: "mongodb-1.mongodb.default.svc.cluster.local:27017" },
    { _id: 2, host: "mongodb-2.mongodb.default.svc.cluster.local:27017" }
  ]
})

Helm Charts 部署

Helm 部署优势

  • 简化部署和管理
  • 版本控制和回滚
  • 配置模板化
  • 易于分享和复用

使用官方Helm Chart部署

1. 安装Helm

bash
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

2. 部署MongoDB

bash
# 添加MongoDB Helm仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# 部署MongoDB副本集
helm install mongodb bitnami/mongodb --set architecture=replicaset --set replicaCount=3

3. 配置持久化存储

bash
helm install mongodb bitnami/mongodb \
  --set architecture=replicaset \
  --set replicaCount=3 \
  --set persistence.storageClass=mongodb-storage-class \
  --set persistence.size=20Gi

网络和安全配置

网络配置

  • Service类型:使用ClusterIP或NodePort
  • 网络策略:配置适当的网络策略限制访问
  • DNS配置:确保Kubernetes DNS正常工作
  • 端口配置:27017(默认MongoDB端口)

安全配置

  • 认证:启用SCRAM-SHA-256认证
  • 授权:配置适当的角色和权限
  • TLS/SSL:启用传输加密
  • Secret管理:使用Kubernetes Secret存储敏感信息
  • Pod安全策略:配置适当的Pod安全策略

监控和告警

监控指标

  • MongoDB指标:操作计数器、连接数、内存使用等
  • Kubernetes指标:Pod状态、资源使用率、网络流量等
  • 存储指标:磁盘使用率、I/O性能等

监控工具

  • Prometheus + Grafana:开源监控解决方案
  • MongoDB Atlas:云服务内置监控
  • Ops Manager:企业级监控解决方案
  • Datadog:第三方监控服务

告警配置

  • CPU和内存使用率:设置适当的阈值
  • 磁盘使用率:避免磁盘空间不足
  • 连接数:防止连接泄漏
  • 复制延迟:确保数据同步正常
  • Pod状态:监控Pod健康状态

备份和恢复

Kubernetes 备份策略

  • VolumeSnapshot:使用Kubernetes VolumeSnapshot API
  • MongoDB原生备份:使用mongodump/mongorestore
  • Operator备份:使用MongoDB Operator的备份功能
  • 第三方工具:使用Velero等备份工具

备份配置示例

yaml
# mongodb-backup.yaml
apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBBackup
metadata:
  name: mongodb-backup
spec:
  clusterResourceName: mongodb-replicaset
  backupSource:
    cluster: cluster0
  storage:
    provider: s3
    s3:
      bucketName: mongodb-backups
      prefix: replicaset
      region: us-east-1
      credentials: my-s3-credentials

性能优化

资源配置优化

  • CPU和内存限制:根据实际需求配置资源限制
  • 存储类型:使用高性能存储(如SSD)
  • 副本集成员分布:跨可用区部署
  • 连接池配置:优化客户端连接池

配置参数优化

  • WiredTiger缓存大小:根据内存配置调整
  • Oplog大小:根据写入量调整
  • 索引配置:创建适当的索引
  • 查询优化:优化慢查询

版本差异

MongoDB 4.4 vs 5.0

  • 5.0版本增强了Kubernetes Operator功能
  • 5.0版本改进了StatefulSet部署支持
  • 5.0版本引入了更多监控指标

MongoDB 5.0 vs 6.0

  • 6.0版本增强了Operator的分片集群支持
  • 6.0版本改进了备份和恢复功能
  • 6.0版本引入了实时性能分析

常见问题(FAQ)

Q1: MongoDB Operator支持哪些Kubernetes版本?

A1: MongoDB Operator支持Kubernetes 1.19及以上版本,建议使用1.21或更高版本以获得最佳体验。

Q2: 如何选择合适的存储类?

A2: 建议使用高性能、低延迟的存储类,如AWS gp3、Azure Premium SSD或GCP Persistent SSD。对于生产环境,建议使用支持快照功能的存储类。

Q3: 如何扩容MongoDB副本集?

A3: 使用MongoDB Operator时,可以直接修改MongoDBCommunity资源的members字段;使用StatefulSet时,可以修改replicas字段。

Q4: 如何升级MongoDB版本?

A4: 使用MongoDB Operator时,可以修改MongoDBCommunity资源的version字段;使用StatefulSet时,可以修改image标签并滚动更新。

Q5: 如何监控MongoDB Kubernetes部署?

A5: 可以使用Prometheus + Grafana监控MongoDB和Kubernetes指标,或使用MongoDB Atlas、Ops Manager等企业级监控解决方案。

Q6: 如何处理MongoDB Pod故障?

A6: Kubernetes会自动重启故障的Pod,MongoDB副本集会自动进行故障转移。对于数据损坏的情况,可能需要从备份恢复。

Q7: 如何配置MongoDB的资源限制?

A7: 可以在Pod spec中配置resources.limits和resources.requests,根据实际需求分配CPU和内存资源。

Q8: 如何确保MongoDB数据安全?

A8: 可以通过以下方式确保数据安全:启用认证和授权、配置TLS/SSL加密、使用Kubernetes Secret管理敏感信息、定期备份数据、配置适当的网络策略。