Kubernetes删除Pod后PV/PVC的状态

Rut*_*net 4 kubernetes persistent-volumes persistent-volume-claims kubernetes-pod

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

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

任何人都可以解释发生了什么,我已经查看了官方文档,但目前没有任何意义。

任何帮助表示赞赏。

Mal*_*ata 8

PVC 的生命周期与 Pod 无关。如果PV仍然存在,可能是因为它已将 ReclaimPolicy 设置为 Retain,在这种情况下,即使 PVC 消失也不会删除它。

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

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

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

命令:

$ kubectl describe pvc PVC_NAME | grep Finalizers
Run Code Online (Sandbox Code Playgroud)

输出:

Finalizers:    [kubernetes.io/pvc-protection]
Run Code Online (Sandbox Code Playgroud)

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

$ kubectl patch pvc PVC_NAME -p '{"metadata":{"finalizers": []}}' --type=merge
Run Code Online (Sandbox Code Playgroud)

编辑:

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

访问模式有:

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

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

  • RWO - ReadWriteOnce
  • ROX - ReadOnlyMany
  • RWX - ReadWriteMany

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

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

$ kubectl edit pv your_pv
Run Code Online (Sandbox Code Playgroud)

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

   accessModes:
      - ReadWriteMany
Run Code Online (Sandbox Code Playgroud)