Kubernetes 数据持久化准备

Posted by 彭楷淳 on 2021-02-27
Estimated Reading Time 6 Minutes
Words 1.7k In Total
Viewed Times

概述


在 Docker 中就有数据卷的概念,当容器删除时,数据也一起会被删除,想要持久化使用数据,需要把主机上的目录挂载到 Docker 中去,在 K8S 中,数据卷是通过 Pod 实现持久化的,如果 Pod 删除,数据卷也会一起删除,k8s 的数据卷是 docker 数据卷的扩展,K8S 适配各种存储系统,包括本地存储 EmptyDir,HostPath, 网络存储(NFS,GlusterFS,PV/PVC)等。

我们以部署 MySQL8 为例,采用 NFS + PV/PVC 网络存储方案实现我们的 Kubernetes 数据持久化。

什么是 NFS


NFS 是 Network File System 的简写,即网络文件系统,NFS 是 FreeBSD 支持的文件系统中的一种。NFS 基于 RPC (Remote Procedure Call) 远程过程调用实现,其允许一个系统在网络上与它人共享目录和文件。通过使用 NFS,用户和程序就可以像访问本地文件一样访问远端系统上的文件。NFS 是一个非常稳定的,可移植的网络文件系统。具备可扩展和高性能等特性,达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS 系统一直是通过网络提供文件系统服务的有竞争力的选择 。

NFS 原理


NFS 使用 RPC (Remote Procedure Call) 的机制进行实现,RPC 使得客户端可以调用服务端的函数。同时,由于有 VFS 的存在,客户端可以像使用其它普通文件系统一样使用 NFS 文件系统。经由操作系统的内核,将 NFS 文件系统的调用请求通过 TCP/IP 发送至服务端的 NFS 服务。NFS 服务器执行相关的操作,并将操作结果返回给客户端。

NFS 服务主要进程


  • rpc.nfsd:最主要的 NFS 进程,管理客户端是否可登录
  • rpc.mountd:挂载和卸载 NFS 文件系统,包括权限管理
  • rpc.lockd:非必要,管理文件锁,避免同时写出错
  • rpc.statd:非必要,检查文件一致性,可修复文件

NFS 的关键工具


  • 主要配置文件:/etc/exports
  • NFS 文件系统维护命令:/usr/bin/exportfs
  • 共享资源的日志文件:/var/lib/nfs/*tab
  • 客户端查询共享资源命令:/usr/sbin/showmount
  • 端口配置:/etc/sysconfig/nfs

NFS 服务端配置


在 NFS 服务器端的主要配置文件为 /etc/exports 时,通过此配置文件可以设置共享文件目录。每条配置记录由 NFS 共享目录、NFS 客户端地址和参数这 3 部分组成,格式如下:

1
[NFS 共享目录] [NFS 客户端地址 1 (参数 1, 参数 2, 参数 3……)] [客户端地址 2 (参数 1, 参数 2, 参数 3……)]
  • NFS 共享目录:服务器上共享出去的文件目录
  • NFS 客户端地址:允许其访问的 NFS 服务器的客户端地址,可以是客户端 IP 地址,也可以是一个网段 (192.168.141.0/24)
  • 访问参数:括号中逗号分隔项,主要是一些权限选项

访问权限参数

序号 选项 描述
1 ro 客户端对于共享文件目录为只读权限。默认
2 rw 客户端对于共享文件目录具有读写权限

用户映射参数

序号 选项 描述
1 root_squash 使客户端使用 root 账户访冋时,服务器映射为服务器本地的匿名账号
2 no_root_squash 客户端连接服务端时如果使用的是 root,那么也拥有对服务端分享的目录的 root 权限
3 all_squash 将所有客户端用户请求映射到匿名用户或用户组(nfsnobody)
4 no_all_squash 与上相反。默认
5 anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx)
6 anongid=xxx 将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GUI=xxx)

其它配置参数

序号 选项 描述
1 sync 同步写操作,数据写入存储设备后返回成功信息。默认
2 async 异步写提作,数据在未完全写入存储设备前就返回成功信息,实际还在内存,
3 wdelay 延迟写入选项,将多个写提请求合并后写入硬盘,减少 I/O 次数, NFS 非正常关闭数据可能丢失。默认
4 no_wdelay 与上相反,不与 async 同时生效,如果 NFS 服务器主要收到小且不相关的请求,该选项实际会降低性能
5 subtree 若输出目录是一个子目录,则 NFS 服务器将检查其父目录的权限。默认
6 no_subtree 即使输出目录是一个子目录, NFS 服务器也不检查其父目录的权限,这样可以提高效率
7 secure 限制客户端只能从小于 1024 的 TCP/IP 端口连接 NFS 服务器。默认
8 insecure 允许客户端从大于 1024 的 TCP/IP 端口连接服务器

安装 NFS 服务端


由于 NFS 是一套分布式文件系统,我们再创建一台独立的虚拟机作为我们 NFS 服务端,配置如下

主机名 IP 系统 CPU/内存 磁盘
kubernetes-volumes 192.168.141.140 Ubuntu Server 18.04 2核2G 20G

创建一个目录作为共享文件目录

1
$ mkdir -p /usr/local/kubernetes/volumes

给目录增加读写权限

1
$ chmod a+rw /usr/local/kubernetes/volumes

安装 NFS 服务端

1
2
$ apt-get update
$ apt-get install -y nfs-kernel-server

配置 NFS 服务目录,打开文件

1
$ vi /etc/exports

在尾部新增一行,内容如下

  • /usr/local/kubernetes/volumes:作为服务目录向客户端开放
  • *:表示任何 IP 都可以访问
  • rw:读写权限
  • sync:同步权限
  • no_subtree_check:表示如果输出目录是一个子目录,NFS 服务器不检查其父目录的权限
1
/usr/local/kubernetes/volumes *(rw,sync,no_subtree_check)

重启服务,使配置生效

安装 NFS 客户端


安装客户端的目的是验证是否可以上传文件到服务端,安装命令如下

1
$ apt-get install -y nfs-common

创建 NFS 客户端挂载目录

1
$ mkdir -p /usr/local/kubernetes/volumes-mount

将 NFS 服务器的 /usr/local/kubernetes/volumes 目录挂载到 NFS 客户端的 /usr/local/kubernetes/volumes-mount 目录

1
$ mount 192.168.141.140:/usr/local/kubernetes/volumes /usr/local/kubernetes/volumes-mount

使用 df 命令查看挂载信息

验证 NFS 服务


测试文件上传

1
$ ip addr > /usr/local/kubernetes/volumes-mount/test.txt

查看 /usr/local/kubernetes/volumes 目录下是否有 test.txt 文件,有则表示成功

取消 NFS 客户端挂载

注意: 不要直接在挂载目录下执行,否则会报错

1
$ umount /usr/local/kubernetes/volumes-mount

If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !