PersistentVolume ( PV )是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像 pod 是 k8s 集群资源一样。 PV是容量插件,如 Volumes ,其生命周期独立于使用 PV 的任何单个 pod 。
PersistentVolumeClaim ( PVC )是一个持久化存储卷,我们在创建 pod 时可以定义这个类型的存储卷。 它类似于一个pod 。 Pod 消耗节点资源,PVC 消耗 PV 资源。 Pod 可以请求特定级别的资源(CPU 和
内存)。 pvc 在申请 pv 的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。
PV 是群集中的资源。 PVC 是对这些资源的请求。
PV 和 PVC 之间的相互作用遵循以下生命周期:
可以通过两种方式配置 PV :静态或动态。
集群管理员创建了许多 PV 。它们包含可供群集用户使用的实际存储的详细信息。它们存在于Kubernetes API 中,可供使用。**
当管理员创建的静态 PV 都不匹配用户的 PersistentVolumeClaim 时,群集可能会尝试为 PVC 专门动态配置卷。此配置基于 StorageClasses , PVC 必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。**
用户创建 c pvc 并指定需要的资源和访问模式。在找到可用 pv 之前,pvc 会保持未绑定状态.
3.3.1 需要找一个存储服务器,把它划分成多个存储空间;
3.3.2 k8s 管理员可以把这些存储空间定义成多个 pv ;
3.3.3 在 pod 中使用 pvc 类型的存储卷之前需要先创建 pvc ,通过定义需要使用的 pv 的大小和对应的访问模式,找到合适的 pv ;
3.3.4 pvc 被创建之后,就可以当成存储卷来使用了,我们在定义 pod 时就可以使用这个 c pvc 的存储卷;
3.3.5 pvc 和 和 pv 它们是一 一对应的关系, pv 如果被 pvc 绑定了,就不能被其他 pvc 使用了;
3.3.6 我们在创建 pvc 的时候,应该确保和底下的 pv 能绑定,如果没有合适的 pv ,那么 pvc 就会处于 pending 状态。
当我们创建 pod 时如果使用 pvc 做为存储卷,那么它会和 pv 绑定,当删除 pod ,pvc 和 pv 绑定就会解除,解除之后和 pvc 绑定的 pv 卷里的数据需要怎么处理,目前,卷可以保留(Retain),回收(Recycle,被废弃了)或删除(Delete)。
当删除 pvc 的时候, pv 仍然存在,处于 released 状态,但是它不能被其他 pvc 绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略.
删除 pvc 时即会从 Kubernetes 中移除 PV ,也会从相关的外部设施中删除存储资产.
[root@k8s-master ~]# mkdir -p /data/pv/v{1,2,3,4,5,6,7,8,9,10}
[root@k8s-master ~]# cat >> /etc/exports <
/data/pv/v1 *(rw,no_root_squash)
/data/pv/v2 *(rw,no_root_squash)
/data/pv/v3 *(rw,no_root_squash)
/data/pv/v4 *(rw,no_root_squash)
/data/pv/v5 *(rw,no_root_squash)
/data/pv/v6 *(rw,no_root_squash)
/data/pv/v7 *(rw,no_root_squash)
/data/pv/v8 *(rw,no_root_squash)
/data/pv/v9 *(rw,no_root_squash)
/data/pv/v10 *(rw,no_root_squash)
EOF
[root@k8s-master ~]# exportfs -arv #使配置生效
cat > pv.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
name: v1
spec:
capacity:
storage: 1Gi #pv的存储空间容量
accessModes: ["ReadWriteOnce"]
nfs:
path: /data/volume_test/v1 #把nfs的存储空间创建成pv
server: 192.168.243.180 #nfs服务器的地址
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v2
spec:
persistentVolumeReclaimPolicy: Delete
capacity:
storage: 2Gi
accessModes: ["ReadWriteMany"]
nfs:
path: /data/volume_test/v2
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v3
spec:
capacity:
storage: 3Gi
accessModes: ["ReadOnlyMany"]
nfs:
path: /data/volume_test/v3
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v4
spec:
capacity:
storage: 4Gi
accessModes: ["ReadWriteOnce","ReadWriteMany"]
nfs:
path: /data/volume_test/v4
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v5
spec:
capacity:
storage: 5Gi
accessModes: ["ReadWriteOnce","ReadWriteMany"]
nfs:
path: /data/volume_test/v5
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v6
spec:
capacity:
storage: 6Gi
accessModes: ["ReadWriteOnce","ReadWriteMany"]
nfs:
path: /data/volume_test/v6
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v7
spec:
capacity:
storage: 7Gi
accessModes: ["ReadWriteOnce","ReadWriteMany"]
nfs:
path: /data/volume_test/v7
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v8
spec:
capacity:
storage: 8Gi
accessModes: ["ReadWriteOnce","ReadWriteMany"]
nfs:
path: /data/volume_test/v8
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v9
spec:
capacity:
storage: 9Gi
accessModes: ["ReadWriteOnce","ReadWriteMany"]
nfs:
path: /data/volume_test/v9
server: 192.168.243.180
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: v10
spec:
capacity:
storage: 10Gi
accessModes: ["ReadWriteOnce","ReadWriteMany"]
nfs:
path: /data/volume_test/v10
server: 192.168.243.180
EOF
kubectl apply -f pv.yaml #创建pv资源
[root@k8s-master mqq]# kubectl get pv #查看pv资源,#STATUS 是Available ,表示pv 是可用的
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
v1 1Gi RWO Retain Available 5s
v10 10Gi RWO,RWX Retain Available 5s
v2 2Gi RWX Delete Available 5s
v3 3Gi ROX Retain Available 5s
v4 4Gi RWO,RWX Retain Available 5s
v5 5Gi RWO,RWX Retain Available 5s
v6 6Gi RWO,RWX Retain Available 5s
v7 7Gi RWO,RWX Retain Available 5s
v8 8Gi RWO,RWX Retain Available 5s
v9 9Gi RWO,RWX Retain Available 5s
cat > pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 2Gi
EOF
kubectl apply -f pvc.yaml
[root@k8s-master mqq]# kubectl get pvc ##和v2绑定了
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound v2 2Gi RWX 19s
[root@k8s-master mqq]#
[root@k8s-master mqq]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
v1 1Gi RWO Retain Available 5m25s
v10 10Gi RWO,RWX Retain Available 5m25s
v2 2Gi RWX Delete Bound default/my-pvc 5m25s
v3 3Gi ROX Retain Available 5m25s
v4 4Gi RWO,RWX Retain Available 5m25s
v5 5Gi RWO,RWX Retain Available 5m25s
v6 6Gi RWO,RWX Retain Available 5m25s
v7 7Gi RWO,RWX Retain Available 5m25s
v8 8Gi RWO,RWX Retain Available 5m25s
v9 9Gi RWO,RWX Retain Available 5m25s
[root@k8s-master mqq]# kubectl get pvc #pvc 的名字- 绑定到 pv 绑定的是v2这个pv-pvc 可使用的容量是 2G
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound v2 2Gi RWX 59s
[root@k8s-master mqq]#
cat > pod_pvc.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nginx-html
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-html
persistentVolumeClaim:
claimName: my-pvc
EOF
kubectl apply -f pod_pvc.yaml
[root@k8s-master mqq]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-pvc 1/1 Running 0 34s
[root@k8s-master mqq]#
[root@k8s-master mqq]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-pvc 1/1 Running 0 4m48s
[root@k8s-master mqq]# kubectl exec -it pod-pvc -- /bin/bash #进入pod
root@pod-pvc:/# cd /usr/share/nginx/html/
root@pod-pvc:/usr/share/nginx/html# ls
root@pod-pvc:/usr/share/nginx/html# echo "hello weixin mqq759035366" > index.html #写入一个网页信息
root@pod-pvc:/usr/share/nginx/html# ls
index.html
root@pod-pvc:/usr/share/nginx/html# cat index.html
hello weixin mqq759035366
root@pod-pvc:/usr/share/nginx/html#
[root@k8s-master pv]# cd /data/pv/v2 #因为pvc绑定的是pv是v2目录
[root@k8s-master v2]# ls
index.html
[root@k8s-master v2]# pwd
/data/pv/v2
[root@k8s-master v2]# cat index.html
hello weixin mqq759035366
[root@k8s-master v2]#
#删除pod,pvc和pv后,查看数据文件是否存在
[root@k8s-master mqq]# ll
total 12
-rw-r--r-- 1 root root 301 Apr 9 22:18 pod_pvc.yaml
-rw-r--r-- 1 root root 153 Apr 9 22:17 pvc.yaml
-rw-r--r-- 1 root root 2152 Apr 9 22:17 pv.yaml
[root@k8s-master mqq]# kubectl delete -f pod_pvc.yaml
pod "pod-pvc" deleted
[root@k8s-master mqq]# kubectl delete -f pvc.yaml
persistentvolumeclaim "my-pvc" deleted
[root@k8s-master mqq]# kubectl delete -f pv.yaml
persistentvolume "v1" deleted
persistentvolume "v2" deleted
persistentvolume "v3" deleted
persistentvolume "v4" deleted
persistentvolume "v5" deleted
persistentvolume "v6" deleted
persistentvolume "v7" deleted
persistentvolume "v8" deleted
persistentvolume "v9" deleted
persistentvolume "v10" deleted
[root@k8s-master mqq]#
[root@k8s-master v2]# pwd
/data/pv/v2
[root@k8s-master v2]# ls
index.html
[root@k8s-master v2]# cat index.html #数据依然存在
hello weixin mqq759035366
[root@k8s-master v2]#
6.1 、 我们每次创建 pvc 的时候,需要事先有划分好的 pv , 这样可能不方便,那么可以在创建 pvc 的时候直接动态创建一个 pv 这个存储类, pv 事先是不存在的;
6.2 pvc 和 pv 绑定,如果使用默认的回收策略 retain ,那么删除 pvc 之后,pv 会处于 released 状态,我们想要继续使用这个 pv ,需要手动删除 pv ,删除 pv ,不会删除 pv里的数据,当我们重新创建 pvc 时还会和这个最匹配的 pv 绑定,数据还是原来数据,不会丢失 。