kubernetes-PV与PVC

一、PV和PVC详解

当前,存储的方式和种类有很多,并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中,放了方便我们的使用和管理,Kubernetes提出了PV和PVC的概念,这样Kubernetes集群的管理人员就可以将注意力集中到Kubernetes集群中来,而无需操心后端的存储设备。

pv : 相当于磁盘分区

pvc: 相当于磁盘请求

PersistentVolumeClaim(PVC)是用户存储的请求

PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),

定义的时候直接指定大小,pvc必须与对应的pv建立关系,

pvc会根据定义去pv申请,而pv是由存储空间创建出来的。

pv和pvc是kubernetes抽象出来的一种存储资源。

  • PV : 持久化卷的意思,是对底层的共享存储的一种抽象
  • PVC(Persistent Volume Claim)是持久卷请求于存储需求的一种声明(PVC其实就是用户向kubernetes系统发出的一种资源需求申请。)

从上图可以看出,底层的存储可以使各种类型,包括NFS、Ceph、CIFS等等,而Kubernetes会把这些存储统一抽象为PV。PV,即Persistent Volume,是集群中配置的存储资源。PVC,即Persistent Volume Claim,是用户存储的请求,通常我们在一个Pod中定义一个存储卷,定义的时候会指定该存储卷的相关信息,比如空间大小、可读可写等属性。但是PVC并不是真正的存储空间,Pod的PVC和PV之间必须建立某种联系,这样才能使得Pod可以调用实际存储空间。

apiVersion: v1

kind: PersistentVolume

metadata:

name: pv2

spec:

nfs: # 存储类型,与底层真正存储对应

capacity: # 存储能力,目前只支持存储空间的设置

storage: 2Gi

accessModes: # 访问模式

storageClassName: # 存储类别

persistentVolumeReclaimPolicy: # 回收策略

使用了PV和PVC之后,工作可以得到进一步的细分:

存储: 存储工程师维护
PV: kubernetes管理员维护
**PVC:**kubernetes用户维护

二、PV和PVC生命周期

实际上,不管是PV,还是PVC,都遵循以下生命周期:

2.1 Provisioning 配置

Provisioning,即配置阶段。一般而言,PV的提供方式有两种------静态和动态。

所谓静态提供,就是Kubernetes管理员创建多个PV,这些PV的存储空间等属性已经确定,并且已经和真实的存储设备进行了关联。Pod中的PVC可以根据需要请求这些PV。

所谓动态提供,需要依托与StorageClass的支持,这时Kubernetes会尝试为PVC来动态的创建PV。这样做的好处是避免出现这种情况:部分PVC被分配给了远远超出其资源需求的PV、或者说系统存在很多资源较少的PV,但是一个资源需求很高的PVC缺无法被满足的情况。

2.2 Binding 结合

在动态配置的情况下,用户创建或者已经创建了具有特定数量的PVC后,PVC与PV绑定的过程。

如果没有满足PVC请求需求的PV,那么PVC将无法被创建,因此造成的结果就是相应的Pod也不会被创建。

2.3 Using 使用

即PVC与PC绑定后,Pod对存储空间的使用过程。

2.4 Releasing 释放

当Pod被删除或者对该PV的资源使用结束后,Kubernetes就会删除该PVC对象,相应的也会回收PV资源,这时的PV就会处于这种状态。但是此时的PV还需要处理完毕之前的Pod在该存储卷上存储信息后才能够被使用。

2.5 Reclaiming 处理中

PV的回收策略对被释放的PV的处理过程。

2.6 Recycling 循环

根据配置,有时PV会被执行擦除操作,删除掉该存储空间上的所有信息,并且该存储资源也可以被再次使用。

三、访问模式

3.1 PV的访问模式(accessmodes)

|---------------------|----------------------------------------------------------------------------------------------------------------|
| 模式 | 翻译 |
| ReadWriteOnce (RWO) | 可读可写,但只支持被单个节点挂载。 |
| ReadOnlyMany (ROX) | 只读,可以被多个节点挂载。 |
| ReadWriteMany (RWX) | 多路可读可写。这种存储可以以读写的方式被多个节点共享。不是每一种存储都支持这三种方式,像共享方式,目前支持的还比较少,比较常用的是 NFS。在PVC绑定PV时通常根据两个条件来绑定,一个是存储的大小,另一个就是访问模式。 |

3.2 PV的回收策略(persistentVolumeReclaimPolicy)

|---------|-----------------------------------------------------------|
| 策略 | 解释 |
| retain | 不清理,保留Volume (需要手动清理) |
| Recycle | 删除数据,即rm -rf /thevolumel*(只有NFS和HostPath支持) |
| Delete | 删除存储资源,比如删除AWS EBS卷(只有AWS EBS,GCE PD,Azure Disk和Cinder支持) |

3.3 pv的状态

|-----------|----------------|
| 状态 | 解释 |
| Available | 可用 |
| Bound | 已经分配给PVC |
| Released | PVC解绑但还未执行回收策略 |
| Failed | 发生错误 |

四、实验验证

4.1 安装nfs

1、创建目录

[root@k8s ~]# mkdir /root/data/{pv1,pv2,pv3} -pv

2、暴露服务

[root@k8s ~]# vim /etc/exports

/root/data/pv1 192.168.223.0/24(rw,sync,no_root_squash)

/root/data/pv2 192.168.223.0/24(rw,sync,no_root_squash)

/root/data/pv3 192.168.223.0/24(rw,sync,no_root_squash)

3、重启服务

[root@k8s ~]# systemctl restart nfs

相关推荐
大G哥2 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
feng_xiaoshi2 小时前
【云原生】云原生架构的反模式
云原生·架构
妍妍的宝贝2 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
大道归简3 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
爱跑步的程序员~3 小时前
Docker
docker·容器
福大大架构师每日一题4 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
程序那点事儿4 小时前
k8s 之动态创建pv失败(踩坑)
云原生·容器·kubernetes
疯狂的大狗4 小时前
docker进入正在运行的容器,exit后的比较
运维·docker·容器
长天一色4 小时前
【Docker从入门到进阶】01.介绍 & 02.基础使用
运维·docker·容器
叶北辰CHINA5 小时前
nginx反向代理,负载均衡,HTTP配置简述(说人话)
linux·运维·nginx·http·云原生·https·负载均衡