🏆 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️⃣ 访问模式

  1. ReadWriteOnce -- 该volume只能被单个节点以读写的方式映射
  2. ReadOnlyMany -- 该volume可以被多个节点以只读方式映射
  3. ReadWriteMany -- 该volume可以被多个节点以读写的方式映射

在命令行中,访问模式可以简写为:

RWO - ReadWriteOnce

ROX - ReadOnlyMany

RWX - ReadWriteMany

image-20241001105746076

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️⃣ 查看 pvpvc

[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