网络文件系统(NFS, Network File System)
是一种分布式文件系统,目的是让客户端主机访问服务器端文件,并且过程时与访问本地存储是一样。
说明
NFS 服务端和客户端服务均依赖于 rpcbind
,
rpcbind
是一个将 RPC(Remote Procedure Call,远程过程调用)
程序编号转换为通用地址的服务,RPC
调用依赖 rpcbind
服务。
服务:
- rpc.nfsd NFS 主进程,通过
systemctl start nfs-utils.service
启动,监听 TCP/UDP 2049 端口 - rpc.mountd 监听在 TCP/UDP 20048 端口
- rpc.lockd(可选,防止多个客户端同时写入一个文件)
- rpc.statd(可选,负责数据的状态及一致性检查)
- rpcbind 依赖进程,通过
systemctl start rpcbind.service
启动,监听在 TCP/UDP 20048 端口
配置文件:
- /etc/nfs.conf
- /etc/nfsmount.conf
部署
本次部署直接关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
服务端安装
# CentOS
yum install -y nfs-utils
# Ubuntu
apt install nfs-kernel-server
注意:安装 nfs-utils
时,会自动安装 rpcbind
systemctl enable rpcbind.service
systemctl enable nfs-server.service
systemctl start rpcbind.service
systemctl start nfs-server.service
/etc/exports
文件中一行表示一个共享目录。格式如下:
共享目录路径 IP或主机名1(选项1,选项2,...) IP或主机名2(选项1,选项3,...) ...
选项说明:
选项 | 功能 |
---|
ro | 以只读方式共享(默认) |
rw | 以读写方式共享 |
sync | 客户端写入的数据立即写入到磁盘中(默认) |
async | 客户端写入的数据先写入到内存中,再写入磁盘中 |
root_squash | 把 root 用户映射为匿名用户(默认) |
no_root_squash | 允许使用 root 用户 |
all_squash | 把所有用户映射为匿名用户 |
anonuid=<UID> | 指定匿名用户的 UID |
anongid=<GID> | 指定匿名用户的 GID |
secure | 允许客户端使用小于 1024 的端口连接 |
insecure | 允许客户端使用大于 1024 的端口连接 |
subtree_check | 共享子目录时,强制检查父目录权限(默认) |
no_subtree_check | 不检查父目录权限 |
wdelay | 多个用户要写入 NFS 目录,则归组写入(默认) |
no_wdelay | 多个用户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置 |
示例:
$ cat /etc/exports
/home *(rw,no_subtree_check,fsid=10,no_root_squash)
/opt 10.0.0.1(rw,all_squash) 10.0.0.2(ro,no_root_squash)
注意:
- 配置后需要重启
systemctl restart nfs-server
或执行 exportfs -rv
或执行 exportfs -a
。
$ showmount -e <nfs-server>
$ showmount -e 172.20.100
Export list for 172.20.100:
/home *
/opt 10.0.0.2,10.0.0.1
k8s 部署
使用
客户端
yum install nfs-utils
mount.nfs 172.20.0.100:/home /mnt/
echo "172.20.0.100:/home /home nfs nfsvers=3,nodev,nosuid 0 0" >> /etc/fstab
mount -a
配置基于 RDMA 的 NFS 服务
# 加载rdma内核模块
# 服务端
modprobe xprtrdma
# 客户端
modprobe svcrdma
# 服务端监听 RDMA 传输端口
$ echo 'rdma 20049' | tee /proc/fs/nfsd/portlist
$ cat /proc/fs/nfsd/portlist
rdma 20049
rdma 20049
udp 2049
tcp 2049
udp 2049
tcp 2049
# 挂载
$ mount -t nfs <nfs-server-ip>:/ /mnt/ -o vers=4.1,_netdev,rdma,port=20049,hard,intr,noatime,nodiratime,async,nolock,noacl,sec=sys,noresvport
k8s 使用
- nfs-subdir-external-provisioner 是 k8s 中,支持在一个远程 NFS 服务器上的动态子目录卷供应器
- PV 以目录名为
${namespace}-${pvcName}-${pvName}
的格式在 NFS 服务器上创建 - 回收的格式为
archieved-${namespace}-${pvcName}-${pvName}
F&Q
Unable to mount network drive in Debian; error is “mount(2) system call failed: No route to host.”
sudo apt-get install keyutils cifs-utils