搭建本地单点nfs服务器

465 阅读7分钟

使用情景

#devops #kubernetes  使用kubernetes时,大家都习惯使用nfs作为动态存储提供

 当然,如果在云服务器端,也可以使用他们提供的provider。

 以华为云为例,使用他们提供的云容器引擎 CCE,可以使用云硬盘来做为pv。当然前提你有足够的money去cover整个CCE的费用(非高可用4200/year,高可用12600/year)。如果只是自己实践或者想自己来构建整个kubernetes系统,那最后的方案就是使用nfs来做为pv。

 对于华为云系统来说,我们可用选用sfs turbo来做为我们的nfs,标准版(时延2-5ms)1800元/500G/year的费用还是可用接受的。如果后续业务量上来,对于性能要求更高时,可用使用sfs turbo的增强版本(时延1-2ms)7200元/500G/year也是可用接受的。

 因此,我们构建测试环境时,就自己构建单机版的nfs服务器。正式环境中,选用华为云的sfs turbo来做为nfs服务器,这样避免为了高可用时,还得构建nfs服务器高可用,非常麻烦,性价比不高。从而我们本文就着重说明在centos8系统中搭建本地单点nfs服务器。

安装软件

服务器端

sudo yum install -y nfs-utils rpcbind
sudo systemctl enable rpcbind
sudo systemctl start rpcbind
sudo systemctl enable nfs-server
sudo systemctl start nfs-server

客户端

sudo yum install -y nfs-utils

服务器配置

  1. 创建特定的用户名
  2. 创建共享目录
  3. 编辑/etc/exports

创建特定用户名

sudo useradd nfs -s /bin/bash

建立共享目录

sudo mkdir -p /data/share/

sudo chown -R nfs:nfs /data/share

获取nfs的uid和gid

id nfs

uid=700(nfs) gid=1000(nfs) groups=1000(nfs)

用于下面的/etc/exports的anongid={gid}和anonuid={uid}

编辑 vim /etc/exports

vim /etc/exports
/data/share/ 192.168.0.0/16(rw,sync,all_squash,insecure,no_subtree_check,anongid=1000,anonuid=700)

启用/etc/exports的配置

sudo exportfs -r

检查当前的状态

服务器端调用 rpcinfo -p 和 nfsstat -s 可以查看当前的状态

# 在服务端执行,查看nfs状态信息
nfsstat -s

# 在客户端执行,查看nfs挂载信息
nfsstat -m

# 查看服务端的远程共享信息,此命令会调用服务端的20048端口
showmount -e 192.168.202.151

# 查看rpcbind注册的所有端口号
rpcinfo -p

# 在服务端执行,重新挂载/etc/exports中配置
exportfs -r

客户端加载nfs

假设当前服务器的ip地址: 192.168.1.101

sudo mkdir -p /opt/nfs
sudo mount -t nfs 192.168.1.101:/data/share /opt/nfs -o vers=4,timeo=600,noresvport,nolock

如果成功,可以进入/opt/nfs进行操作共享的文件夹

故障trouble shooting

mount.nfs: Cannot allocate memory

sudo mount -t nfs 192.168.1.101:/data/share /opt/nfs -o vers=3,timeo=600,noresvport,nolock mount.nfs: clnt_dg_create: out of memory mount.nfs: Cannot allocate memory 上面的错误,可能是nfs版本不匹配导致的.

在服务器上通过

nfsstat -s 查看当前nfs的版本

如果看到Server nfs v4输出,则当前的版本是ver4.

将上面的版本改成4之后,问题解决

sudo mount -t nfs 192.168.1.101:/data/share /opt/nfs -o vers=4,timeo=600,noresvport,nolock

mount.nfs: Operation not permitted

如果出现此错误,一般是当前的nfs端口超过1024导致的.

sudo mount -t nfs 192.168.1.101:/data/share /opt/nfs -o vers=4,timeo=600,noresvport,nolock mount.nfs: Operation not permitted

在服务器端/etc/exports中增加insecure

vim /etc/exports /data/share/ 192.168.0.0/16(rw,sync,all_squash,insecure,no_subtree_check,anongid=1000,anonuid=700) sudo exportfs -r

nfs的配置选项

/etc/exports配置说明

配置的说明:

  • ro:只读设置,这样 NFS 客户端只能读、不能写(默认设置);
  • rw:读写设置,NFS 客户端可读写;
  • sync:将数据同步写入磁盘中,效率低,但可以保证数据的一致性(默认设置);
  • async:将数据先保存在内存缓冲区中,必要时才写入磁盘;如果服务器重新启动,这种行为可能会导致数据损坏,但效率高
  • root_squash:当客户端用 root 用户访问该共享文件夹时,将 root 用户映射成匿名用户(默认设置);
  • no_root_squash:客户端的 root 用户不映射。这样客户端的 root 用户与服务端的 root 用户具有相同的访问权限,这可能会带来严重的安全影响。没有充分的理由,不应该指定此选项;
  • all_squash:客户端所有普通用户及所属组都映射为匿名用户及匿名用户组;「推荐设置
  • no_all_squash:客户端所有普通用户及所属组不映射(默认设置);
  • subtree_check:如果共享,如:/usr/bin之类的子目录时,强制NFS检查父目录的权限;
  • no_subtree_check:即使共享 NFS 服务端的子目录时,nfs服务端也不检查其父目录的权限,这样可以提高效率(默认设置)
  • secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
  • insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
  • wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
  • no_wdelay:若有写操作则立即执行,当使用async时,无需此设置;
  • anonuid=xxx:将远程访问的所有用户主都映射为匿名用户主账户,并指定该匿名用户主为本地用户主(UID=xxx);
  • anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组为本地用户组(GID=xxx);
  • anonuid/anongid :要和root_squash 以及all_squash一同使用,用于指定使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中存在这个uid和gid。
  • fsid=0表示将/opt/nfs整个目录包装成根目录

mount nfs配置选项

  • rsize=1048576— 设置 NFS 客户端对每个网络 READ 请求可以接收的数据最大字节数。在从 EFS 文件系统上的文件读取数据时应用此值。我们建议您尽可能使用最大的大小(最多 1048576),以避免性能下降。

  • wsize=1048576— 设置 NFS 客户端对每个网络 WRITE 请求可以发送的数据最大字节数。在将数据写入到 EFS 文件系统上的文件时应用此值。我们建议您尽可能使用最大的大小(最多 1048576),以避免性能下降。

  • hard— 设置 NFS 客户端在 NFS 请求超时之后的恢复行为,这样 NFS 请求在服务器回复之前会无限重试。建议您使用硬挂载选项 (hard) 以确保数据完整性。如果您使用 soft 挂载,请将 timeo 参数至少设置为 150 分秒(15 秒)。这样做可尽量减少源自软挂载的数据损坏风险。

  • timeo=600— 将超时值设置为 600 分秒(60 秒),这是 NFS 客户端在重试 NFS 请求之前等待响应的时间。如果您必须更改超时参数 (timeo),我们建议您使用至少为 150 的值,这相当于 15 秒。这样做有助于避免性能下降。

  • lock/nolock 选择是否使用NLM协议在服务器上锁文件。当选择nolock选项时,锁对于同一主机的应用有效,对不同主机不受锁的影响。建议值:nolock。如不加此参数,则默认为lock,就会发生其他服务器无法对此文件系统写入的情况。

  • retrans=2— 将 NFS 客户端重试请求的次数设置为 2,超过此次数之后将尝试进一步的恢复操作。

  • noresvport— 告知 NFS 客户端在重新建立网络连接时,使用新的传输控制协议 (TCP) 源端口。这样做有助于确保 EFS 文件系统在网络恢复事件后具有不间断的可用性。

  • _netdev— 当存在于/etc/fstab,阻止客户端尝试挂载 EFS 文件系统,直到启用了网络。

  • nofail— 如果需要启动您的 EC2 实例而不考虑挂载的 EFS 文件系统的状态,请将nofail选项将文件系统条目添加到您的/etc/fstab文件。