1、PV与PVC 介绍
持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。
持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存)。同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以挂载为 ReadWriteOnce、ReadOnlyMany、ReadWriteMany 或 ReadWriteOncePod, 请参阅访问模式)。
2、生命周期
2.1 构建
2.1.1 静态构建
集群管理员创建若干PV卷,这些卷对象带有直实存储的细节信息,并且对集群用户可用(可见)。PV卷对象存在于Kubernetes APl中,可供用户消费(使用)·
2.1.2 动态构建
如果集群中已经有的PV无法满足PVC的需求,那么集群会根据PVC自动构建一个PV,该操作是通过StorageClass实现的。
想要实现这个操作,前提是PVC必须设置StorageClass,否则会无法动态构建该PV,可以通过启用DefaultStorageClass来实现PV的构建。
2.2 绑定(PV和PVC如何使用?)
当用户创建一个PVC对象后,主节点会监测新的PVC对象,并且寻找与之匹配的PV卷,找到PV卷后将二者绑定在一起。
如果找不到对应的PV,则需要看PVC是否设置StorageClass来决定是否动态创建PV,若没有配置,PVC就会一致处于未绑定状态,直到有与之匹配的PV后才会申领绑定关系。
2.4 使用(POD和PVC如何使用?)
Pod将PVC当作存储卷来使用。集群会通过PVC找到绑定的PV,并为Pod挂载该卷。
Pod一旦使用PVC绑定PV后,为了保护数据,避免数据丢失问题,PV对象会受到保护,在系统中无法披删除。
2.5 回收策略
当用户不再使用其存储卷时,他们可以从API中将PVC对象删除,从而允许该资源被回收再利用。PersistentVolume对象的回收策路告诉集群,当其被从申领中释放时如何处理该数据卷。 目前,数据卷可以被Retained(保留)、Recycled(回收)或Deleted(除)。
2.5.1 保留(Retain)
回收策路Retain使得用户可以主动回收资源。当PersistentVolumeClaim对象被删除时,PersistentVolume卷仍然存在,对应的数据卷被视为"已释放(released)"。由于卷上仍然存在这前一申领人的数据,该卷还不能用于其他申领。管理员可以通过下面的步家来手动回收该卷:
1.侧除PersistentVolume对象。与之相关的、位于外部基础设施中的存储资产(伤如AWS EBS、GCE PD、Azure Disk或Cinder卷)在PV删除之后仍然存在。
2.根据情况,手动清除所关联的存储资产上的数据。
3.手动删除所关联的存档资产
如果你希望重用该存储资产,可以基于存储资产的定义创建新的PersistentVolume卷对象。
2.5.2 删除(Delete)
对于支持Delete回收策路的卷插件,册除动作会将PersistentVolume对象从Kubernetes中移除,同时也会从外部础设施(如AWS EBS、GCE PD、Azure Disk或Cinder卷)中移除所关联的存储资产。动态制备的卷会继承基StorageClass中设置的回收策略,该策路默认为Delete。管理员需要根据用户的期望来配置StorageClass: 否则PV卷被创建之后必须要被偏辑或者修补。
2.5.3 回收(Recycled)
警告: 回收策路Recycle已被废弃。取而代之的建议方案是使用动态制备。
如果下层的卷插件支持,回收策路Recycle会在卷上执行一些基本的擦除 ( rm-f /thevolume/* )操作,之后允许该卷用于新的PVC申领。
3、PV
3.1 配置文件
apiVersion : v1
kind : PersistentVolume
metadata :
name : pv- 01
spec :
capacity :
storage : 5Gi
volumeMode : Filesystem
accessModes :
- ReadWriteMany
persistentVolumeReclaimPolicy : Retain
storageClassName : slow
mountOptions :
- hard
- nfsvers=4.1
nfs :
path : /data/nfs/rw/pv- 01
server : 10.10.10.100
3.2 创建这个pv资源
[ root@k8s- master pv] # kubectl create - f pv- 01. yaml
persistentvolume/ pv- 01 created
3.3 查看PV的状态
Availabel:空闲,未被绑定
Bound:已经被PVC绑定
Released:PVC被删除,资源已回收,但是PV未被重新使用
Failed:自动回收失败
[ root@k8s- master pv] # kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv- 01 5 Gi RWX Retain Available slow 16 s
4、PVC
4.1 配置文件
PVC和PV绑定的时候需要注意yaml中这几个参数都需要一一对应
spec.accessModes: # 权限需要和对应的pv相同
spec.volumeMode: # 数据卷类型需要和pv相同
spec.resources.requests.storage: # 数据卷大小只能小于等于pv的大小,大于pv的大小也是无法匹配的。
spec.storageClassName: # 设置的属性名字必须和pv相同
apiVersion : v1
kind : PersistentVolumeClaim
metadata :
name : nfs- pvc
spec :
accessModes :
- ReadWriteMany
volumeMode : Filesystem
resources :
requests :
storage : 5Gi
storageClassName : slow
4.2 创建这个pvc资源
[ root@k8s- master pv] # kubectl create - f pvc- 01. yaml
persistentvolumeclaim/ nfs- pvc created
4.3 查看PVC的状态
这里可以看到pvc的状态是Bound,并且挂在的数据卷是pv-01,他的属性是RWX(可读可写可执行)
[ root@k8s- master pv] # kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs- pvc Bound pv- 01 5 Gi RWX slow 6 s
4.4 查看pv的状态
可以看到PV的状态已经变为了Bound(已经被PVC绑定)。
[ root@k8s- master pv] # kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv- 01 5 Gi RWX Retain Bound default / nfs- pvc slow 16 m
4.5 pod和pvc进行绑定
4.5.1 创建pod配置文件
apiVersion: v1
kind: Pod
metadata:
name: nfs- pvc- pod
spec:
containers:
- image: nginx: 1.20
name: nginx- pvc
volumeMounts:
- mountPath: / usr/ share/ nginx/ html # 挂载到容器哪个目录
name: nfs- pvc # 挂载的数据卷的名字
volumes:
- name: nfs- pvc
persistentVolumeClaim: # 关联PVC
claimName: nfs- pvc # 关联到那个pvc,填写这个pvc的名字
4.5.2 创建这个pod资源
[ root@k8s- master pv] # kubectl create - f nfs- pvc- pod. yaml
pod/ nfs- pvc- pod created
4.5.3 查看pod资源信息
[ root@k8s- master pv] # kubectl get po - o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
configfile- po 0 / 1 Completed 0 21 h 10.2 .1 .69 k8s- node- 02 < none> < none>
dns- test 1 / 1 Running 2 ( 31 h ago) 3 d15h 10.2 .1 .58 k8s- node- 02 < none> < none>
emptydir- volume- pod 2 / 2 Running 34 ( 47 m ago) 17 h 10.2 .1 .72 k8s- node- 02 < none> < none>
fluentd- 59 k8k 1 / 1 Running 1 ( 31 h ago) 2 d22h 10.2 .2 .34 k8s- node- 01 < none> < none>
fluentd- hhtls 1 / 1 Running 1 ( 31 h ago) 2 d22h 10.2 .1 .59 k8s- node- 02 < none> < none>
host- volume- pod 1 / 1 Running 0 18 h 10.2 .1 .71 k8s- node- 02 < none> <