Kubernetes 卷存储 NFS | nfs搭建配置 原理介绍 nfs作为存储卷使用

本文详细介绍了NFS的基本概念、工作原理,以及如何在服务器端和客户端进行部署,特别关注了NFS在Kubernetes中的应用,包括作为存储卷、PV和PVC的使用,以及动态存储的实现。

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-utils

#创建要共享的目录
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值