• K8s — PVC|PV Terminating State


    在本文中,我们将讨论PV和PVC一直Terminating的状态。

    何时会Terminting?

    在以下情况下,资源将处于Terminating状态。

    • 在删除Bounded 状态的PVC之前,删除了对应的PV,PV在删除后是Terminting状态。
    • 删除PVC时,仍有引用了PVC的pod在运行(pods attached to the pvc),删除后PVC是Terminting状态。
      Kubernetes为了防止数据丢失,会保护当前正在使用的PVC和绑定到PVC的PV不会被从系统中删除。这种保护功能是通过Finalizers完成的。Finalizer 是带有命名空间的键,告诉 Kubernetes 等到特定的条件被满足后, 再完全删除被标记为删除的资源。 Finalizer 提醒控制器清理被删除的对象拥有的资源。
      每次创建 PVC 或 PV 时,都会将 Finalizer 附加到我们的资源。
    • Finalizer [kubernetes.io/pv-protection] -> 创建 PV 时
    • Finalizer [kubernetes.io/pvc-protection] -> 创建 PVC 时

    Terminating State 终止状态

    Terminating State意味着 PVC 和/或 PV 的删除将被推迟,直到它们不再被 pod 使用或绑定到 PVC。

    验证

    我们将创建一个 PVC 和一个简单的应用程序,以便我们可以验证 Finalizers 并模拟 Terminating state以及如何修复它。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: example-claim
    spec:
      storageClassName: longhorn
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 100Mi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-deploy
      #namespace: example
      labels:
        app: example-app
      annotations:
    spec:
      selector:
        matchLabels:
          app: example-app
      replicas: 2
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
      template:
        metadata:
          labels:
            app: example-app
        spec:
          containers:
          - name: example-app
            image: nginx
            imagePullPolicy: Always
            ports:
            - containerPort: 5000
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: example-claim
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    验证一下一切是否已启动并正在运行:

     kubectl get pvc --field-selector metadata.name=example-claim
    
    • 1

    在这里插入图片描述

    kubectl get pv | grep -w "default/example-claim"
    
    • 1

    在这里插入图片描述

    # claims associated with pod
    kubectl get pods -o custom-columns=POD:.metadata.name,PVC:.spec.volumes[*].persistentVolumeClaim.claimName
    
    • 1
    • 2

    在这里插入图片描述
    PV PVC pod 的关系如下图:
    在这里插入图片描述
    在我们模拟Terminating state之前,让我们验证 PVC 和 PV 是否具有我们之前提到的注释 Finalizer。

    #Looking for finalizer pv-protection
    kubectl get pv pvc-b05c6e74-89b4-4669-8e00-5036f109a487 -o json | jq .metadata.finalizers
    
    • 1
    • 2

    在这里插入图片描述

    #Looking for finalizer pv-protection
     kubectl get pvc example-claim -o json | jq .metadata.finalizers
    
    • 1
    • 2

    在这里插入图片描述
    让我们模拟Terminating state:
    正如我们之前提到的,如果在 PV 绑定到 PVC ,直接删除PV 将会使PV处于Terminating state。

    kubectl delete pv pvc-b05c6e74-89b4-4669-8e00-5036f109a487
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    同时删除 PVC:

    kubectl delete pvc example-claim
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    因为仍然有使用 PVC 的pod,所以 PVC 也不会被删除,而是一直处于Terminating state。

    删除pod:

    kubectl delete pod example-deploy-75bcc94c6d-fftq2
    or
    kubectl delete deployment example-deploy
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    在这里插入图片描述
    注意事项:

    • When you delete a statefulset that have a retention policy whenDeleted:delete it will also remove the pods and the PVC.
    • If you persistant volume have a retain policy Delete, when deleting the pvc the bound pv and underlying storage volume will be also deleted.
    • If your PV retain policy is not Delete, you’ll have to remove the PV and storage manually.

    不删除依赖项直接删除PV/PVC

    如果删除终止 pv 的Finalizers,pvc 将失去 Bound,保持在 Lost 状态,并且可能会丢失数据。

    kubectl patch pvc pvc_name -p '{"metadata":{"finalizers":null}}'
    or
    kubectl patch pv pv_name -p '{"metadata":{"finalizers":null}}'
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    卡码网语言基础课 |链表的基础操作III
    Linux进程概念
    参加2024年CSDN博客_付费内容优质创作者_颁奖仪式的收获
    给一个input元素添加border-radius 但是加完之后 边框变得很粗怎么办
    Reflex WMS 高阶系列1 - Purge database
    Android项目出现了同一个依赖库的两个版本
    盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?
    庖丁解牛,这八个MySQL经典错误,你遇到几个?
    基于多特征融合的活动识别算法
    【C++】构造函数初始化列表的特性以及注意事项
  • 原文地址:https://blog.csdn.net/renduy/article/details/136619314