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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:10:41