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
相关产品推荐
相关产品推荐

