PV 与 PVC 状态迁移

news/2024/11/17 4:38:38/文章来源:https://www.cnblogs.com/misakivv/p/18358019

目录
  • 一、概述
    • 1、PV
    • 2、PVC
  • 二、状态变化
  • 三、实例
    • 1、单独创建 PV
      • 1.1、创建并应用 PV
      • 1.2、查看刚创建的 PV 状态
    • 2、单独创建 PVC
      • 2.1、创建并应用 PV
      • 2.2、查看刚创建的 PVC 状态
    • 3、等待绑定
    • 4、删除 PV
      • 4.1、查看 PV,PVC 状态
      • 4.2、真正删除 PV
      • 4.3、查看PV PVC 状态
    • 5、重新创建 PV
      • 5.1、重新创建之前与 PVC 绑定的 PV
    • 6、删除 PVC
      • 6.1、persistentVolumeReclaimPolicy: Retain 时删除 PVC 查看 PV 状态
      • 6.2、persistentVolumeReclaimPolicy: Delete 时删除 PVC 查看 PV 状态
      • 6.3、persistentVolumeReclaimPolicy: Recycle 时删除 PVC 查看 PV 状态
    • 7、手动删除 PVC 引用
      • 7.1、查看 PV 的 claimRef 属性
      • 7.2、删除 claimRef 对 PVC 的引用
      • 7.3、重建之前的 PVC 进行绑定
  • 四、状态迁移图
    • 1、PV 状态迁移图
    • 2、PVC 状态迁移图

一、概述

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
等待绑定 Bound Bound
删除 PV(delete命令 --> 真正删除) Bound --> Terminating --> --- Bound --> Lost
重新创建 PV Available --> Bound Lost --> Bound
删除 PVC Released(Retain)/ Failed(Delete/Recycle)清理失败 ---
删除 PV 的 claimRef Released(Retain)--> Available ---
重建 PVC Available --> Bound Bound

三、实例

1、单独创建 PV

1.1、创建并应用 PV

kubectl apply -f task-pv.yaml
cat << EOF > task-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: task-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: manuallocal:path: /mnt/data/my-pvnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1
EOF

1.2、查看刚创建的 PV 状态

Available(可用): 表示可用状态,PV 刚被创建出来还未被任何 PVC 绑定

kubectl get pv task-pv

image-20240813144053580

2、单独创建 PVC

2.1、创建并应用 PV

kubectl apply -f task-pvc.yaml
cat << EOF > task-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: task-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: manual
EOF

2.2、查看刚创建的 PVC 状态

Pending (待定):当 PVC 被创建时,它会处于 Pending 状态,等待与合适的 PV 匹配。

kubectl get pvc task-pvc

image-20240813144840356

3、等待绑定

PVC --- Bound (已绑定):当 PVC 成功与 PV 匹配并绑定时,PVC 的状态变为 Bound。这意味着 PVC 已经准备好被 Pod 使用。

PV --- Bound(已绑定): 表示 PV 已经被 PVC 绑定

kubectl get pv task-pv
kubectl get pvc task-pvc

image-20240813145424026

4、删除 PV

当我们尝试删除正在绑定的 PV 时会发现 delete 操作会一直卡住

因为 Kubernetes 试图保持 PV 和 PVC 之间的绑定关系,直到 PVC 被删除或者 PV 的状态被显式地更改

kubectl delete pv task-pv

image-20240813150657114

4.1、查看 PV,PVC 状态

PV 没有被真正删除时,PV 处于 Terminating 状态,对 PVC 无影响 还是 Bound 状态

kubectl get pvc task-pvc
kubectl get pv task-pv

image-20240813151335163

4.2、真正删除 PV

想要真正删除 PV 需要修改 PV 中的 Finalizer 属性强制删除

kubectl edit pv task-pv
注释掉 finalizers: 及其值
image-20240813152308596

4.3、查看PV PVC 状态

当编辑 PV 并删除 PV 中的 Finalizer 属性强制删除 PV 时 PVC 会变为 Lost 状态

kubectl get pvc task-pvc
kubectl get pv task-pv

image-20240813152554408

5、重新创建 PV

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

PV 由 刚创建的 Available --> Bound 绑定状态

PVC 由之前的 Lost 状态 --> Bound 绑定状态

过一会,会发现 PVC 和 PV 都变为 Bound 状态

kubectl apply -f task-pv.yamlkubectl get pv task-pvkubectl get pvc task-pvc

image-20240813153936058

6、删除 PVC

这个时候的 PV 状态由自己定义的 persistentVolumeReclaimPolicy字段来决定

6.1、persistentVolumeReclaimPolicy: Retain 时删除 PVC 查看 PV 状态

persistentVolumeReclaimPolicy: Retain 时删除 PVC 与其绑定的 PV 处于Released 状态

image-20240813160158969

kubectl delete pvc task-pvckubectl get pv task-pv

image-20240813154855214

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

persistentVolumeReclaimPolicy: Delete 时删除 PVC 与其绑定的 PV 处于 Failed 状态(清理失败)

image-20240813162911550

kubectl get pv

image-20240813162712773

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

persistentVolumeReclaimPolicy: Recycle 时删除 PVC 与其绑定的 PV 处于 Failed 状态(清理失败)

image-20240813163024825

kubectl get pv

image-20240813163206818

7、手动删除 PVC 引用

7.1、查看 PV 的 claimRef 属性

通过查看 PV 的 claimRef 属性,会发现其中还保留着 PVC 的绑定信息

kubectl get pv task-pv -o yaml
apiVersion: v1
kind: PersistentVolume
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"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"}}pv.kubernetes.io/bound-by-controller: "yes"creationTimestamp: "2024-08-13T08:38:42Z"finalizers:- kubernetes.io/pv-protectionname: task-pvresourceVersion: "98232"uid: 74442248-2aea-436d-9e66-45af7b36405a
spec:accessModes:- ReadWriteOncecapacity:storage: 1GiclaimRef:apiVersion: v1kind: PersistentVolumeClaimname: task-pvcnamespace: defaultresourceVersion: "98206"uid: e0cb8efc-68a5-4044-8b63-9c633eeb4e6flocal:path: /mnt/data/my-pvnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1persistentVolumeReclaimPolicy: RetainstorageClassName: manualvolumeMode: Filesystem
status:phase: Released

image-20240813164406341

7.2、删除 claimRef 对 PVC 的引用

由于PVC只能和Available的状态的PV进行绑定。删除 claimRef 对 PVC 的引用,这个时候 Kubernetes 的 PV Controller watch 到 PV 变化后,就会将 PV 修改为 Available 状态,Available 状态的 PV 就可以被其他 PVC 绑定了。

删除 claimRef 部分

PV 会从 Released 状态变为 Available 状态

kind: PersistentVolume
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"task-pv"},"spec":{"accessModes":["ReadWriteOnce"],"capacity":{"storage":"1Gi"},"local":{"path":"/mnt/data/my-pv"},"node
Affinity":{"required":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"kubernetes.io/hostname","operator":"In","values":["k8s-node1"]}]}]}},"persistentVolumeReclaimPolicy":"Retain","storageClassName":"manu
al"}}pv.kubernetes.io/bound-by-controller: "yes"creationTimestamp: "2024-08-13T08:52:58Z"finalizers:- kubernetes.io/pv-protectionname: task-pvresourceVersion: "99447"uid: f89d6765-88fb-4b33-8dc1-157f25c7d798
spec:accessModes:- ReadWriteOncecapacity:storage: 1Gilocal:path: /mnt/data/my-pvnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8s-node1persistentVolumeReclaimPolicy: RetainstorageClassName: manualvolumeMode: Filesystem
status:phase: Released

image-20240813165501372

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

会发现集群中的 PV 与 PVC 立即进行了绑定都变为 Bound 状态

kubectl apply -f task-pvc.yamlkubectl get pvc,pv

image-20240813165809504

四、状态迁移图

1、PV 状态迁移图

image-20240814001106256

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 状态迁移图

image-20240813232801201

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 状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783530.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Diff and Patch

Diff and Patch Git diff Git diff:索引区(--) VS 工作区(++) Git diff --cached:索引区 VS 代码仓库【注意:git add. 将修改添加到索引区里面去】 git cat-file -p 是一个 Git 命令,用于查看 Git 对象的内容。Git 对象可以是提交(commit)、树(tree)、标签(tag)、…

全网最适合入门的面向对象编程教程:36 Python的内置数据类型-字典

字典是非常好用的容器,它可以用来直接将一个对象映射到另一个对象。一个拥有属性的空对象在某种程度上说就是一个字典,属性名映射到属性值。在内部,对象通过字典来表示属性,其值为属性的值或对象的方法。全网最适合入门的面向对象编程教程:36 Python 的内置数据类型-字典摘…

修复IAT

我们以vmp为例 https://wwmf.lanzout.com/i66kC27a0ekj 密码:2hq4 修复跳转表 我们来到OEP通过运行,我们发现两个API调用获取这两个API调用的地址,然后在一个具有执行权限的代码段中 写入跳转语句,如下图所示记住指令之前要相隔一个字节,也就是与6对齐 然后将call 地址指向…

基于星座图整形方法的QAM调制解调系统MATLAB误码率仿真,对比16,32,64,256四种QAM调制方式

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 2.算法涉及理论知识概要星座图整形技术旨在通过优化星座点的布局来改善系统的性能。这包括但不限于:1.功率效率提升:通过非均匀分布星座点,可以减少符号间的距离,从而在相同的平均功率下,传输更多信息比…

如何下载 .ts 视频 All In One

如何下载 .ts 视频 All In One .m3u8 视频下载器的工作原理分析和核心代码解析如何下载 .ts 视频 All In One.m3u8 视频下载器的工作原理分析和核心代码解析errorsmacOS ffmpeg Library not loaded: /usr/local/opt/jpeg-xl/lib/libjxl.0.7.dylib$ ffmpeg -i https://cdn14.boo…

基于EM期望最大化算法的GMM模型参数估计matlab仿真

1.程序功能描述 基于EM期望最大化算法的GMM模型参数估计是一种常用的统计学习方法,用于估计高斯混合模型(Gaussian Mixture Model,GMM)的参数。仿真输出EM算法的迭代收敛曲线,并得到GMM的参数估计结果。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.…

基于模糊控制算法的倒立摆控制系统matlab仿真

1.课题概述基于模糊控制算法的倒立摆控制系统,模糊规则,模糊控制器等通过MATLAB编程实现,通过模糊控制器对小车倒立摆平衡系统进行控制,输出倒立摆从不稳定到稳定的动画过程,最后输出小车,倒立摆的收敛过程。2.系统仿真结果3.核心程序与模型 版本:MATLAB2022afor ij=Ts:…

第46届金砖国家世界技能大赛 内存取证样题一

第46届金砖国家世界技能大赛 内存取证样题一题目:从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password} 形式提交(密码为 6 位); 获取当前系统 ip 地址及主机名,以 Flag{ip:主机名}形式提交; 获取当前系统浏览器搜索过的关键词,作为 Flag 提交; 当前系统中…

TS 项目如何从 ESlint8 升级至 9并集成 Prettier

eslint 8 到 9 属于破坏性更新(Break Change),因此导致 eslint 8 配置方式无法直接使用(可以使用兼容包,但这不是本文的主题)。 其实大家最关心的就是从 eslint 8 到 9 之后的写法,而与 eslint 息息相关的多种配置插件也需要大量的变更,因此本文核心就是:使用 eslint9…

Spring Cloud Gateway 实现简单自定义过滤器

背景 Spring Cloud Gateway 是 Spring Cloud 退出的第二代网关框架,我们可以用它来实现 反向代理,路由转发,权限校验等功能,这里介绍一个它的基础功能,通过 Filter 机制实现一个简单的 HTTP 接口处理。 从总体上来看 Spring Cloud Gateway 提供的过滤器可以分为两类,一种…

【Java手写RPC框架系列-1】—— 基础知识准备:RPC+Netty

代码随想录知识星球介绍 https://articles.zsxq.com/id_m76jd72243bi.html 基于Netty手写实现RPC https://www.cnblogs.com/mic112/p/15565795.html项目背景与介绍RPC:远程过程调用协议:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用…

非线性规划的经典例题--选址问题

本章会介绍如何利用非线性规划解决选址问题,这个问题是文章线性规划在数学建模中的两道例题中第二道投料问题的第二小题,本章为基于这道题的基础上进行介绍,建议读者返回去看一看 目录一、问题提出二、问题分析三、模型建立四、代码实现1.输入目标函数2.输入线性约束 一、问…