作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址: https://blog.csdn.net/HiWangWenBing/article/details/122832783
目录
第1章 PV+PVC概述
1.1 NFS网络文件系统面临的问题
1.2 PV+PVC的引入
第2章 如何使用PV创建静态持久化存储区
2.1 前置条件(在NFS server上执行)
2.2 PV的配置文件(在NFS server或Client上执行,都可以)
2.3 使用PV创建持久化空间
2.4 检查当前的PV
第3章 如何使用PVC动态申请持久化存储空间
3.1 PVC的配置文件 (通常是有Client上的Pod来申请)
3.2 使用PVC申请持久化空间
3.3 检查当前的PVC, PV
第4章 pod对持久化空间的使用(同NFS)
4.1 进入pod内部
4.2 进入通过PVC申请的共享储存区
4.3 在共享储存区生成文件
参考:
(1)需要在Client端手工创建共享目录
(2)Pod消亡后,手工创建的目录不会自动删除,需要手工删除和unmount
(3)无法控制pod对共享文件目录所占用的存储空间大小进行限制,有可能一个pod会把整个共享存储空间全部沾满,缺少安全控制机制。
(4)Pod与NFS之间强关联
为了解决上述问题,K8S在NFS和Pod之间增加了PV+PVC层。
PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由k8s管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。
PVC(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向k8s系统发出的一种资源需求申请。
如下图所示, 用户通过PVC接口实现数据的持久化, 而PV实现了与具体底层文件系统的绑定。
PV+PVC的引入,成功解决了单纯使用NFS遇到的问题。
关于PV+PVC的进一步的原理,请参考:
https://blog.csdn.net/HiWangWenBing/article/details/122820381https://blog.csdn.net/HiWangWenBing/article/details/122820381
PV是构建在NFS或其他网络文件系统之上的,因此需要先创建NFS网络文件系统
https://blog.csdn.net/HiWangWenBing/article/details/122828322https://blog.csdn.net/HiWangWenBing/article/details/122828322
[root@k8s-master1 nfs]# mkdir volumes
[root@k8s-master1 nfs]# cd volumes
[root@k8s-master1 volumes]# mkdir v{1,2,3,4,5}
[root@k8s-master1 volumes]# ls
v1 v2 v3 v4 v5
[root@localhost volumes]# vi /etc/exports
/nfs/volumes/v1 *(insecure,rw,async,no_root_squash)
/nfs/volumes/v2 *(insecure,rw,async,no_root_squash)
/nfs/volumes/v3 *(insecure,rw,async,no_root_squash)
/nfs/volumes/v4 *(insecure,rw,async,no_root_squash)
/nfs/volumes/v5 *(insecure,rw,async,no_root_squash)
[root@localhost volumes]# exportfs -r
[root@localhost volumes]# showmount -e
Export list for localhost.localdomain:
/nfs/volumes/v5
/nfs/volumes/v4
/nfs/volumes/v3
/nfs/volumes/v2
/nfs/volumes/v1
$ 在共享目录中创建标识性测试文件,用于后期验证
cd /nfs/volumes/
[root@k8s-master1 volumes]# touch ./v1/v1.txt
[root@k8s-master1 volumes]# touch ./v2/v2.txt
[root@k8s-master1 volumes]# touch ./v3/v3.txt
[root@k8s-master1 volumes]# touch ./v4/v5.txt
[root@k8s-master1 volumes]# touch ./v4/v4.txt
[root@k8s-master1 volumes]# touch ./v5/v5.txt
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /nfs/volumes/v1
server: 172.24.130.172
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /nfs/volumes/v2
server: 172.24.130.172
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /nfs/volumes/v3
server: 172.24.130.172
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 3Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /nfs/volumes/v4
server: 172.24.130.172
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /nfs/volumes/v5
server: 172.24.130.172
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 5Gi
关键参数:
server: 172.24.130.172: NFS server的IP地址
/nfs/volumes/v1:NFS server export出来的共享存储区
这就意味着,有PV负责进行底层NFS的映射和mount
$ kubectl apply -f pv.yaml
[root@k8s-node1 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 1Gi RWO,RWX Retain Available 39s
pv002 2Gi RWO,RWX Retain Available 39s
pv003 3Gi RWO,RWX Retain Available 39s
pv004 4Gi RWO,RWX Retain Available 39s
pv005 5Gi RWO,RWX Retain Available 39s
备注:
pv的创建可以在NFS Server执行,也可以在NFS Client上执行,K8S kubectl屏蔽了这些差别。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: default
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 4Gi
---
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-pvc
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: mypvc
mountPath: /usr/share/nginx/html:指定pod的mount路径
storage: 4Gi:申请的磁盘空间的大小。
备注:
PVC不需要知道NFS server共享的NFS文件路径,那是PV的职责。 PVC只需要知道需要申请的磁盘空间的大小,PV会向PVC返回硬盘空间最接近且满足大小要求的NFS共享存储空间。
$ kubectl apply -f pvc.yaml
[root@k8s-node1 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 1Gi RWO,RWX Retain Bound default/mypvc1 12m
pv002 2Gi RWO,RWX Retain Available 12m
pv003 3Gi RWO,RWX Retain Available 12m
pv004 4Gi RWO,RWX Retain Bound default/mypvc 12m
pv005 5Gi RWO,RWX Retain Available 12m
[root@k8s-node1 ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound pv004 4Gi RWO,RWX 5m7s
mypvc1 Bound pv001 1Gi RWO,RWX 2m9s
(1)通过dashboard进入
(2)通过命令行方式进入
[root@k8s-node1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-deploy-8686b49bbd-b8w65 1/1 Running 0 7h9m
my-deploy-8686b49bbd-f2m4c 1/1 Running 0 7h8m
my-deploy-8686b49bbd-jz5cx 1/1 Running 0 7h9m
nginx-pv-demo-db866fc95-6d9nz 1/1 Running 0 63m
nginx-pv-demo-db866fc95-qpx48 1/1 Running 0 63m
pod-vol-pvc 1/1 Running 0 6m23s
$ kubectl exec -it pod-vol-pvc -- /bin/sh
pvc申请的共享存储空间,有大小限值限值,受到PV分配的共享存储区大小的限制。
cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
v4.txt
# 在pod中深处持久化文件
$ touch pod-v4.txt
# master上检查
[root@k8s-master1 v4]# ls
pod-v4.txt v4.txt
[root@k8s-master1 v4]#
在pod的/usr/share/nginx/html/目录中生成持久化文件,在master的/nfs/volumes/v4/中可以看到。
在master的/nfs/volumes/v4/生成的文件,在pod的/usr/share/nginx/html/目录中也可以看到。
k8s的pv和pvc概念 - 不懂123 - 博客园存储卷 同一个pod内的所有容器共享存储 网络 用户等空间 pod内的容器都是以pause镜像为基础镜像来运行的 k8s.gcr.io/pause 3.1 da86e6ba6ca1 17 mon 74https://www.cnblogs.com/yxh168/p/11031003.html
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122832783