kubernetes - Kubernetes 删除 Pod 后 PV/PVC 的状态
问题描述
我有一个 Kubernetes 集群,其中部署了一些 pod(数据库、前端、Redis)。我无法完全掌握的部分是删除 pod 后 PVC 会发生什么。
例如,如果我删除绑定到 CLAIM_A 的 POD_A,我知道 CLAIM_A 不会自动删除。如果我然后尝试重新创建 POD,它会附加回同一个 PVC,但所有数据都丢失了。
谁能解释发生了什么,我查看了官方文档,但目前没有任何意义。
任何帮助表示赞赏。
解决方案
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
推荐阅读
- python-3.x - 根据条件查找熊猫数据框中列的计数
- python - 从 django 到 postgres DB 的奇怪迁移。如何保存现有数据
- python - 在Python中使用zip函数对相关的2个列表进行排序,如何按降序排序?
- build - image_picker 取消:Flutter 的 Widget 构建器中的 Navigation.pop
- c++ - 是否可以创建一个在循环中跳过函数的计时器?
- java - gradle 构建访问被拒绝
- spring-boot - 如何将 Flux all 应用于返回 Mono 的谓词
? - javascript - 使用 pdfjs 时无法通过在 viewer.html 文件参数中传递 Uint8Array 来呈现 pdf
- visual-c++ - 从 32 位迁移 C++ 和 Java 64 位挑战
- docker - 就如何使用 Helm 和 Kubernetes 进行个性化服务设置提供建议