Kubernetes 持久化存储之 Volume(卷)

Centos 或 Debian 下NFS 的安装。并做为 Kubernetes 持久化存储卷

Posted by Brian on Wednesday, November 1, 2023

背景

Kubernetes 的卷分为临时卷跟持久卷,临时卷顾名思义就是容器销毁后也会被清理。持久卷则不受容器销毁的影响。说白了卷其实就是一个目录,里面存放一些与应用相关的数据文件或资源文件什么的。在使用卷时只需要在 .spce.volumes字段中设置为Pod提供的卷。并在.spce.conatiner[*].volumeMounts 字段中声明卷在容器中的挂载位置即可。

Volume 常用支持的卷

这里有很多的关于存储卷的选择,我个人还是比较喜欢用 NFS。所以接下来我将使用NFS来做为 Kubernetes cluster 的存储卷选择。

voluem-accessmodes

NFS

在正式开始之前假设您已经拥有一个集群,并且有一个 master 节点名为k8s-master,两个Node节点k8s-node01, k8s-node02。接下来我们在节点k8s-master上来安装 NFS 服务,数据目录:/home/k8s

  1. 安装配置 nfs

    # Debian
    apt-get -y install nfs-common nfs-kernel-server rpcbind
    
    # Centos 
    yum -y install nfs-utils rpcbind
    

共享目录设置权限:

mkdir /home/k8s
chmod 755 /home/k8s

配置 nfs,nfs 的默认配置文件在 /etc/exports 文件下,在该文件中添加下面的配置信息:

vim /etc/exports
/var/k8s  *(rw,sync,no_root_squash)

配置说明:

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

当然 nfs 的配置还有很多,感兴趣的同学可以在网上去查找一下。

  1. 启动服务 nfs 需要向 rpc 注册,rpc 一旦重启了,注册的文件都会丢失,向他注册的服务都需要重启

注意启动顺序,先启动 rpcbind

systemctl start rpcbind.service
systemctl enable rpcbind
systemctl status rpcbind

然后启动 nfs 服务:

# Debian
systemctl start nfs-server
systemctl enable nfs-server
systemctl status nfs-server

# Centos
$ systemctl start nfs.service
$ systemctl enable nfs
$ systemctl status nfs

另外我们还可以通过下面的命令确认下:

rpcinfo -p|grep nfs

 100003    3   tcp   2049  nfs
 100003    4   tcp   2049  nfs
 100003    3   udp   2049  nf

查看具体目录挂载权限:

cat /var/lib/nfs/etab

/home/k8s       *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)

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

# Debian
apt-get -y install nfs-common rpcbind


# Centos
$ yum -y install nfs-utils rpcbind

安装完成后,和上面的方法一样,先启动 rpc、然后启动 nfs.

  1. 挂载数据目录 客户端启动完成后,我们在客户端来挂载下 nfs 测试下:

首先检查下 nfs 是否有共享目录:

showmount -e k8s-master
 
Export list for k8s-master:
/home/k8s

然后我们在客户端上新建目录:

mkdir -p /root/course/kubeadm/data

将 nfs 共享目录挂载到上面的目录:

mount -t nfs k8s-master:/home/k8s /root/course/kubeadm/data

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

# k8s-node01 exec command
touch /root/course/kubeadm/data/node01.txt

# k8s-node02 exec command
touch /root/course/kubeadm/data/node02.txt

然后在 nfs 服务端查看:

ls -ls /home/k8s/

total 0
0 -rw-r--r-- 1 root root 0 Jul 18 16:27 node01.txt
0 -rw-r--r-- 1 root root 0 Jul 18 16:27 node02.txt

如果上面出现了的文件,那么证明我们的 nfs 挂载成功了。

要在客户端每次启动时自动挂载NFS,可以编辑/etc/fstab,添加一行:

k8s-master:/home/k8s /root/course/kubeadm/data nfs rsize=8192,wsize=8192,timeo=14,intr