PersistentVolumeClaim无法匹配可用PersistentVolume问题求助
PV 无法与 PVC 绑定问题排查
已创建的持久化卷(PV)配置
$ kubectl get pv example-pv -o yaml apiVersion: v1 kind: PersistentVolume metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"example-pv"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"10Gi"},"local":{"path":"/var/k8s-volumes/first"},"nodeAffinity":{"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/hostname","operator":"In","values":["rke2-server-node-1"]}]}]}},"persistentVolumeReclaimPolicy":"Delete","storageClassName":"local-storage","volumeMode":"Filesystem"}} creationTimestamp: "2023-04-26T02:14:22Z" finalizers: - kubernetes.io/pv-protection name: example-pv resourceVersion: "4740152" uid: 0874cd56-76be-4743-b24f-6ee7dce5604a spec: accessModes: - ReadWriteOnce capacity: storage: 10Gi local: path: /var/k8s-volumes/first nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - rke2-server-node-1 persistentVolumeReclaimPolicy: Delete storageClassName: local-storage volumeMode: Filesystem status: phase: Available
无法绑定的持久化卷声明(PVC)配置
$ kubectl get pvc -n manager -o yaml apiVersion: v1 items: - apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: meta.helm.sh/release-name: manager meta.helm.sh/release-namespace: manager creationTimestamp: "2023-04-26T02:38:02Z" finalizers: - kubernetes.io/pvc-protection labels: app.kubernetes.io/instance: manager app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: manager app.kubernetes.io/version: 0.1.3 helm.sh/chart: manager-0.1.0 name: manager-pvc-pg namespace: manager resourceVersion: "4740252" uid: efa5460f-7aef-4a0d-a4a1-f902868cc38b spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi volumeMode: Filesystem status: phase: Pending kind: List metadata: resourceVersion: ""
关联的 Pod 状态
$ kubectl describe pod -n manager manager-pg-674df946fd-nqplc Name: manager-pg-674df946fd-nqplc Namespace: manager Priority: 0 Service Account: default Node: <none> Labels: app.kubernetes.io/component=postgres app.kubernetes.io/instance=manager app.kubernetes.io/name=manager pod-template-hash=674df946fd Annotations: kubernetes.io/psp: global-unrestricted-psp Status: Pending IP: IPs: <none> Controlled By: ReplicaSet/manager-pg-674df946fd Containers: manager-pg: Image: registry:5000/postgresql12:12.13 Port: 5432/TCP Host Port: 0/TCP Environment: PGDATA: /var/lib/postgresql/data/pgdata POSTGRES_USER: user PGUSER: user POSTGRES_PASSWORD: <set to the key 'databasePassword' in secret 'shared-secret'> Optional: false POSTGRES_DB: dbname Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-w6wsl (ro) Conditions: Type Status PodScheduled False Volumes: postgres-data: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: manager-pvc-pg ReadOnly: false kube-api-access-w6wsl: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 2m4s (x4 over 17m) default-scheduler 0/4 nodes are available: 4 pod has unbound immediate PersistentVolumeClaims. preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.
集群补充信息
存储类情况
$ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE local-path rancher.io/local-path Delete WaitForFirstConsumer false 11d
PVC 已显式设置 storageClass 为空字符串,意图使用静态存储卷绑定,集群未启用 CSI 驱动:
$ kubectl get csidriver No resources found
问题分析与解决方案
核心原因
PV 的 storageClassName 设置为 local-storage,但 PVC 未指定该存储类名称。Kubernetes 静态绑定要求 PV 和 PVC 的存储类名称完全匹配,若 PVC 未指定存储类,仅会匹配未设置存储类的 PV。
解决步骤
方案一:修改 PVC 匹配 PV 的存储类
编辑 PVC,添加与 PV 一致的存储类名称:
kubectl edit pvc manager-pvc-pg -n manager
修改后的 spec 片段:
spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: local-storage volumeMode: Filesystem
方案二:修改 PV 移除存储类配置
若不想使用存储类,可将 PV 的 storageClassName 设为空字符串,与 PVC 保持一致:
kubectl edit pv example-pv
修改后的 spec 片段:
spec: storageClassName: "" # 其余配置保持不变
验证绑定结果
执行以下命令确认绑定状态:
kubectl get pv example-pv kubectl get pvc manager-pvc-pg -n manager
若 PV 和 PVC 状态均变为 Bound,则绑定成功,关联 Pod 会自动调度至 rke2-server-node-1 节点。
内容的提问来源于stack exchange,提问作者pooley1994
相关产品推荐
相关产品推荐

