1、NFS介绍
NFS(Network File System)是一种分布式文件系统协议,允许客户端远程访问服务器上的文件,实现数据共享。它整合多个存储设备为统一文件系统,方便数据存储和管理,支持负载均衡和故障转移,确保服务高可用和可扩展。但需注意,NFS依赖网络环境,网络状况影响其性能,且配置管理需技术经验。
nfs端口:2049
RPC端口:111w
nfs原理
工作原理主要基于客户端-服务器架构。在NFS环境中,服务器端运行NFS服务,将本地文件系统中的文件共享给网络上的其他计算机。客户端通过挂载远程NFS共享,可以像访问本地文件系统一样访问这些共享文件。
NFS 使用RPC(Remote Procedure Call)的机制进行实现,RPC使得客户端可以调用服务端的函数。同时,由于有 VFS 的存在,客户端可以像使用其它普通文件系统一样使用 NFS 文件系统。经由操作系统的内核,将 NFS 文件系统的调用请求通过 TCP/IP 发送至服务端的 NFS 服务。NFS服务器执行相关的操作,并将操作结果返回给客户端。
1.首先服务器端启动RPC服务,并开启111端口
2.服务器端启动NFS服务,并向RPC注册端口信息
3.客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4.服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5.客户端通过获取的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。
2、NFS服务部署
在NFS服务器端的主要配置文件为/etc/exports时,通过此配置文件可以设置共享文件目录。每条配置记录由NFS共享目录、NFS客户端地址和参数这3部分组成,格式如下:
[NFS共享目录] [NFS客户端地址1(参数1,参数2,参数3……)]
NFS共享目录:服务器上共享出去的文件目录;
NFS客户端地址:允许其访问的NFS服务器的客户端地址,可以是客户端IP地址,也可以是一个网段(192.168.64.0/24);
访问参数:括号中逗号分隔项,主要是一些权限选项。
访问权限参数
选项 | 描述 |
---|---|
ro | 客户端对于共享文件目录为只读权限。(默认设置) |
rw | 客户端对共享文件目录具有读写权限。 |
Kubernetes的NFS存储用于将某事先存在的NFS服务器导出export的存储空间挂载到Pod中来供Pod容器使用。与emptyDir不同的是,NFS存储在Pod对象终止后仅是被卸载而非删除。另外,NFS是文件系统及共享服务,它支持同时存在多路挂载请求。定义NFS存储时,常用到以下字段。
2.1安装nfs服务 (服务端配置)
#ubuntu部署
sudo apt install nfs-kernel-server
#centos部署
yum -y install rpcbind nfs-util
#创建要共享的目录
mkdir /data/redis -p #/data/redis:NFS服务要共享的目录
#编辑NFS配置并加入以下内容
vim /etc/exports #NFS的配置文件,默认文件内容为空(无任何共享)
/data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check,no_root_squash)
#载入配置
exportfs -rv
/data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check,no_root_squash)
/data/redis 192.168.31.0/24(rw,no_root_squash) #两者效果一样
#设置/redis为共享目录,允许192.168.31.0/24网段的IP地址主机访问,也可以写 * ,表示所有地址都可以访问NFS服务
#rw:访问到此目录的服务器都具备读写权限
#sync:数据同步写入内存和硬盘 默认同步,可不写入
#no_all_squash:所有用户对根目录具备完全管理访问权限 默认禁用all_squash,可不写入
#no_subtree_check:不检查父目录的权限 默认禁用subtree_check,可不写入
#root_squash选项会将这个root用户映射成一个非特权用户,此处禁用 no_root_squash
2.2启动NFS服务
#ubuntu启动
systemctl start nfs-kernel-server
#centos启动
systemctl start rpcbind //一定要先开启rpcbind服务
systemctl start nfs //如服务已启动,更改完配置信息后需要重启服务
设置开机自启
systemctl enable rpcbind
systemctl enable nfs-server
2.3 服务检查
showmount -e localhost
exportfs -v
可以看到redis共享目录信息
2.4 客户端配置
1.1.检查并安装软件
rpm -q rpcbind nfs-utils
yum install -y rpcbind nfs-utils
systemctl start rpcbind && systemctl start nfs
systemctl enable rpcbind && systemctl enable nfs-server
2.将共享目录挂载到本地
mount -t nfs 服务端地址:/共享目录 /mnt
showmount -e 服务端地址
2.5 服务测试
在服务端共享目录创建文件,在客户端挂载目录可以看到
cd /data/redis
echo "hello world" >>hello.txt
cd /mnt/ && cat hello.txt
注:也可以客户端写入,服务端查看 (客户端需要有权限)
3、nfs作为存储卷使用
3.1 nfs作为volume
nfs可以直接作为存储卷使用
下面是一个redis部署的YAML配置文件。在此示例中,redis在容器中的持久化数据保存在/data目录下;存储卷使用nfs,nfs的服务地址为:192.168.8.150,存储路径为:/k8s-nfs/redis/data。容器通过volumeMounts.name的值确定所使用的存储卷。
vi redis.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: redis
spec:
selector:
matchLabels:
app: redis
revisionHistoryLimit: 2
template:
metadata:
labels:
app: redis
spec:
containers:
# 应用的镜像
- image: redis
name: redis
imagePullPolicy: IfNotPresent
# 应用的内部端口
ports:
- containerPort: 6379
name: redis6379
env:
- name: ALLOW_EMPTY_PASSWORD
value: "yes"
- name: REDIS_PASSWORD
value: "redis"
# 持久化挂接位置,在docker中
volumeMounts:
- name: redis-persistent-storage
mountPath: /data
volumes:
# 宿主机上的目录
- name: redis-persistent-storage
nfs:
path: /data/redis
server: 192.168.200/30
kubectl apply -f redis.yaml
3.2 nfs存储的缺点
基于上述过程可以发现用户在使用nfs或者其他类似的存储时,要求较高:
1、需要了解底层存储用的是什么
2、需要存储服务器的地址,以及因此带来的安全问题
3、在存储服务器创建相应的存储目录
因此,为了能够屏蔽底层存储实现的细节,方便用户使用, kubernetes引入PV和PVC两种资源对象。
3.3 nfs作为PersistentVolum
在Kubernetes当前版本的中,可以创建类型为nfs的持久化存储卷,用于为PersistentVolumClaim提供存储卷。在下面的PersistenVolume YAML配置文件中,定义了一个名为nfs-pv的持久化存储卷,此存储卷提供了5G的存储空间,只能由一个PersistentVolumClaim进行可读可写操作。此持久化存储卷使用的nfs服务器地址为192.168.5.150,存储的路径为/tmp。
vi nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions:
- hard
- nfsvers=4.1
# 此持久化存储卷使用nfs插件
nfs:
# nfs共享目录为/data/redis
path: /data/redis
# nfs服务器的地址
server: 192.168.200.30
通过执行如下的命令可以创建上述持久化存储卷:
kubectl create -f nfs-pv.yaml
存储卷创建成功后将处于可用状态,等待PersistentVolumClaim使用。PersistentVolumClaim会通过访问模式和存储空间自动选择合适存储卷,并与其进行绑定。
4、nfs作为动态存储提供
部署nfs-provisioner 实现PV 动态供给(StorageClass)直通车
5、总结
1.NFS服务多用于局域网内
2.共享目录权限要适应实际生产环境
3.搭建服务时一定要先启动rpc后启动nfs
4.配置文件中的信息格式一定要对,否则报错
参考资料
1.《Persistent Volumes》地址:https://kubernetes.io/docs/concepts/storage/persistent-volumes/
2.《Storage Classes》地址:https://kubernetes.io/docs/concepts/storage/storage-classes/
3.《Dynamic Volume Provisioning》地址:https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/
4.《Volums》地址:
https://kubernetes.io/docs/concepts/storage/volumes/
5.《nfs》地址:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs