Kubernetes中MongoDB StatefulSet副本Pending问题排查求助
问题概述
在minikube Kubernetes集群中部署3副本MongoDB StatefulSet时,mongo-0正常运行,mongo-1始终处于Pending状态,执行kubectl describe pod mongo-1 -n ng-mongo得到如下事件:
Warning FailedScheduling 17m (x70 over 6h9m) default-scheduler 0/1 nodes are available: 1 node(s) didn't find available persistent volumes to bind. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
核心原因分析
从配置和错误信息来看,问题出在持久卷(PV)数量不足:
- 仅创建了1个PV(
local-pv,容量10Gi),而StatefulSet通过volumeClaimTemplates会为每个副本自动创建独立的PersistentVolumeClaim(PVC),每个PVC请求2Gi存储。 - 该PV的访问模式为
ReadWriteOnce(RWO),意味着它只能被单个Pod绑定使用。mongo-0已经占用了这个唯一的PV,后续的mongo-1、mongo-2没有可用的PV来绑定,导致调度失败。 - 使用的
local-storage存储类采用kubernetes.io/no-provisioner,属于静态存储,不会自动创建新的PV,必须手动提前准备足够的PV资源。
解决方案
1. 创建足够数量的PV
为3个副本创建3个独立的PV,每个PV满足至少2Gi的存储需求,且都关联到local-storage存储类,同时指定minikube节点的亲和性。示例PV配置如下(复制两份,修改名称和本地路径即可):
apiVersion: v1 kind: PersistentVolume metadata: name: local-pv-1 namespace: ng-mongo spec: capacity: storage: 2Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /tmp/mongo-1 # 每个PV使用不同的本地路径,避免数据冲突 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - minikube
2. 验证PV与PVC绑定状态
创建完成后,执行以下命令检查PV状态:
kubectl get pv -n ng-mongo
等待StatefulSet自动为mongo-1、mongo-2创建的PVC绑定到新的PV,之后Pod即可正常调度启动。
额外清理
YAML中定义的local-claim PVC并未被StatefulSet使用(StatefulSet使用volumeClaimTemplates自动生成PVC),可删除该无用资源:
kubectl delete pvc local-claim -n ng-mongo
内容的提问来源于stack exchange,提问作者Jananath Banuka

