🏆 K8S持久卷
⭐️ 持久卷介绍:
(1)PersistentVolume
(持久卷,简称 PV
)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV
也是集群中的一种资源。它也像 Volume
一样,是一种 volume
插件,但是它的生命周期却是和使用它的 Pod
相互独立的。PV
这个 API
对象,捕获了诸如 NFS、ISCSI
、或其他云存储系统的实现细节。
(2)PersistentVolumeClaim
(持久卷声明,简称 PVC
)是用户的一种存储请求。它和 Pod
类似,Pod
消耗 Node
资源,而 PVC
消耗 PV
资源。Pod
能够请求特定的资源(如 CPU
和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)。
虽然 PersistentVolumeClaim
允许用户使用抽象存储资源,但是对于不同的问题,用户通常需要具有不同属性(比如性能)的持久卷。集群管理员需要能够提供不同于大小和访问模式的各种持久性卷,而不需要让用户了解这些卷是如何实现的。对于这些需求,有一个 StorageClass
资源。
⭐️ 创建方式
(3)有两种PV提供的方式:静态和动态。
静态 PV
:集群管理员创建多个 PV
,它们携带着真实存储的详细信息,这些存储对于集群用户是可用的。它们存在于 KubernetesAPI
中,并可用于存储使用。
动态 PV
:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于 StorageClass
。
⭐️ 相关知识
1️⃣ 使用
Pod使用PVC就像使用volume一样。集群检查PVC,查找绑定的PV,并映射PV给Pod。对于支持多种访问模式的PV,用户可以指定想用的模式。一旦用户拥有了一个PVC,并且PVC被绑定,那么只要用户还需要,PV就一直属于这个用户。用户调度Pod,通过在Pod的volume块中包含PVC来访问PV。
2️⃣ 释放
当用户使用PV完毕后,他们可以通过API来删除PVC对象。当PVC被删除后,对应的PV就被认为是已经是“released”了,但还不能再给另外一个PVC使用。前一个PVC的属于还存在于该PV中,必须根据策略来处理掉
3️⃣ 回收
PV
的回收策略告诉集群,在 PV
被释放之后集群应该如何处理该 PV
。当前,PV
可以被 Retained
(保留)、Recycled
(再利用)或者 Deleted
(删除)。保留允许手动地再次声明资源。对于支持删除操作的PV卷,删除操作会从 Kubernetes
中移除 PV
对象,还有对应的外部存储(如AWS EBS,GCE PD,Azure Disk,或者Cinder volume)。动态供给的卷总是会被删除。
4️⃣ 访问模式
ReadWriteOnce
-- 该volume只能被单个节点以读写的方式映射ReadOnlyMany
-- 该volume可以被多个节点以只读方式映射ReadWriteMany
-- 该volume可以被多个节点以读写的方式映射
在命令行中,访问模式可以简写为:
RWO
- ReadWriteOnce
ROX
- ReadOnlyMany
RWX
- ReadWriteMany
5️⃣ 回收策略
Retain
:保留,需要手动回收
Recycle
:回收,自动删除卷中数据
Delete
:删除,相关联的存储资产,如 AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder
卷都会被删除
⚠️ 注意:
目前只有NFS和HostPath支持回收利用
AWS EBS,GCE PD,Azure Disk, OpenStackCinder卷支持删除操作
6️⃣ 状态
Available
:空闲的资源,未绑定给PVC
Bound
:绑定给了某个PVC
Released
:PVC已经删除了,但是 PV
还没有被集群回收
Failed
:PV在自动回收中失败了
命令行可以显示 PV
绑定的PVC名称。
⭐️ 实验
1️⃣ 安装 nfs
[root@slave volume]# yum install -y nfs-utils ##这里是slave因为我吧master打污点了
[root@slave ~]# showmount -e
Export list for slave:
/nfspv *
[root@slave ~]# systemctl enable --now nfs
##创建
[root@slave nfspv]# ls
pv1 pv2 pv3
2️⃣ 创建 NFS PV
卷
[root@master volume]# cat volume-nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity: ##设置pv的大小
storage: 5Gi
accessModes: ##设置pv的访问模式
- ReadWriteOnce ##单节点读写
volumeMode: Filesystem ##文件系统是filesystem还是block
persistentVolumeReclaimPolicy: Recycle ##回收策略
storageClassName: nfs ##存储连接
nfs: ##nfs设置
path: /nfspv/pv1
server: 192.168.200.20
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfspv/pv2
server: 192.168.200.20
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfspv/pv3
server: 192.168.200.20
3️⃣ 查看
[root@master volume]# kubectl apply -f volume-nfs-pv.yaml
persistentvolume/pv1 created
persistentvolume/pv2 created
persistentvolume/pv3 created
[root@master volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 5Gi RWO Recycle Available nfs 5s
pv2 1Gi RWO Recycle Available nfs 5s
pv3 10Gi RWO Recycle Available nfs 5s
4️⃣ 创建 pvc
[root@master volume]# cat volume-nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
spec:
storageClassName: nfs
accessModes:
- ReadWriteOnce
resources: ##最小存储空间
requests:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
spec:
storageClassName: nfs
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
5️⃣ 查看 pv
和 pvc
[root@master volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 5Gi RWO Recycle Bound default/pvc1 nfs 18m
pv2 1Gi RWO Recycle Bound default/pvc2 nfs 18m
pv3 10Gi RWO Recycle Available nfs 18m
[root@master volume]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pv1 5Gi RWO nfs 64s
pvc2 Bound pv2 1Gi RWO nfs 64s
这里可以看见5Gi的pvc和1Gi的pvc并没有选择那个10Gi的pv
6️⃣ pod
挂载 pv
[root@master volume]# cat volume-nfs-pvc-pod.yml
---
apiVersion: v1
kind: Pod
metadata:
name: test-pd1
spec:
containers:
- image: nginx:latest
name: myapp
volumeMounts:
- mountPath: /usr/share/nginx/html
name: pv-nfs
volumes:
- name: pv-nfs
persistentVolumeClaim:
claimName: pvc1
---
apiVersion: v1
kind: Pod
metadata:
name: test-pd2
spec:
containers:
- image: nginx:latest
name: myapp
volumeMounts:
- mountPath: /usr/share/nginx/html
name: pv-nfs
volumes:
- name: pv-nfs
persistentVolumeClaim:
claimName: pvc2