K8S引入了一组叫作Persistent Volume Claim(PVC)和Persistent Volume(PV)的API对象,大大降低了用户声明和使用持久化Volume的门槛。

在Pod的Volumes中,只要声明类型是persistentVolumeClaim,指定PVC的名字,当创建这个PVC对象,k8s就自动为它绑定一个符合条件的Volume,这个Volume,从PV来

PVC和PV的设计,类似“接口”和“实现”的思想,开发者只知道使用“接口”PVC,运维人员负责给“接口”绑定具体的实现PV,说白了PVC就是一种特殊的Volume

PVC和PV的实现原理
PVC:描述 Pod想要使用的持久化属性,比如存储大小、读写权限等
PV:描述一个具体的Volume属性,比如Volume的类型、挂载目录、远程存储服务器地址等
StorageClass:充当PV的模板,自动为PVC创建PV

一、关于PV创建的流程

大多数情况,持久化Volume的实现,依赖于远程存储服务,如远程文件存储(NFS、GlusterFS)、远程块存储(公有云提供的远程磁盘)等。
K8s需要使用这些存储服务,来为容器准备一个持久化的宿主机目录,以供以后挂载使用,创建这个目录分为两阶段:

1.创建一个远程块存储,相当于创建了一个磁盘,称为Attach

由Volume Controller负责维护,不断地检查 每个Pod对应的PV和所在的宿主机的挂载情况。可以理解为创建了一块NFS磁盘,相当于执行

gcloud compute instances attach-disk < 虚拟机名字 > --disk < 远程磁盘名字 >

为了使用这块磁盘,还需要挂载操作

2.将这个磁盘设备挂载到宿主机的挂载点,称为Mount

将远程磁盘挂载到宿主机上,发生在Pod对应的宿主机上,是kubelet组件一部分,利用goroutine执行,不会阻塞主我看一下
相当于执行

mount -t nfs <NFS 服务器地址 >:/ /var/lib/kubelet/pods/<PodID>/volumes/kubernetes.io~<Volume 类型 >/<Volume 名字 > 

通过这个挂载操作,Volume的宿主机目录就成为了一个远程NFS目录的挂载点,以后写入的所有文件,都会被保存在NFS服务器上
如果是已经有NFS磁盘,第一步可以省略.

同样,删除PV的时候,也需要Umount和Dettach两个阶段处理

二、PV、PVC使用示例

1.创建PV

apiVersion: v1 kind: PersistentVolume metadata:   name: cqh   labels:     cqh: chenqionghe spec:   capacity:     storage: 100Mi   volumeMode: Filesystem   accessModes: ["ReadWriteMany"]   persistentVolumeReclaimPolicy: Delete   storageClassName: local-storage   local:     path: /data/pv   nodeAffinity:     required:       nodeSelectorTerms:       - matchExpressions:         - key: cqh           operator: In           values:           - chenqionghe

创建后查看

root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl get pv NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM         STORAGECLASS    REASON    AGE cqh       100Mi      RWX            Delete           Bound     default/cqh   local-storage             4m

2.创建PVC

kind: PersistentVolumeClaim apiVersion: v1 metadata:   name: cqh spec:   storageClassName: local-storage   accessModes:   - ReadWriteMany   resources:     requests:       storage: 100Mi   selector:     matchLabels:       cqh: chenqionghe 

AccessModes为ReadWriteMany,表示这个Volume是可读写的,并且能挂载在多个节点上(官方支持的AccessMode)

执行创建后查看

root@VM-0-8-ubuntu:/home/ubuntu/statefulset# kubectl get pvc NAME      STATUS