最近在学习Kubernetes的时候需要将pod内的数据进行持久化,既然要持久化就需要从k8s集群外引入存储,所以很自然就想到了NFS。这一节记录下Centos7中搭建NFS文件服务器的过程。

我是T型人小付,一位坚持终身学习的互联网从业者。如果有问题欢迎在底下的评论区交流,谢谢。


文章目录

  • NFS
  • NFS和RPC
  • 安装
  • 配置
  • Linux客户端连接
  • Windows10客户端连接


NFS

和Windows中的SMB协议很像,NFS(Network File System)是类Unix系统中的文件共享协议。目的就是将服务端的一个目录分享到指定网络,网络内的客户端可以将共享出来的目录锚定到本地的一个目录,像对待本地磁盘一样操作远程目录。

SMB和NFS这两种协议在Windows和Linux中都可以混合使用,只不过SMB通常用作Windows,而NFS通常用作Linux。

NFS和RPC

RPC(Remote Procedure Call)是一个端口转发小插件,是NFS的一个辅助工具。

因为NFS支持的功能相当多,而不同的功能会使用不同的端口来传输数据,因此NFS的功能对应的端口很多而且并不固定。客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的一种服务。RPC会收集NFS所使用的端口,同时对外统一开放111端口。客户端访问111端口就知道要去哪个端口访问NFS服务。

所以在启动NFS之前,首先要启动RPC,否则NFS就无法向RPC服务注册。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行systemctl reload nfs或exportfs –rv即可使修改的/etc/exports生效。

安装

所以安装就非常简单,分别安装NFS和RPC两个服务即可

yum install -y nfs-utils rpcbind

配置

NFS的配置文件在/etc/exports,这是一个空文件,需要手动输入内容。每一行代表一条NFS分享目录及其配置,格式如下

export host(options)

注意host和后面的括号之间没有任何空格,不然会出现权限配置问题

其中

  • export - 被分享的目录
  • host - 目标设备,通常是一个网段
  • options - 共享权限参数

如果针对不同网段要设置不同的权限,可用如下方法

export host1(options1) host2(options2) host3(options3)

其中的共享权限参数可选如下的一个或多个

参数

说明

ro

(默认)客户端只读权限

rw

客户端有读写权限

sync

(默认)如果有写动作未完成,NFS服务端不会进行读操作

async

允许异步写操作

root_squash

(默认)将客户端的root用户变为服务端的nfsnobody用户进行操作

no_root_squash

取消root_squash操作

all_squash

将客户端的所有用户都变为服务端的nfsnobody用户进行操作

首先创建用于分享的文件夹

mkdir -p /share/nfs

然后添加如下的权限到文件中

/share/nfs 172.29.0.0/16(rw,sync,root_squash)

之后就可以启动服务了,记住先启动RPC再启动NFS

systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server

看到111端口起来表明可以被连接了,同时记得防火墙允许INPUT的111端口。

Linux客户端连接

在需要访问的客户端也安装nfs-utils,但是并不需要启动。然后可以使用showmount命令查看远程的分享信息

[root@k8s-node1 hostpath]# showmount -e 172.29.56.177
Export list for 172.29.56.177:
/share/nfs 172.29.0.0/16

其中几个常用参数含义如下

参数

含义

-e

显示远程机器的分享信息

-a

显示本机的NFS连接信息

-v

显示版本信息

然后创建一个用于文件夹做为锚点

[root@k8s-node1 hostpath]# cd /mnt
[root@k8s-node1 mnt]# mkdir nfs
[root@k8s-node1 mnt]# mount -t nfs 172.29.56.177:/share/nfs /mnt/nfs

在服务端创建一个文件,如果发现客户端锚点也出现文件这说明锚定成功。并且会发现文件的权限和拥有者和组都是和服务端一样的,所以要注意权限的设置。

当然上面用mount命令的方式只是临时的,可以编辑/etc/fstab文件达到永久锚定的目的,添加如下一行

172.29.56.177:/share/nfs /mnt/nfs     nfs    defaults  0 0

Windows10客户端连接

网上有很多类似的文章,首先要打开NFS客户端服务,然后挂载网络硬盘。我试了很多方法,一直会报网络错误53。

Network Error - 53

不管我修改服务端insecure还是各种方式连接都会报错,后来放弃。告诉自己,Linux乖乖用NFS,Windows乖乖用SMB。