kubernetes - Kubernetes 删除 Pod 后 PV/PVC 的状态

标签 kubernetes kubernetes-pod persistent-volumes persistent-volume-claims

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

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

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

任何帮助表示赞赏。

最佳答案

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

PersistentVolume 可以有多种回收策略,包括“保留”、“回收”和“删除”。对于动态配置的 PersistentVolume,默认回收策略是“删除”。这意味着当用户删除相应的 PersistentVolumeClaim 时,会自动删除动态配置的卷。如果卷包含宝贵的数据,则此自动行为可能不合适。
请注意 回收政策 是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 - ReadWriteMany

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

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

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

    关于kubernetes - Kubernetes 删除 Pod 后 PV/PVC 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58418093/

    相关文章:

    docker - 如何在kubernetes中将 `args`作为 `command`运行

    sockets - 在 Kubernetes/Ingress 和 Google Cloud Platform 上运行 HTTPS SSE 服务器

    kubernetes - 正确使用 Role.rules.resourceNames 来创建对资源访问受限的 pod

    kubernetes - 检查容器资源消耗

    kubernetes - 如何更改现有持久卷的存储类?

    docker - Docker Desktop for mac 上持久卷的 Kubernetes 存储位置在哪里?

    windows - Minikube启动 panic :运行时错误:无效的内存地址或nil指针取消引用[信号0xc0000005代码= 0x0 addr = 0x10 pc = 0x8812cf]

    docker - kubernetes - 环境变量不适用于整数

    kubernetes - 如何保证每个kubernetes节点运行2个或更多Pod?

    kubernetes - 如何在 Kubernetes 中删除持久卷