Kubernetes持久化数据存储-PV

前⾯我们学习了⼀些基本的资源对象的使用方法,前⾯我们也讲到了有状态的应用和对数据有持久化的应用,我们通过 hostPath 或者 emptyDir 的方式来持久化我们的数据,但是显然我们还需要更加可靠的存储来保存应用的持久化数据,这样容器在重建后,依然可以使用之前的数据。但是显然存储资源和 CPU 资源以及内存资源有很⼤不同,为了屏蔽底层的技术实现细节,让用户更加⽅便的使用,Kubernetes 便引入了 PV 和 PVC 两个重要的资源对象来实现对存储的管理。今天我们就来看看什么是PV 和 PVC?

1、核心概念

PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的⼀种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现⽅式有关,⽐如 Ceph、GlusterFS、NFS 等,都是通过插件机制完成与共享存储的对接。

PVC 的全称是:PersistentVolumeClaim(持久化卷声明),PVC 是用户存储的⼀种声明,PVC 和Pod ⽐较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

但是通过 PVC 请求到⼀定的存储空间也很有可能不足以满足应用对于存储设备的各种需求,而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速度、并发性能等,为了解决这⼀问题,Kubernetes 又为我们引入了⼀个新的资源对象:StorageClass,通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等,用户根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用的特性去申请合适的存储资源了。

2、NFS

NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过网络共享资源。将NFS主机分享的目录,挂载到本地客户端当中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,在客户端端看起来,就像访问本地文件一样。

RPC,基于C/S模型。程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需知道网络细节,甚至可以请求对方的系统调用。 对于Linux而言,文件系统是在内核空间实现的,即文件系统比如ext3、ext4等是在Kernel启动时,以内核模块的身份加载运行的。

NFS本身的服务并没有提供数据传递的协议,而是通过使用RPC(远程过程调用 Remote Procedure Call)来实现。当NFS启动后,会随机的使用一些端口,NFS就会向RPC去注册这些端口。RPC就会记录下这些端口,RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前,首先要确保rpc服务启动。

img

NFS服务安装

这里为了演示方便,我们使用相对简单的 NFS 这种存储资源,接下来我们在Master节点上安装 NFS 服务,数据目录:/data/k8s/

首先我们关闭防火墙并安装配置NFS服务端:

# 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

# 安装NFS
yum -y install nfs-utils rpcbind

# 配置共享目录设置权限:
chmod 755 /data/k8s/

# 配置 nfs,nfs 的默认配置⽂件在 /etc/exports ⽂件下,在该⽂件中添加下⾯的配置信息:
vi /etc/exports
/data/k8s *(rw,sync,no_root_squash) # 任何人可以访问读写权限、同时写入硬盘和内存

配置说明:

  • /data/k8s:是共享的数据目录;
  • * :表示任何⼈都有权限连接,当然也可以是⼀个网段,⼀个 IP;也可以是域名;
  • rw:读写的权限;
  • sync:表示文件同时写入硬盘和内存;
  • no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份

当然 nfs 的配置还有很多,感兴趣的同学可以自己去百度。

然后我们启动服务,nfs 需要向 rpc 注册,rpc ⼀旦重启了,注册的⽂件都会丢失,向他注册的服务都需要重启:

注:注意启动顺序,先启动 rpcbind

img

看到上面的 Started 证明启动成功了。然后我们启动 nfs 服务,同样看到 Started 则证明 NFS Server 启动成功了。另外我们还可以通过 rpcinfo -p|grep nfs 命令确认下;也可以通过 cat /var/lib/nfs/etab 命令查看具体目录挂载权限:

img

到这里我们就把 nfs server 给安装成功了,接下来我们在Node01节点上安装 nfs 的客户端来验证 nfs。

NFS客户端安装

首先我们还是先关闭防火墙,然后安装配置NFS客户端:

# 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

# 安装NFS
yum -y install nfs-utils rpcbind

# 安装完成后,和上⾯的⽅法⼀样,先启动 rpc、然后启动 nfs:
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs

安装完成以后挂载数据目录,客户端启动完成后,我们在客户端来挂载下 nfs 并测试。⾸先检查 nfs 是否有共享目录:

# 检查nfs是否有共享目录
[root@Node01 ~]# showmount -e 172.16.200.1
Export list for 172.16.200.1:
/data/k8s *
[root@Node01 ~]#

# 在客户端上新建⽬录:
mkdir -p /root/course/kubeadm/data

# 将 nfs 共享⽬录挂载到上⾯的目录:
mount -t nfs 172.16.200.1:/data/k8s /root/course/kubeadm/data

挂载成功后,在客户端上⾯的目录中新建⼀个文件,然后我们观察下 nfs 服务端的共享目录下面是否也会出现该文件:

img

然后在 nfs 服务端查看是否有该文件:

[root@Master ~]# ls -ls /data/k8s/
total 0
0 -rw-r--r-- 1 root root 0 Mar 18 20:35 test.txt
[root@Master ~]#

如果上面出现了 test.txt 的文件,就证明 nfs 挂载成功了。

3、PV

有了上面的 NFS 共享存储,下⾯我们就可以来使用 PV 和 PVC 了。PV 作为存储资源,

主要包括存储能力、访问模式、存储类型、回收策略等关键信息,下⾯我们来新建⼀个 PV 对象,使用 nfs 类型的后端存储,1G 的存储空间,访问模式为 ReadWriteOnce,回收策略为 Recyle,对应的 YAML 文件如下:(pv1-demo.yaml)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/k8s
    server: 172.16.200.1

Kubernetes ⽀持的 PV 类型有很多,比如常见的 Ceph、GlusterFs、NFS,甚至 HostPath也可以,不过 HostPath 我们之前也说过仅仅可以用于单机测试,更多的⽀持类型可以前往 Kubernetes PV官方文档进行查看,因为每种存储类型都有各自的特点,所以我们在使用的时候可以去查看相应的⽂档来设置对应的参数。

然后同样的,直接使用 kubectl 创建即可:

img

我们可以看到 pv1 已经创建成功了,状态是 Available,表示 pv1 就绪,可以被 PVC 申请。我们来分别对上⾯的属性进行⼀些解读。

4、PV属性

Capacity(存储能力)

⼀般来说,⼀个 PV 对象都要指定⼀个存储能力,通过 PV 的 capacity属性来设置的,目前只支持存储空间的设置,就是我们这里的 storage=1Gi,不过未来可能会加入 IOPS、吞吐量等指标的配置。

AccessModes(访问模式)

AccessModes 是用来对 PV 进⾏访问模式的设置,用于描述⽤户应用对存储资源的访问权限,访问权限包括下⾯几种方式:

  • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载;
  • ReadOnlyMany(ROX):只读权限,可以被多个节点挂载;
  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载。

注:有⼀些 PV 可能支持多种访问模式,但是在挂载的时候只能使用⼀种访问模式,多种访问模式是不会生效的。下图是⼀些常用的 Volume 插件支持的访问模式:

img

persistentVolumeReclaimPolicy(回收策略)

我们这里指定的 PV 的回收策略为 Recycle,目前 PV 支持的策略有三种:

  • Retain(保留)- 保留数据,需要管理员手工清理数据;
  • Recycle(回收)- 清除 PV 中的数据,效果相当于执⾏ rm -rf /thevoluem/*;
  • Delete(删除)- 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务,比如 ASW EBS。

不过需要注意的是,目前只有 NFS 和 HostPath 两种类型⽀持回收策略。当然⼀般来说还是设置为Retain 这种策略保险⼀点。

状态

⼀个 PV 的⽣命周期中,可能会处于4中不同的阶段:

  • Available(可⽤):表示可⽤状态,还未被任何 PVC 绑定;
  • Bound(已绑定):表示 PVC 已经被 PVC 绑定;
  • Released(已释放):PVC 被删除,但是资源还未被集群重新声明;
  • Failed(失败): 表示该 PV 的自动回收失败。

这就是 PV 的声明方法,后面我们继续学习 PVC 的使用方法。

推荐文章