PV 与 PVC 状态迁移

打印 上一主题 下一主题

主题 833|帖子 833|积分 2499

目次

一、概述

1、PV

定义:集群级别的资源。是集群中的一块存储,可以由管理员事先制备, 或者利用存储类(Storage Class)来动态制备。 长期卷是集群资源,就像节点也是集群资源一样。与节点相绑定。PV 长期卷和普通的 Volume 一样, 也是利用卷插件来实现的,只是它们拥有独立于任何利用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储体系。
用途:PV 为应用提供长期化的存储空间,纵然 Pod 被销毁或重新创建,数据仍然保存。
2、PVC

定义:命名空间(namespace)级别的资源。PVC 是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。 PVC 申领会请求特定的大小和访问模式
用途:PVC 答应用户请求特定大小和特性的存储空间,Kubernetes 自动将符合的 PV 与 PVC 匹配起来。
二、状态变化

操作PV 状态PVC 状态创建 PV (单独)Available---创建 PVC (单独)---Pending等候绑定BoundBound删除 PV(delete命令 --> 真正删除)Bound --> Terminating --> ---Bound --> Lost重新创建 PVAvailable --> BoundLost --> Bound删除 PVCReleased(Retain)/ Failed(Delete/Recycle)清算失败---删除 PV 的 claimRefReleased(Retain)--> Available---重建 PVCAvailable --> BoundBound三、实例

1、单独创建 PV

1.1、创建并应用 PV
  1. kubectl apply -f task-pv.yaml
复制代码
  1. cat << EOF > task-pv.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: task-pv
  6. spec:
  7.   capacity:
  8.     storage: 1Gi
  9.   accessModes:
  10.     - ReadWriteOnce
  11.   persistentVolumeReclaimPolicy: Retain
  12.   storageClassName: manual
  13.   local:
  14.     path: /mnt/data/my-pv
  15.   nodeAffinity:
  16.     required:
  17.       nodeSelectorTerms:
  18.       - matchExpressions:
  19.         - key: kubernetes.io/hostname
  20.           operator: In
  21.           values:
  22.           - k8s-node1
  23. EOF
复制代码
1.2、查看刚创建的 PV 状态

Available(可用): 表示可用状态,PV 刚被创建出来还未被任何 PVC 绑定
  1. kubectl get pv task-pv
复制代码

2、单独创建 PVC

2.1、创建并应用 PV
  1. kubectl apply -f task-pvc.yaml
复制代码
  1. cat << EOF > task-pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: task-pvc
  6. spec:
  7.   accessModes:
  8.     - ReadWriteOnce
  9.   resources:
  10.     requests:
  11.       storage: 1Gi
  12.   storageClassName: manual
  13. EOF
复制代码
2.2、查看刚创建的 PVC 状态

Pending (待定):当 PVC 被创建时,它会处于 Pending 状态,等候与符合的 PV 匹配。
  1. kubectl get pvc task-pvc
复制代码

3、等候绑定

PVC --- Bound (已绑定):当 PVC 乐成与 PV 匹配并绑定时,PVC 的状态变为 Bound。这意味着 PVC 已经准备好被 Pod 利用。
PV --- Bound(已绑定): 表示 PV 已经被 PVC 绑定
  1. kubectl get pv task-pv
  2. kubectl get pvc task-pvc
复制代码

4、删除 PV

当我们尝试删除正在绑定的 PV 时会发现 delete 操作会一直卡住
因为 Kubernetes 试图保持 PV 和 PVC 之间的绑定关系,直到 PVC 被删除或者 PV 的状态被显式地更改
  1. kubectl delete pv task-pv
复制代码

4.1、查看 PV,PVC 状态

PV 没有被真正删除时,PV 处于 Terminating 状态,对 PVC 无影响 还是 Bound 状态
  1. kubectl get pvc task-pvc
  2. kubectl get pv task-pv
复制代码

4.2、真正删除 PV

想要真正删除 PV 需要修改 PV 中的 Finalizer 属性逼迫删除
  1. kubectl edit pv task-pv
复制代码
注释掉 finalizers: 及其值
4.3、查看PV PVC 状态

当编辑 PV 并删除 PV 中的 Finalizer 属性逼迫删除 PV 时 PVC 会变为 Lost 状态
  1. kubectl get pvc task-pvc
  2. kubectl get pv task-pv
复制代码

5、重新创建 PV

5.1、重新创建之前与 PVC 绑定的 PV

PV 由 刚创建的 Available --> Bound 绑定状态
PVC 由之前的 Lost 状态 --> Bound 绑定状态
过一会,会发现 PVC 和 PV 都变为 Bound 状态
  1. kubectl apply -f task-pv.yamlkubectl get pv task-pv
  2. kubectl get pvc task-pvc
复制代码

6、删除 PVC

这个时候的 PV 状态由自己定义的 persistentVolumeReclaimPolicy字段来决定
6.1、persistentVolumeReclaimPolicy: Retain 时删除 PVC 查看 PV 状态

persistentVolumeReclaimPolicy: Retain 时删除 PVC 与其绑定的 PV 处于Released 状态
  1. kubectl delete pvc task-pvc
  2. kubectl get pv task-pv
复制代码

6.2、persistentVolumeReclaimPolicy: Delete 时删除 PVC 查看 PV 状态

persistentVolumeReclaimPolicy: Delete 时删除 PVC 与其绑定的 PV 处于 Failed 状态(清算失败)
  1. kubectl get pv
复制代码

6.3、persistentVolumeReclaimPolicy: Recycle 时删除 PVC 查看 PV 状态

persistentVolumeReclaimPolicy: Recycle 时删除 PVC 与其绑定的 PV 处于 Failed 状态(清算失败)
  1. kubectl get pv
复制代码

7、手动删除 PVC 引用

7.1、查看 PV 的 claimRef 属性

通过查看 PV 的 claimRef 属性,会发现其中还保存着 PVC 的绑定信息
  1. kubectl get pv task-pv -o yaml
复制代码
  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   annotations:
  5.     kubectl.kubernetes.io/last-applied-configuration: |
  6.       {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"task-pv"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"1Gi"},"local":{"path":"/mnt/data/my-pv"},"nodeAffinity":{"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/hostname","operator":"In","values":["k8s-node1"]}]}]}},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"manual"}}
  7.     pv.kubernetes.io/bound-by-controller: "yes"
  8.   creationTimestamp: "2024-08-13T08:38:42Z"
  9.   finalizers:
  10.   - kubernetes.io/pv-protection
  11.   name: task-pv
  12.   resourceVersion: "98232"
  13.   uid: 74442248-2aea-436d-9e66-45af7b36405a
  14. spec:
  15.   accessModes:
  16.   - ReadWriteOnce
  17.   capacity:
  18.     storage: 1Gi
  19.   claimRef:
  20.     apiVersion: v1
  21.     kind: PersistentVolumeClaim
  22.     name: task-pvc
  23.     namespace: default
  24.     resourceVersion: "98206"
  25.     uid: e0cb8efc-68a5-4044-8b63-9c633eeb4e6f
  26.   local:
  27.     path: /mnt/data/my-pv
  28.   nodeAffinity:
  29.     required:
  30.       nodeSelectorTerms:
  31.       - matchExpressions:
  32.         - key: kubernetes.io/hostname
  33.           operator: In
  34.           values:
  35.           - k8s-node1
  36.   persistentVolumeReclaimPolicy: Retain
  37.   storageClassName: manual
  38.   volumeMode: Filesystem
  39. status:
  40.   phase: Released
复制代码

7.2、删除 claimRef 对 PVC 的引用

由于PVC只能和Available的状态的PV进行绑定。删除 claimRef 对 PVC 的引用,这个时候 Kubernetes 的 PV Controller watch 到 PV 变化后,就会将 PV 修改为 Available 状态,Available 状态的 PV 就可以被其他 PVC 绑定了。
删除 claimRef 部分
PV 会从 Released 状态变为 Available 状态
  1. kind: PersistentVolume
  2. metadata:
  3.   annotations:
  4.     kubectl.kubernetes.io/last-applied-configuration: |
  5.       {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"task-pv"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"1Gi"},"local":{"path":"/mnt/data/my-pv"},"node
  6. Affinity":{"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/hostname","operator":"In","values":["k8s-node1"]}]}]}},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"manu
  7. al"}}
  8.     pv.kubernetes.io/bound-by-controller: "yes"
  9.   creationTimestamp: "2024-08-13T08:52:58Z"
  10.   finalizers:
  11.   - kubernetes.io/pv-protection
  12.   name: task-pv
  13.   resourceVersion: "99447"
  14.   uid: f89d6765-88fb-4b33-8dc1-157f25c7d798
  15. spec:
  16.   accessModes:
  17.   - ReadWriteOnce
  18.   capacity:
  19.     storage: 1Gi
  20.   local:
  21.     path: /mnt/data/my-pv
  22.   nodeAffinity:
  23.     required:
  24.       nodeSelectorTerms:
  25.       - matchExpressions:
  26.         - key: kubernetes.io/hostname
  27.           operator: In
  28.           values:
  29.           - k8s-node1
  30.   persistentVolumeReclaimPolicy: Retain
  31.   storageClassName: manual
  32.   volumeMode: Filesystem
  33. status:
  34.   phase: Released
复制代码

7.3、重建之前的 PVC 进行绑定

会发现集群中的 PV 与 PVC 立刻进行了绑定都变为 Bound 状态
  1. kubectl apply -f task-pvc.yaml
  2. kubectl get pvc,pv
复制代码

四、状态迁移图

1、PV 状态迁移图


1、创建好一个 PV 后 PV 就处于一个 Available 状态,当一个 PV 与 一个 PVC 绑定的时候,这个 PV 就会进入 Bound 状态
2、一个处于 Bound 状态且回收计谋时 Retain 的 PV ,其关联的 PVC 删除后,变为 Released ;回收计谋为 Recycle/Delete 时清算失败会变为 Failed 状态
3、当删除 PV 的 claimRef (对 PVC 的引用)时,PV 由 Released 变为 Available
4、当 Recycle 失败时状态变为 Failed
5、通过手动删除 PVC 信息,状态由 Failed 变为 Available
2、PVC 状态迁移图


1、当 PVC 被创建时会短暂处于 Pending 状态等候集群中由匹配的 PV 与其绑定。当一个 Pending 的 PVC 乐成与 PV 绑定时 PVC 的状态变为 Bound
2、当删除 PV 时分两种环境:第一种没有删除 PV 中的 Finalizer 属性时 PV 不会被删除 PVC 仍处于 Bound 状态;第二种删除了 PV 中的 Finalizer 属性时 PV 被逼迫删除导致 PVC 由 Bound 状态变为 Lost 状态
3、处于 Lost 状态的 PVC 再次与一个 PV 绑定后变为 Bound 状态

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表