文章目录
- 前言
- [一、emptyDir 存储卷](#一、emptyDir 存储卷)
-
- [1.1 emptyDir存储卷特点](#1.1 emptyDir存储卷特点)
- [1.2 案例](#1.2 案例)
- [二、hostPath 存储卷](#二、hostPath 存储卷)
-
- [3.1 特点](#3.1 特点)
- [3.2 案例](#3.2 案例)
- [四、NFS 网络共享存储卷](#四、NFS 网络共享存储卷)
-
- [4.1 特点](#4.1 特点)
- [4.2 案例](#4.2 案例)
- [五、PV 与 PVC 持久化机制](#五、PV 与 PVC 持久化机制)
-
- [5.1 PV与PVC的概念](#5.1 PV与PVC的概念)
- [5.2 PV和PVC生命周期](#5.2 PV和PVC生命周期)
- [5.3 PV的状态](#5.3 PV的状态)
- [5.4 NFS + PV + PVC 实战(静态存储)](#5.4 NFS + PV + PVC 实战(静态存储))
- [六、StorageClass + NFS动态存储](#六、StorageClass + NFS动态存储)
-
- [6.1 原理](#6.1 原理)
- [6.2 操作实践](#6.2 操作实践)
- 总结
前言
本文重点讲解k8s集群数据存储的几种方式,大家都知道k8s数据是非常重要的,一旦丢失,那么集群中的所有业务都会停止运行,因此数据存储就显得非常重要。
一、emptyDir 存储卷
1.1 emptyDir存储卷特点
1、Pod 调度到节点时自动创建;
2、Pod 删除后数据也随之销毁;
3、仅适合临时缓存或容器间数据共享。
4、同一个pod中的容器与容器之间进行数据共享
1.2 案例
第一步 创建pod容器(这里以nginx与busybox为例,共享卷的名字为html)

第二步 访问nginx的挂载文件

二、hostPath 存储卷
3.1 特点
1、将节点(宿主机)上的目录挂载到容器;
2、可实现持久化;
3、但节点故障会导致数据丢失。
3.2 案例
第一步 在node节点上创建一个挂载目录和文件,并在文件中写入一些数据

第二步 创建yaml文件

第三步 尝试访问nginx容器

(可以发现有之前节点文件的数据,挂载成功)
四、NFS 网络共享存储卷
4.1 特点
1、多节点共享数据;
2、数据集中存放于 NFS 服务端;
3、支持 RWX(多路读写)。
原理:通过rpcbind和nfs服务将客户端的数据传到对应的node节点。
rpcbind服务与nfs服务的作用:
简单来说:rpcbind是用于找到对端(这里指node1)的,nfs是用于共享数据的,因此在启动操作时要先启动rpcbind服务再启动nfs服务
4.2 案例
第一步 在客户端安装nfs与rpcbind服务
yum install rpcbind nfs-utils ------------------------------------------安装rpcbind与nfs服务

第二步 创建要挂载(共享)的文件


第三步 配置nfs配置文件(填写允许共享的ip或ip网段、文件路径以及权限)

重启nfs与rpcbind服务
systemctl restart rpcbind
systemctl restart nfs

第四步 在10.0.0.2创建主机映射
vim /etc/hosts ------------------------------------编辑主机映射文件

第五步 创建yaml文件

第六步 尝试访问容器,看看是否将共享数据传到容器中的挂载目录

五、PV 与 PVC 持久化机制
5.1 PV与PVC的概念
pv是服务端定义的存储资源
pvc是客户端定义的pv资源需求
(也就是PVC 必须与对应的 PV 建立关系,PVC 会根据配置的定义去 PV 申请,而 PV 是由存储空间创建出来的。PV 和 PVC 是 Kubernetes 抽象出来的一种存储资源)
pvc在选择pv资源时,会优先选择资源完全匹配的pv,以防止资源浪费,其次会在资源大于需求并且最接近的pv。
5.2 PV和PVC生命周期
1、Provisioning:即 PV 的创建,可以直接创建 PV(静态方式),也可以使用 StorageClass 动态创
2、Binding:将 PV 分配给 PVC。
3、Using:Pod 通过 PVC 使用该 Volume,并可以通过准入控制StorageProtection(1.9及以前版本
为PVCProtection) 阻止删除正在使用的 PVC
4、Releasing:Pod 释放 Volume 并删除 PVC
5、Reclaiming:回收 PV,可以保留 PV 以便下次使用,也可以直接从云存储中删除
PV和PVC之间的相互作用遵循这个生命周期:
Provisioning(配置)--> Binding(绑定)--> Using(使用)--> Releasing(释放)-->
Recycling(回收)
5.3 PV的状态
根据这 5 个阶段,PV 的状态有以下 4 种:
Available(可用):表示可用状态,还未被任何 PVC 绑定
Bound(已绑定):表示 PV 已经绑定到 PVC
Released(已释放):表示 PVC 被删掉,但是资源尚未被集群回收
Failed(失败):表示该 PV 的自动回收失败
5.4 NFS + PV + PVC 实战(静态存储)
第一步 在客户端创建nfs共享数据的目录和文件

第二步 修改nfs共享数据的配置文件

第三步 创建pv


第四步 创建pvc


因为这里pv2的资源和pvc所需标准一样,所以会绑定到pv2
第五步 创建pod


第六步 尝试访问pod容器

数据同步成功
六、StorageClass + NFS动态存储
6.1 原理

大致原理:由于k8s本身支持的动态pv不包括nfs,所以需要外部插件,外部卷插件称为 Provisioner(存储分配器),而外部插件进入集群需要有账号与角色权限去创建pv,整个存储流程就是先创建k8s集群账号和角色,然后让角色与账号互相绑定,之后创建nfs插件,让他分配pv,pv在整个过程中会自动创建,因为外部网络插件不能直接由pvc调用,所以还需要创建stroageclass去调用外部存储插件,pvc在去调用storageclass,最后创建pod,这是操作流程,实际上的存储流程是反过来的。
流程:客户端指定要同步的数据,并编写了pvc用于提出需求,pvc通过storageclass调用nfs存储插件。
6.2 操作实践
第一步 创建数据同步的目录和文件

第二步 修改nfs配置文件


第三步 创建账号和角色权限,并且绑定角色与账号


第四步 创建nfs存储插件(会自动创建一个pv)
由于 1.20 版本启用了 selfLink,所以 k8s 1.20+ 版本通过 nfs provisioner 动态生成pv会报错,因此要修改apiversion的yaml文件



第五步 创建storageclass


第六步 创建pvc


第七步 创建pod


第八步 验证
在nfs客户端的共享存储目录中创建一个文件

查看容器的/mnt目录下有没有文件

(成功将共享文件传入pod容器)
总结
本文重点讲解k8s集群数据存储的几种方式,大家都知道k8s数据是非常重要的,一旦丢失,那么集群中的所有业务都会停止运行,因此数据存储就显得非常重要。希望本文内容能对您有所帮助,谢谢观看😜