k8s之持久存储卷PV和PVC

一、简介

在前边文章中可以看到,Kubernetes中依赖后端存储包括:
NFS、Ceph、块存储等存储设备实现数据的远程存储以及数据持久化。

使用这些网络存储资源需要工程师对存储有一定的了解,并需要在工作节点上对接这些存储,对于非专业工程师造成了一些困扰。
Kubernetes为了解决这些问题,定义了两个标准的Kubernetes资源即PV和PVC,为了使Kubernetes工程师从后端存储的逻辑中解耦出来。
Kubernetes工程师无需关注后端存储的逻辑,用户只需要声明需求,Kubernete中的pv-controller会检查用户声明的需求和已有特性,找一个最接近需求的PV,和PVC建立绑定关系。至于后端存储的细节无需了解。
PV主要承载存储细节,用户一般通过PVC申请存储资源。
PV是标准的资源类型,除了负责关联至后端存储系统外,它通常还需要定义支持的存储特性

  • Volume Mode:当前PV卷提供的存储空间模型,分为设备和文件系统两种
  • StorageClassName:当前PV隶属的存储类;
  • AccessMode:支持的访问模型,分为单路读写、多路读写和多路只读三种
  • Size:当前PV允许使用的空间上限

二、PV的两种置备方式

静态置备:由管理员通过存储细节对接到远程存储服务的某存储单元进行手动创建,
动态置备:管理员基于SC对接远程存储服务的管理API,根据用户PVC中声明的需求,自动请求存储服务创建适配的存储单元,并自动把该存储单元创建成PV。

三、准备NFS服务器

root@k8s-node03:~# mkdir /data/redis02
root@k8s-node03:~# vi /etc/exports 
root@k8s-node03:~# cat /etc/exports

/data/redis  192.168.10.0/24(rw,no_root_squash,no_subtree_check)
/data/redis02  192.168.10.0/24(rw,no_root_squash,no_subtree_check)

root@k8s-node03:~# exportfs -rav
exporting 192.168.10.0/24:/data/redis02
exporting 192.168.10.0/24:/data/redis

四、创建NFS类型的PV

root@k8s-master01:~/learning-k8s/examples/volumes# cat pv-nfs-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-demo
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain  #回收策略
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path:  "/data/redis02"               #nfs的共享目录
    server: 192.168.10.13                #nfs服务端地址
root@k8s-master01:~/learning-k8s/examples/volumes# kubectl apply -f pv-nfs-demo.yaml 
persistentvolume/pv-nfs-demo created

root@k8s-master01:~/learning-k8s/examples/volumes# kubectl get pv 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM       STORAGECLASS       REASON   AGE
pv-nfs-demo                                5Gi        RWX            Retain           Available                                           7s

五、声明PVC绑定PV

root@k8s-master01:~/learning-k8s/examples/volumes# cat pvc-demo.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
spec:
  accessModes: ["ReadWriteMany"]
  volumeMode: Filesystem
  resources:
    requests:
      storage: 3Gi
    limits:
      storage: 10Gi
root@k8s-master01:~/learning-k8s/examples/volumes# kubectl apply -f pvc-demo.yaml 
persistentvolumeclaim/pvc-demo created
root@k8s-master01:~/learning-k8s/examples/volumes# kubectl get pv 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS       REASON   AGE
pv-nfs-demo                                5Gi        RWX            Retain           Bound    default/pvc-demo                           6m46s  
  • 以上看到PV的状态从Available转变成Bound
root@k8s-master01:~/learning-k8s/examples/volumes# kubectl get pvc
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
pvc-demo       Bound    pv-nfs-demo                                5Gi        RWX                               2m9s

六、Pod消费PVC

root@k8s-master01:~/learning-k8s/examples/volumes# cat pod-with-pvc-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: redis-with-pvc
spec:
  containers:
  - name: redis
    image: redis:7-alpine
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 6379
      name: redisport
    volumeMounts:
    - mountPath: /data
      name: redis-pvc-vol
  volumes:
  - name: redis-pvc-vol
    persistentVolumeClaim:             #卷声明请求
      claimName: pvc-demo              #对应PVC的名称

root@k8s-master01:~/learning-k8s/examples/volumes# kubectl apply -f pod-with-pvc-demo.yaml 
pod/redis-with-pvc created
root@k8s-master01:~/learning-k8s/examples/volumes# kubectl get pod 
NAME                     READY   STATUS    RESTARTS      AGE
redis-with-pvc           1/1     Running   0             6s
posted @ 2024-01-24 21:42  *一炁化三清*  阅读(68)  评论(0编辑  收藏  举报