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