[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC

网友投稿 280 2022-11-03

[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

​目录​

​​第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章 PV+PVC概述

1.1 NFS网络文件系统面临的问题

(1)需要在Client端手工创建共享目录

(2)Pod消亡后,手工创建的目录不会自动删除,需要手工删除和unmount

(3)无法控制pod对共享文件目录所占用的存储空间大小进行限制,有可能一个pod会把整个共享存储空间全部沾满,缺少安全控制机制。

(4)Pod与NFS之间强关联

1.2 PV+PVC的引入

为了解决上述问题,K8S在NFS和Pod之间增加了PV+PVC层。

PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由k8s管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

如下图所示, 用户通过PVC接口实现数据的持久化, 而PV实现了与具体底层文件系统的绑定。

PV+PVC的引入,成功解决了单纯使用NFS遇到的问题。

关于PV+PVC的进一步的原理,请参考:

第2章 如何使用PV创建静态持久化存储区

2.1 前置条件(在NFS server上执行)

PV是构建在NFS或其他网络文件系统之上的,因此需要先创建NFS网络文件系统

[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]# lsv1 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 -eExport 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

2.2 PV的配置文件(在NFS server或Client上执行,都可以)

apiVersion: v1kind: PersistentVolumemetadata: name: pv001 labels: name: pv001spec: nfs: path: /nfs/volumes/v1 server: 172.24.130.172 accessModes: ["ReadWriteMany","ReadWriteOnce"] capacity: storage: 1Gi---apiVersion: v1kind: PersistentVolumemetadata: name: pv002 labels: name: pv002spec: nfs: path: /nfs/volumes/v2 server: 172.24.130.172 accessModes: ["ReadWriteMany","ReadWriteOnce"] capacity: storage: 2Gi---apiVersion: v1kind: PersistentVolumemetadata: name: pv003 labels: name: pv003spec: nfs: path: /nfs/volumes/v3 server: 172.24.130.172 accessModes: ["ReadWriteMany","ReadWriteOnce"] capacity: storage: 3Gi---apiVersion: v1kind: PersistentVolumemetadata: name: pv004 labels: name: pv004spec: nfs: path: /nfs/volumes/v4 server: 172.24.130.172 accessModes: ["ReadWriteMany","ReadWriteOnce"] capacity: storage: 4Gi---apiVersion: v1kind: PersistentVolumemetadata: name: pv005 labels: name: pv005spec: 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

2.3 使用PV创建持久化空间

$ kubectl apply -f pv.yaml

2.4 检查当前的PV

[root@k8s-node1 ~]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv001 1Gi RWO,RWX Retain Available 39spv002 2Gi RWO,RWX Retain Available 39spv003 3Gi RWO,RWX Retain Available 39spv004 4Gi RWO,RWX Retain Available 39spv005 5Gi RWO,RWX Retain Available 39s

备注:

pv的创建可以在NFS Server执行,也可以在NFS Client上执行,K8S kubectl屏蔽了这些差别。

第3章 如何使用PVC动态申请持久化存储空间

3.1 PVC的配置文件 (通常是有Client上的Pod来申请)

apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mypvc namespace: defaultspec: accessModes: ["ReadWriteMany"] resources: requests: storage: 4Gi---apiVersion: v1kind: Podmetadata: name: pod-vol-pvc namespace: defaultspec: 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共享存储空间。

3.2 使用PVC申请持久化空间

$ kubectl apply -f pvc.yaml

3.3 检查当前的PVC, PV

[root@k8s-node1 ~]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpv001 1Gi RWO,RWX Retain Bound default/mypvc1 12mpv002 2Gi RWO,RWX Retain Available 12mpv003 3Gi RWO,RWX Retain Available 12mpv004 4Gi RWO,RWX Retain Bound default/mypvc 12mpv005 5Gi RWO,RWX Retain Available 12m[root@k8s-node1 ~]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmypvc Bound pv004 4Gi RWO,RWX 5m7smypvc1 Bound pv001 1Gi RWO,RWX 2m9s

第4章 pod对持久化空间的使用(同NFS)

4.1 进入pod内部

(1)通过dashboard进入

(2)通过命令行方式进入

[root@k8s-node1 ~]# kubectl get podNAME READY STATUS RESTARTS AGEmy-deploy-8686b49bbd-b8w65 1/1 Running 0 7h9mmy-deploy-8686b49bbd-f2m4c 1/1 Running 0 7h8mmy-deploy-8686b49bbd-jz5cx 1/1 Running 0 7h9mnginx-pv-demo-db866fc95-6d9nz 1/1 Running 0 63mnginx-pv-demo-db866fc95-qpx48 1/1 Running 0 63mpod-vol-pvc 1/1 Running 0 6m23s$ kubectl exec -it pod-vol-pvc -- /bin/sh

4.2 进入通过PVC申请的共享储存区

pvc申请的共享存储空间,有大小限值限值,受到PV分配的共享存储区大小的限制。

cd /usr/share/nginx/html//usr/share/nginx/html # lsv4.txt

4.3 在共享储存区生成文件

# 在pod中深处持久化文件$ touch pod-v4.txt# master上检查[root@k8s-master1 v4]# lspod-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/目录中也可以看到。

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[云原生专题-41]:K8S - 核心概念 - Service业务的统一网关接口Ingress详解、安装、常见操作命令
下一篇:MIPI A-PHY是什么?汽车SerDes接口的用途及作用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~