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

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC相关的知识,希望对你有一定的参考价值。

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_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章 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的进一步的原理,请参考:

https://blog.csdn.net/HiWangWenBing/article/details/122820381https://blog.csdn.net/HiWangWenBing/article/details/122820381

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

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

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 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/目录中也可以看到。


参考:

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

以上是关于[云原生专题-38]:K8S - 核心概念 - 存储抽象- 空间大小可配置的目录挂载PV+PVC的主要内容,如果未能解决你的问题,请参考以下文章

[云原生专题-43]:K8S - 核心概念 - placeholder - 加密数据

[云原生专题-42]:K8S - 核心概念 - placeholder-有状态服务

[云原生专题-40]:K8S - 核心概念 - 网络模型网络通信集群内负载均衡机制(重要重要重要)

[云原生专题-33]:K8S - 核心概念 - 服务Service管理服务发现负载均衡

[云原生专题-39]:K8S - 核心概念 - 存储抽象- pod配置文件的挂载ConfigMap

[云原生专题-32]:K8S - 核心概念 - 工作负载资源之Depolyment(无状态应用)的概念与常见操作命令