我有一个部署了一些 pod 的 Kubernetes 集群(DB、Frontend、Redis(。我无法完全掌握的部分是删除豆荚后 PVC 会发生什么。
例如,如果我删除绑定到CLAIM_A POD_A我知道CLAIM_A不会自动删除。如果我随后尝试重新创建 POD,它会重新连接到同一个 PVC,但所有数据都丢失了。
谁能解释一下发生了什么,我已经查看了官方文档,但目前没有任何意义。
任何帮助,不胜感激。
PVC 的生命周期与豆荚无关。 如果 PV 仍然存在,可能是因为它将回收策略设置为"保留",在这种情况下,即使 PVC 消失,也不会删除它。
持久卷可以具有各种回收策略,包括"保留"、"回收"和"删除"。对于动态预配的持久卷,默认回收策略为"删除"。这意味着当用户删除相应的 PersistentVolumeClaim 时,会自动删除动态预配的卷。如果卷包含重要数据,则此自动行为可能不合适。 请注意,回收策略是"删除"(默认值(,它是两个回收策略之一,另一个是"保留"。(第三个策略回收已被弃用(。在删除的情况下,PVC被移除时会自动删除,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
编辑:
持久性卷可以通过资源提供程序支持的任何方式装载到主机上。每个 PV 都有自己的一组访问模式,用于描述该特定 PV 的功能。
访问模式包括:
- 读写一次 – 卷可以由单个卷作为读写装载 节点
- 只读多 – 卷可以由多个节点以只读方式装载
- 读写多 – 卷可由许多节点作为读写挂载
在 CLI 中,访问模式缩写为:
- RWO - 读写一次
- ROX - 只读许多
- RWX - 读写多
因此,如果您重新创建了 pod 和调度程序,请将其放在不同的节点上,并且您的 PV 将回收策略设置为 ReadWriteOnce 一次,您无法访问数据是正常的。
声明在请求具有特定访问模式的存储时,使用与卷相同的约定。我的建议是编辑ReadWriteMany的PV访问模式。
$ kubectl edit pv your_pv
您应该更新持久卷中的访问模式,如下所示
accessModes:
- ReadWriteMany