You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中数据库持久化卷配置与连接问题咨询

在Kubernetes中为Mongo副本集对接持久化卷的实操指南

嗨,你已经迈出了K8s持久化存储的关键一步,接下来咱们一步步把Mongo副本集和你创建的PV对接起来,流程很清晰,跟着来就行!

第一步:确认PV与PVC的绑定关系

你已经创建的PV里指定了claimRef指向default命名空间下的mongo-persisted-storage PVC,首先得把这个PVC创建出来,确保两者能正确绑定:

创建pvc.yaml文件,内容如下:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mongo-persisted-storage
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

执行命令创建PVC:

kubectl create -f pvc.yaml

执行完后用kubectl get pv,pvc检查状态,当PV的STATUS变成Bound就说明绑定成功了。

第二步:为Mongo副本集创建Headless Service

Mongo副本集需要稳定的网络标识,Headless Service正好能满足这个需求,它会为每个StatefulSet Pod分配固定的DNS记录。

创建mongo-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: mongo
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    role: mongo
    environment: test

执行创建命令:

kubectl create -f mongo-service.yaml

第三步:用StatefulSet部署Mongo副本集

Mongo副本集的每个节点需要独立的持久化存储和稳定的身份,StatefulSet是最适合的部署方式。这里我们用volumeClaimTemplates让K8s自动为每个Pod创建对应的PVC(如果你的PV是多个的话,建议去掉PV里的claimRef,让K8s自动绑定)。

创建mongo-statefulset.yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
spec:
  serviceName: "mongo"
  replicas: 3
  selector:
    matchLabels:
      role: mongo
      environment: test
  template:
    metadata:
      labels:
        role: mongo
        environment: test
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mongo
        image: mongo:4.4
        command:
          - mongod
          - "--replSet"
          - rs0
          - "--bind_ip_all"
        ports:
          - containerPort: 27017
        volumeMounts:
          - name: mongo-persisted-storage
            mountPath: /data/db
  volumeClaimTemplates:
  - metadata:
      name: mongo-persisted-storage
    spec:
      storageClassName: manual
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

执行部署命令:

kubectl create -f mongo-statefulset.yaml

等待三个Pod都启动完成,用kubectl get pods -l role=mongo查看状态。

第四步:初始化Mongo副本集

当所有Pod都处于Running状态后,进入第一个Pod初始化副本集:

kubectl exec -it mongo-0 -- mongo

在Mongo Shell里执行初始化命令:

rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "mongo-0.mongo.default.svc.cluster.local:27017" },
    { _id: 1, host: "mongo-1.mongo.default.svc.cluster.local:27017" },
    { _id: 2, host: "mongo-2.mongo.default.svc.cluster.local:27017" }
  ]
})

执行完后用rs.status()查看副本集状态,确认所有节点都正常加入。

几个关键注意点

  • 存储类型优化:你当前用的是hostPath指向/nfs,如果是多节点集群,建议直接用NFS类型的PV(把PV里的hostPath换成nfs配置,指定NFS服务器地址和路径),因为hostPath只能在单个节点访问,副本集Pod调度到其他节点会无法读取存储。
  • 权限问题:Mongo容器运行的用户UID是999,所以要确保存储目录的权限正确,比如在NFS服务器或节点上执行chown 999:999 /你的存储路径,否则Mongo无法写入数据。
  • 多PV适配:如果要给每个副本分配独立的PV,建议创建3个PV,每个容量10Gi,去掉claimRef,让K8s自动为每个StatefulSet Pod的PVC绑定对应的PV。

内容的提问来源于stack exchange,提问作者Philip Kirkbride

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:14:29