【问题标题】:Kubernetes PV refuses to bind after delete/re-createKubernetes PV 在删除/重新创建后拒绝绑定
【发布时间】:2019-10-09 23:53:23
【问题描述】:

给定以下 PVC 和 PV:

  • PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: packages-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  volumeName: packages-volume
  • PV:
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 挂起)。为什么?

【问题讨论】:

  • 您能分享创建新 PVC 并将释放的 PVC 添加到其中的步骤吗?

标签: kubernetes


【解决方案1】:

注意删除PVC后,PV仍处于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

如果您显示PV 的当前yaml 定义,您可以通过执行轻松做到这一点:

kubectl get pv packages-volume -o yaml

您可能会注意到,在claimRef 部分中,它包含最近删除的PersistentVolumeClaimuid

  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 定义包含的内容进行比较之前。您会看到这与删除 PVC 后您的 PV 仍然引用的 uid 完全相同。这个剩余的引用是PV 保持Released 状态的实际原因。

为什么新创建的PVC 仍处于Pending 状态?

虽然您新创建的PVC 在您看来可能与您刚刚使用相同的yaml 文件创建它时删除的PVC 完全相同,但从Kubernetes 的角度来看,它是一个PersistentVolumeClaim 对象的全新实例,它具有完全不同的 uid。这就是它保持Pending 状态并且无法绑定到PV 的原因。

解决方案:

要再次创建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"}]'

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 2020-11-30
    • 2017-04-02
    • 2017-07-30
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多