[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址: https://blog.csdn.net/HiWangWenBing/article/details/122832783
目录
2.2 PV的配置文件(在NFS server或Client上执行,都可以)
3.1 PVC的配置文件 (通常是有Client上的Pod来申请)
第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(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向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 v1,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
2.2 PV的配置文件(在NFS server或Client上执行,都可以)
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
2.3 使用PV创建持久化空间
$ kubectl apply -f pv.yaml
2.4 检查当前的PV
[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屏蔽了这些差别。
第3章 如何使用PVC动态申请持久化存储空间
3.1 PVC的配置文件 (通常是有Client上的Pod来申请)
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共享存储空间。
3.2 使用PVC申请持久化空间
$ kubectl apply -f pvc.yaml
3.3 检查当前的PVC, PV
[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
第4章 pod对持久化空间的使用(同NFS)
4.1 进入pod内部
(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
4.2 进入通过PVC申请的共享储存区
pvc申请的共享存储空间,有大小限值限值,受到PV分配的共享存储区大小的限制。
cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
v4.txt
4.3 在共享储存区生成文件
# 在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/目录中也可以看到。
参考:
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122832783
以上是关于[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC的主要内容,如果未能解决你的问题,请参考以下文章
[云原生专题-43]:K8S - 核心概念 - placeholder - 加密数据
[云原生专题-42]:K8S - 核心概念 - placeholder-有状态服务
[云原生专题-40]:K8S - 核心概念 - 网络模型网络通信集群内负载均衡机制(重要重要重要)
[云原生专题-33]:K8S - 核心概念 - 服务Service管理服务发现负载均衡