首页 > 解决方案 > Kubernetes 删除 Pod 后 PV/PVC 的状态

问题描述

我有一个 Kubernetes 集群,其中部署了一些 pod(数据库、前端、Redis)。我无法完全掌握的部分是删除 pod 后 PVC 会发生什么。

例如,如果我删除绑定到 CLAIM_A 的 POD_A,我知道 CLAIM_A 不会自动删除。如果我然后尝试重新创建 POD,它会附加回同一个 PVC,但所有数据都丢失了。

谁能解释发生了什么,我查看了官方文档,但目前没有任何意义。

任何帮助表示赞赏。

标签: kuberneteskubernetes-podpersistent-volumespersistent-volume-claims

解决方案


PVC 的生命周期独立于 pod。如果PV仍然存在,可能是因为它的 ReclaimPolicy 设置为 Retain,在这种情况下,即使 PVC 消失,它也不会被删除。

PersistentVolume 可以有多种回收策略,包括“保留”、“回收”和“删除”。对于动态配置的 PersistentVolume,默认回收策略是“删除”。这意味着当用户删除相应的 PersistentVolumeClaim 时,会自动删除动态配置的卷。如果卷包含宝贵的数据,则此自动行为可能不合适。请注意,RECLAIM POLICY是 Delete(默认值),这是两个回收策略之一,另一个是 Retain。(第三个政策回收已被弃用)。如果是Delete,在PVC被移除时PV会被自动删除,PVC上的数据也会丢失。

在这种情况下,使用“保留”策略更为合适。使用“保留”策略,如果用户删除 PersistentVolumeClaim,则不会删除相应的 PersistentVolume。相反,它被移至已发布阶段,其中所有数据都可以手动恢复。

当持久卷受到保护时,也可能发生这种情况。您应该能够交叉验证这一点:

命令:

$ kubectl describe pvc PVC_NAME | grep Finalizers

输出:

Finalizers:    [kubernetes.io/pvc-protection]

您可以通过使用 kubectl 补丁将终结器设置为 null 来解决此问题:

$ kubectl patch pvc PVC_NAME -p '{"metadata":{"finalizers": []}}' --type=merge

编辑:

PersistentVolume 可以通过资源提供者支持的任何方式安装在主机上。每个 PV 都有自己的一组访问模式来描述特定 PV 的功能。

访问模式有:

  • ReadWriteOnce – 卷可以由单个节点以读写方式挂载
  • ReadOnlyMany – 卷可以被许多节点以只读方式挂载
  • ReadWriteMany – 卷可以被许多节点以读写方式挂载

在 CLI 中,访问模式缩写为:

  • RWO-ReadWriteOnce
  • ROX - ReadOnlyMany
  • RWX - 读写多

因此,如果您重新创建了 pod 并将调度程序放在不同的节点上,并且您的 PV 已将回收策略设置为 ReadWriteOnce,那么您无法访问您的数据是正常的。

在请求具有特定访问模式的存储时,声明使用与卷相同的约定。我的建议是将 PV 访问模式编辑为 ReadWriteMany。

$ kubectl edit pv your_pv

您应该更新 PersistentVolume 中的访问模式,如下所示

   accessModes:
      - ReadWriteMany

推荐阅读