如何处理已发布的持续卷?

gmi*_*ile 11 google-cloud-storage google-cloud-platform kubernetes google-kubernetes-engine

TL; DR.关于如何在删除PVC后访问数据,以及为什么PV在删除PVC后不会消失,我很遗憾.

我正在采取的步骤:

  1. 手动在GCE中创建了一个磁盘:

    gcloud compute disks create --size 5Gi disk-for-rabbitmq --zone europe-west1-b
    
    Run Code Online (Sandbox Code Playgroud)
  2. 跑:

    kubectl apply -f /tmp/pv-and-pvc.yaml
    
    Run Code Online (Sandbox Code Playgroud)

    使用以下配置:

    # /tmp/pv-and-pvc.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-for-rabbitmq
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 5Gi
      gcePersistentDisk:
        fsType: ext4
        pdName: disk-for-rabbitmq
      persistentVolumeReclaimPolicy: Delete
      storageClassName: standard
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-for-rabbitmq
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
      storageClassName: standard
      volumeName: pv-for-rabbitmq
    
    Run Code Online (Sandbox Code Playgroud)
  3. 手动删除了一个PVC(在高级别:我在这里模拟一个灾难性的场景,比如意外删除或错误配置一个helm版本):

    kubectl delete pvc pvc-for-rabbitmq
    
    Run Code Online (Sandbox Code Playgroud)

此时我看到以下内容:

$ kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                      STORAGECLASS   REASON   AGE
pv-for-rabbitmq   5Gi        RWO            Delete           Released   staging/pvc-for-rabbitmq   standard                8m
$
Run Code Online (Sandbox Code Playgroud)

一个附带问题,只是提高我的理解:为什么PV仍然在那里,即使它有一个回收政策设置Delete这不是文档Delete回收政策的说法吗?

现在,如果我尝试重新创建PVC以重新获得对PV中数据的访问权限:

$ kubectl apply -f /tmp/pv-and-pvc.yaml
persistentvolume "pv-for-rabbitmq" configured
persistentvolumeclaim "pvc-for-rabbitmq" created
$
Run Code Online (Sandbox Code Playgroud)

我仍然得到这个pv,例如PV陷入Released状态:

$
kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                             STORAGECLASS   REASON    AGE
pv-for-rabbitmq                            5Gi        RWO            Delete           Released   staging/pvc-for-rabbitmq          standard                 15m
$
Run Code Online (Sandbox Code Playgroud)

......我得到的是pvcs:

$
kubectl get pvc
NAME               STATUS    VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-for-rabbitmq   Pending   pv-for-rabbitmq   0                         standard       1m
$
Run Code Online (Sandbox Code Playgroud)

看起来我的PV处于停滞Released状态,并且PVC无法访问未处于Available状态的PV .

那么,为什么同样的PV和PVC再也不能成为朋友呢?如何让PVC重新获得对现有PV中数据的访问权限?

Bha*_*bra 39

kubectl patch pv pv-for-rabbitmq -p '{"spec":{"claimRef": null}}'
Run Code Online (Sandbox Code Playgroud)

这对我有用。

  • 对此的更多解释,来自 kubernetes 文档:“从 PV 规范中删除 ClaimRef 条目,以便新的 PVC 可以绑定到它。这应该使 PV 可用。” (4认同)

小智 9

关于PV的官方文档有这样的答案:

\n

回收Retain策略允许手动回收资源。PersistentVolumeClaim删除后,PersistentVolume仍然存在,并且该卷被视为 \xe2\x80\x9creleased\xe2\x80\x9d。但它还不能用于其他声明,因为之前的声明者\xe2\x80\x99s 数据仍保留在该卷上。管理员可以通过以下步骤手动回收卷。

\n
    \n
  1. 删除PersistentVolume. 删除 PV 后,\n外部基础设施(例如 AWS EBS、GCE PD、Azure 磁盘或 Cinder 卷)中的关联存储资产仍然存在。
  2. \n
  3. 手动[复制/备份和/或]清理关联存储资产上的数据。
  4. \n
  5. 手动删除关联的存储资产,或者如果您想要\n重复使用相同的存储资产,请使用PersistentVolume存储资产定义创建一个新资产。
  6. \n
\n


Sun*_*y J 5

“Pod 消耗节点资源,PVC 消耗 PV 资源”这句话可能有助于充分理解 PV 和 PVC 之间的理论和友谊。

我尝试完全重现使用提供的 YAML 文件记录的行为,但失败了,并且返回了预期结果。因此,在提供任何进一步的细节之前,这里是我的复制品的演练。

第 1 步:在 Europe-west1 区域创建 PD

sunny@dev-lab:~$ gcloud compute disks create --size 5Gi disk-for-rabbitmq --zone europe-west1-b

WARNING: You have selected a disk size of under [200GB]. This may result in poor I/O 
performance. For more information, see: 

NAME               ZONE            SIZE_GB  TYPE         STATUS
disk-for-rabbitmq  europe-west1-b  5        pd-standard  READY
Run Code Online (Sandbox Code Playgroud)

步骤2:使用项目YAML文件创建PV和PVC

sunny@dev-lab:~$  kubectl apply -f pv-and-pvc.yaml

persistentvolume "pv-for-rabbitmq" created
persistentvolumeclaim "pvc-for-rabbitmq" created
Run Code Online (Sandbox Code Playgroud)

步骤3:列出所有可用的PVC

sunny@dev-lab:~$ kubectl get pvc
NAME               STATUS    VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-for-rabbitmq   Bound     pv-for-rabbitmq   5Gi        RWO            standard       16s
Run Code Online (Sandbox Code Playgroud)

步骤 4:列出所有可用的 PV

sunny@dev-lab:~$ kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                      STORAGECLASS   REASON    AGE
pv-for-rabbitmq   5Gi        RWO            Delete           Bound     default/pvc-for-rabbitmq   standard                 28s
Run Code Online (Sandbox Code Playgroud)

步骤5:删除PVC并验证结果

sunny@dev-lab:~$  kubectl delete pvc pvc-for-rabbitmq
persistentvolumeclaim "pvc-for-rabbitmq" deleted

sunny@dev-lab:~$  kubectl get pv
Run Code Online (Sandbox Code Playgroud)

没有找到资源。

sunny@dev-lab:~$  kubectl get pvc
Run Code Online (Sandbox Code Playgroud)

没有找到资源。

sunny@dev-lab:~$  kubectl describe pvc-for-rabbitmq
Run Code Online (Sandbox Code Playgroud)

服务器没有资源类型“pvc-for-rabbitmq”

根据你的问题

一个附带问题,只是提高我的理解:为什么 PV 仍然存在,即使它的回收策略设置为“删除”?这不是文档中所说的删除回收策略吗?

您是完全正确的,根据文档,当用户完成其卷时,他们可以从 API 中删除 PVC 对象,从而允许回收资源。PersistentVolume的回收策略告诉集群在释放其声明后如何处理该卷。在您的 YAML 中,它被设置为:

Reclaim Policy:  Delete
Run Code Online (Sandbox Code Playgroud)

这意味着它应该被立即删除。目前,卷可以是RetainedRecycledDeleted

为什么没有被删除?我唯一能想到的是,PV 可能仍以某种方式被声明,这可能是由于 PVC 未成功删除,因为其容量显示为“0”,要解决此问题,您将需要删除 POD。或者,您可以使用该$ kubectl describe pvc命令查看 PVC 仍处于挂起状态的原因。

对于问题,如何制作 PVC 来重新访问现有 PV 中的数据?

由于回收策略的状态,这是不可能的,即Reclaim Policy: Delete要使之成为可能,您需要根据文档使用“保留”选项

要验证可以删除 PVC 并保留磁盘的理论,请执行以下操作:

  • 将回收策略更改为保留
  • 删除PVC
  • 删除PV

然后验证磁盘是否被保留。


Zen*_*din 5

就像 @Bharat Chhabra 的答案,但它会将所有已发布的持久卷的状态修改为可用:

kubectl get pv | tail -n+2 | awk '$5 == "Released" {print $1}' | xargs -I{} kubectl patch pv {} --type='merge' -p '{"spec":{"claimRef": null}}'
Run Code Online (Sandbox Code Playgroud)

  • 另一个版本:`for resources in $(kubectl get pv | grep Released | cut -d' ' -f1); do kubectl patch pv "${resource}" -p '{"spec":{"claimRef": null}}'; 完成` (3认同)