K8s StatefulSet创建Pod时PV绑定失败问题求助
问题排查与修复建议
1. 修正PV节点亲和性的拼写错误
你的PV配置里,节点亲和性的标签key写错了:kubernets.io/hostname 多了一个e,正确的key是 kubernetes.io/hostname。这是导致PV无法匹配节点的核心原因。
修改PV的nodeAffinity部分:
nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname # 修正拼写错误 operator: In values: - docker-desktop
2. 修复PVC的API版本拼写错误
你的PVC YAML里piVersion是拼写错误,正确写法是apiVersion: v1,这个错误会导致PVC无法正常创建或匹配PV。
修正后的PVC配置:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mongo-pvc spec: storageClassName: mongo-storage resources: requests: storage: 1Gi volumeMode: Filesystem accessModes: - ReadWriteOnce
3. 确认本地存储路径的存在与权限
你使用的是local类型PV,节点上的/mnt/disk/vol1路径必须真实存在,且Kubernetes进程对该路径有读写权限:
- 进入docker-desktop节点:
docker exec -it docker-desktop bash - 创建路径:
mkdir -p /mnt/disk/vol1 - 设置权限:
chmod 777 /mnt/disk/vol1(测试环境临时使用,生产环境建议设置更严格的权限)
4. 重新应用配置并验证绑定状态
修正上述错误后,重新部署所有组件:
kubectl apply -f storageclass.yaml kubectl apply -f pv.yaml kubectl apply -f pvc.yaml kubectl apply -f statefulset.yaml
执行kubectl get pvc检查PVC状态,若状态变为Bound,说明PV与PVC绑定成功,Pod应该能正常调度。
5. StatefulSet使用volumeClaimTemplate的正确姿势
如果要使用volumeClaimTemplate,需删除手动创建的PVC,同时StatefulSet的volumeMounts要直接引用模板名称,无需手动配置volumes:
apiVersion: apps/v1 kind: StatefulSet metadata: name: mongo-statefulset spec: selector: matchLabels: app: mongo-pod serviceName: mongo-clusterip-service replicas: 1 volumeClaimTemplates: - metadata: name: mongo-vctemplate spec: storageClassName: mongo-storage accessModes: - ReadWriteOnce resources: requests: storage: 1Gi template: metadata: labels: app: mongo-pod spec: terminationGracePeriodSeconds: 10 containers: - name: mongo-container image: mongo ports: - containerPort: 27017 volumeMounts: - name: mongo-vctemplate # 引用volumeClaimTemplate的名称 mountPath: /data/db
这种配置下,Kubernetes会自动为每个StatefulSet Pod创建对应的PVC,并匹配到可用的PV。
内容的提问来源于stack exchange,提问作者Vincenzo
相关产品推荐
相关产品推荐

