K8s 一键部署 MongoDB 的 Replica-Set 和 MongoDB-Express

部署步骤

详细拆解 k8s 部署 mongodb 副本集(Replica-Set)模式相关服务的执行步骤。

1. Secret

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: mongodb-secret
type: Opaque
data:
  mongo-root-username: <base64-encoded-username>
  mongo-root-password: <base64-encoded-password>
  • 优化建议:确保 和 已经正确编码为 Base64 格式。
  • 解释:Secret 用于存储敏感信息,如用户名和密码,以保护这些信息不被直接暴露。

2. ConfigMap

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-init
data:
  init-mongo.js: |
    rs.initiate(
      {
        _id : "rs0",
        members: [
          { _id: 0, host: "mongodb-replica-set-0.mongodb-replica-set:27017" },
          { _id: 1, host: "mongodb-replica-set-1.mongodb-replica-set:27017" },
          { _id: 2, host: "mongodb-replica-set-2.mongodb-replica-set:27017" }
        ]
      }
    )
  • 优化建议:确保 init-mongo.js 脚本中的主机名和端口与 StatefulSet 中的配置一致。
  • 解释:ConfigMap 用于存储配置文件或脚本,这里用于初始化 MongoDB 的副本集。

3. StatefulSet

yaml 复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb-replica-set
spec:
  serviceName: "mongodb-replica-set"
  replicas: 3
  selector:
    matchLabels:
      app: mongodb-replica-set
  template:
    metadata:
      labels:
        app: mongodb-replica-set
    spec:
      containers:
      - name: mongodb
        image: mongo:7.0.14
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongodb-data
          mountPath: /data/db
        - name: mongodb-init-scripts
          mountPath: /docker-entrypoint-initdb.d
        env:
        - name: MONGO_INITDB_ROOT_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-username
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-password
        - name: MONGO_REPLICA_SET_NAME
          value: rs0
  volumeClaimTemplates:
  - metadata:
      name: mongodb-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 20Gi
  volumes:
  - name: mongodb-init-scripts
    configMap:
      name: mongodb-init
  • 优化建议:
    • 确保 volumeClaimTemplates 中的存储请求大小(storage: 20Gi)符合实际需求。
    • 确保 image: mongo:7.0.14 是否最新的稳定版本。
  • 解释:StatefulSet 用于管理有状态的应用程序,如 MongoDB 副本集。它确保每个 Pod 有一个唯一的标识符,并且可以持久化存储数据。

4. Service for MongoDB

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: mongodb-replica-set
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    app: mongodb-replica-set
  • 优化建议:确保 clusterIP: None,这表示这是一个 Headless Service,适用于 StatefulSet
  • 解释:Service 用于定义如何访问 PodHeadless Service 不会分配集群 IP,而是通过 DNS 解析 PodIP 地址。

5. Deployment for Mongo Express

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-express
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo-express
  template:
    metadata:
      labels:
        app: mongo-express
    spec:
      containers:
      - name: mongo-express
        image: mongo-express:1.0.2-20-alpine3.19
        ports:
        - containerPort: 8081
        env:
        - name: ME_CONFIG_MONGODB_URL
          value: "mongodb://<username>:<password>@mongodb-replica-set-0.mongodb-replica-set:27017,mongodb-replica-set-1.mongodb-replica-set:27017,mongodb-replica-set-2.mongodb-replica-set:27017/?replicaSet=rs0"
        - name: ME_CONFIG_MONGODB_ENABLE_ADMIN
          value: "true"
        - name: ME_CONFIG_MONGODB_ADMINUSERNAME
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-username
        - name: ME_CONFIG_MONGODB_ADMINPASSWORD
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-password
  • 优化建议:
    • 确保 ME_CONFIG_MONGODB_URL 中的 <username><password> 替换为实际的用户名和密码。
    • 确保 image: mongo-express:1.0.2-20-alpine3.19 是最新的稳定版本。
  • 解释:Deployment 用于管理无状态的应用程序,如 Mongo Express,它提供了一个 Web 界面来管理和监控 MongoDB

6. Service for Mongo Express

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: mongo-express
spec:
  ports:
  - port: 8081
    targetPort: 8081
  selector:
    app: mongo-express
  type: LoadBalancer
  • 优化建议:确保 type: LoadBalancer 符合你的环境要求,如果你在本地开发环境中,可能需要改为 NodePort
  • 解释:Service 用于定义如何访问 mongo-expressLoadBalancer 类型通常用于云环境中,提供外部访问。

应用配置

可将上述内容保存为一个文件(例如:k8s-mongodb-replicaset.yaml),然后使用以下命令将其应用到 Kubernetes 集群中:

bash 复制代码
kubectl apply -f k8s-mongodb-replicaset.yaml

这样,你就可以在 Kubernetes 中部署一个高可用的 MongoDB 副本集和一个用于管理和监控的 Mongo Express

总结

  • SecretConfigMap 确保了敏感信息和初始化脚本的安全性和正确性。
  • StatefulSetService 确保了 MongoDB 副本集(Replica-Set)的高可用性和数据持久化。
  • DeploymentService 确保了 Mongo Express 的正常运行和外部访问。
相关推荐
Logintern0913 小时前
windows如何设置mongodb的副本集
数据库·windows·mongodb
荣光波比17 小时前
K8S(一)—— 云原生与Kubernetes(K8S)从入门到实践:基础概念与操作全解析
云原生·容器·kubernetes
伞啊伞17 小时前
K8s概念基础(一)
云原生·容器·kubernetes
清风66666617 小时前
基于单片机的蓝牙可调PWM波形发生器设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计
Logintern0917 小时前
只有通过Motor 获取 mongodb的collection,才能正常使用 async with collection.watch()监听集合变更
数据库·mongodb
Python私教18 小时前
5分钟上手 MongoDB:从零安装到第一条数据插入(Windows / macOS / Linux 全平台图解)
windows·mongodb·macos
hello_25018 小时前
k8s基础监控promql
云原生·容器·kubernetes
云和数据.ChenGuang19 小时前
MongoDB 连接时的**认证参数配置错误**
数据库·mongodb
静谧之心20 小时前
在 K8s 上可靠运行 PD 分离推理:RBG 的设计与实现
云原生·容器·golang·kubernetes·开源·pd分离
tryCbest1 天前
Node.js使用Express框架解决中文乱码问题
node.js·express