首页 > 解决方案 > Kubernetes PV 在删除/重新创建后拒绝绑定

问题描述

给定以下 PVC 和 PV:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: packages-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  volumeName: packages-volume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: packages-volume
  namespace: test
spec:
  claimRef:
    name: packages-pvc
    namespace: test
  accessModes:
    - ReadWriteMany
  nfs:
    path: {{NFS_PATH}}
    server: {{NFS_SERVER}}
  capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain

如果我创建 PV,然后创建 PVC,它们将绑定在一起。但是,如果我删除 PVC 然后重新创建它,它们不会绑定(pvc 挂起)。为什么?

标签: kubernetes

解决方案


请注意,删除后PVCPV保持Released状态:

$ kubectl get pv packages-volume
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                  STORAGECLASS   REASON   AGE
packages-volume   1007Gi     RWX            Retain           Released   default/packages-pvc                           10m

它应该具有状态Available,以便它可以被另一个PersistentVolumeClaim实例重用。

为什么不是Available

如果您显示 的当前yaml定义PV,您可以通过执行以下操作轻松完成:

kubectl get pv packages-volume -o yaml

您可能会注意到,claimRef它包含uid最近删除的部分PersistentVolumeClaim

  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: packages-pvc
    namespace: default
    resourceVersion: "10218121"
    uid: 1aede3e6-eaa1-11e9-a594-42010a9c0005

您可以通过发出以下命令轻松验证它:

kubectl get pvc packages-pvc -o yaml | grep uid

就在您删除您的PVC并将其与PV定义包含的内容进行比较之前。您会看到这与您在删除后uid仍然引用的完全相同。这个剩余的参考是保持状态的实际原因。PVPVCPVReleased

为什么新创建PVC的状态仍然存在Pending

尽管您新创建的文件PVC在您看来与您使用相同文件PVC创建它时刚刚删除的完全相同,但从它的角度来看,它是一个全新的对象实例,具有完全不同的. 这就是它保持状态并且无法绑定到.yamlKubernetesPersistentVolumeClaimuidPendingPV

解决方案:

PV Available再次进行,您只需要删除提到的uid参考,例如通过发出:

kubectl patch pv packages-volume --type json -p '[{"op": "remove", "path": "/spec/claimRef/uid"}]'

或者通过删除整个claimRef部分,可以按如下方式完成:

kubectl patch pv packages-volume --type json -p '[{"op": "remove", "path": "/spec/claimRef"}]'

推荐阅读