转:https://www.cnblogs.com/DaweiJ/articles/9131762.html

1 NFS介绍

NFS是Network File System的简写,即网络文件系统,NFS是FreeBSD支持的文件系统中的一种。NFS基于RPC(Remote Procedure Call)远程过程调用实现,其允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序就可以像访问本地文件一样访问远端系统上的文件。NFS是一个非常稳定的,可移植的网络文件系统。具备可扩展和高性能等特性,达到了企业级应用质量标准。由于网络速度的增加和延迟的降低,NFS系统一直是通过网络提供文件系统服务的有竞争力的选择 。

1.1 NFS原理

NFS 使用RPC(Remote Procedure Call)的机制进行实现,RPC使得客户端可以调用服务端的函数。同时,由于有 VFS 的存在,客户端可以像使用其它普通文件系统一样使用 NFS 文件系统。经由操作系统的内核,将 NFS 文件系统的调用请求通过 TCP/IP 发送至服务端的 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。

1.2 共享配置

在NFS服务器端的主要配置文件为/etc/exports时,通过此配置文件可以设置共享文件目录。每条配置记录由NFS共享目录、NFS客户端地址和参数这3部分组成,格式如下:

[NFS共享目录] [NFS客户端地址1(参数1,参数2,参数3……)] [客户端地址2(参数1,参数2,参数3……)]

  • NFS共享目录:服务器上共享出去的文件目录;

  • NFS客户端地址:允许其访问的NFS服务器的客户端地址,可以是客户端IP地址,也可以是一个网段(192.168.64.0/24);

  • 访问参数:括号中逗号分隔项,主要是一些权限选项。

1)访问权限参数

2)用户映射参数 图表

3)其它配置参数 图表

2 NFS服务端配置

在nfs作为网络文件存储系统前,首先,需要安装nfs和rpcbind服务;接着,需要创建使用共享目录的用户;然后,需要对共享目录进行配置,这是其中相对重要和复杂的一个步骤;最后,需要启动rpcbind和nfs服务,以供应用使用。

2.1 安装nfs服务

1)通过yum目录安装nfs服务和rpcbind服务:

1
rpcinfo -p localhost

  

2)检查nfs服务是否正常安装

1
rpcinfo -p localhost

2.2 创建用户

为NFS服务其添加用户,并创建共享目录,以及设置用户设置共享目录的访问权限:

1
2
3
useradd  nfs
mkdir -p /nfs-share
chmod a+w /nfs-share

2.3 配置共享目录

在nfs服务器中为客户端配置共享目录:

1
echo "/nfs-share 172.16.0.0(rw,async,no_root_squash)" >> /etc/exports

通过执行如下命令是配置生效:

1
exportfs -r

2.4 启动服务

1)由于必须先启动rpcbind服务,再启动nfs服务,这样才能让nfs服务在rpcbind服务上注册成功:

1
systemctl start rpcbind

  

2)启动nfs服务:

1
systemctl start nfs-server

3)设置rpcbind和nfs-server开机启动:

1
2
systemctl enable rpcbind
systemctl enable nfs-server

2.5 检查nfs服务是否正常启动

1
2
showmount -e localhost
mount -t nfs 127.0.0.1:/data /mnt

3 NFS作为Volume

nfs可以直接作为存储卷使用,下面是一个redis部署的YAML配置文件。在此示例中,redis在容器中的持久化数据保存在/data目录下;存储卷使用nfs,nfs的服务地址为:192.168.8.150,存储路径为:/k8s-nfs/redis/data。容器通过volumeMounts.name的值确定所使用的存储卷。

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: /k8s-nfs/redis/data
server: 192.168.8.150

4 NFS作为PersistentVolum

在Kubernetes当前版本的中,可以创建类型为nfs的持久化存储卷,用于为PersistentVolumClaim提供存储卷。在下面的PersistenVolume YAML配置文件中,定义了一个名为nfs-pv的持久化存储卷,此存储卷提供了5G的存储空间,只能由一个PersistentVolumClaim进行可读可写操作。此持久化存储卷使用的nfs服务器地址为192.168.5.150,存储的路径为/tmp。

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共享目录为/tmp
path: /tmp
# nfs服务器的地址
server: 192.168.5.150

通过执行如下的命令可以创建上述持久化存储卷:

kubectl create -f {path}/nfs-pv.yaml

存储卷创建成功后将处于可用状态,等待PersistentVolumClaim使用。PersistentVolumClaim会通过访问模式和存储空间自动选择合适存储卷,并与其进行绑定。

注:

  1、安装NFS系统的虚拟机要把防火墙关闭,Centos7使用systemctl stop firewalld。否则k8s中的pod在挂载NFS时,可能会出现No route to host。

2、挂载问题:mount.nfs: access denied by server while mounting /home/zzx/f12440/driver,解决办法是在NFS系统里,修改exports文件

使配置文件生效

(转)k8s存储之NFS的更多相关文章

  1. (转)原理到实现 | K8S 存储之 NFS

    转:https://mp.weixin.qq.com/s/Mrr1Rnl_594Gyyn9fHekjw 1NFS介绍 NFS是Network File System的简写,即网络文件系统,NFS是Fr ...

  2. 网络共享存储服务NFS

    网络共享存储服务NFS 作者:Eric 微信:loveoracle11g 环境准备 服务器系统 角色 IP RHEL 7.5 x86-64 NFS服务端 192.168.10.201 RHEL 7.5 ...

  3. k8s 存储 nfs服务

    1.所有节点安装nfs yum install nfs-utils -y 2.配置nfs服务端,在master节点上 vim exports /data 10.0.0.0/24(rw,async,no ...

  4. k8s存储卷概述

    pod本身具有生命周期,故其内部运行的容器及其相关数据自身均无法持久存在.docker支持配置容器使用存储卷将数据持久存储于容器自身文件系统之外的存储空间中,它们可以是节点文件系统或网络文件系统之上的 ...

  5. 6.k8s.存储Volume.PV.PVC

    #Volume Volume 解决数据持久化和容器间共享数据 Kubernetes支持几十种类型的后端存储卷 #hostPath挂载实例,挂载Node节点/tmp/test-volume目录到容器/t ...

  6. 4.k8s存储之Volume、PV、PVC和StatefulSet

    3.Volume 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的 ...

  7. Flink使用Pod Template将状态快照(Checkpoint、Savepoint)存储在NFS

    背景 Flink 版本 1.13.3,使用 native k8s 部署模式,原采用 HDFS 作为状态快照(Checkpoint.Savepoint)的存储地址,但是由于仅使用了其 HDFS 作为状态 ...

  8. K8s存储卷、pv和pvc的使用

    emptyDIR 临时目录 hostPath :使用主机的路径 网络存储: 传统的设备存储:NAS,SAN 分布式存储:glusterfs,rbd,cephfs 云存储:EBS,Azure,阿里云的 ...

  9. k8s storageClass对接nfs

    前提:已存在一个nfs服务 192.168.137.11:/home/nfs_data 下面以rbac方式对接nfs 1.创建/root/k8s-nfs-rbac/serviceaccount.yam ...

随机推荐

  1. Run Your Tensorflow Deep Learning Models on Google AI

    People commonly tend to put much effort on hyperparameter tuning and training while using Tensoflow& ...

  2. EasyUI的datagrid有值但是显示不出来

    $("#goodsList").datagrid({  url: "../Ajax/GoodsAjax.ashx",  queryParams:  {  cmd ...

  3. c# 调用 webService

    开局几张  照着做就完事 说明下 这个wsdl 文件是根据别人提供的webService 接口 打开后改变后缀来的 这样就引用完成了 接下来就是重点了  怎么调用 localhost.WsSyncDu ...

  4. Communications link failure mysql自动停止 连接拒绝 mysqld dead but sub。。。

    服务器环境中 JAVA 连接数据库 Communications link failure, Contection refused 网上很多这种情况,解决基本上是将127.0.0.1换成localho ...

  5. for in 和for of的区别

    for in 和for of的区别:https://www.jianshu.com/p/c43f418d6bf0 1 遍历数组通常用for循环 ES5的话也可以使用forEach,ES5具有遍历数组功 ...

  6. 77.LRU Cache(最近最久未使用算法)

    Level:   Hard 题目描述: Design and implement a data structure for Least Recently Used (LRU) cache. It sh ...

  7. redis命令行命令

    配置文件设置密码认证 修改redis.conf去掉#requirepass foobared前面的#,foobared就是密码,可以进行修改 redis命令设置密码认证config set requi ...

  8. ssh-agent - 认证代理

    总览 (SYNOPSIS) ssh-agent [-a bind_address ] [-c | -s ] [-t life ] [-d ] [command [args ... ] ] ssh-ag ...

  9. MySQL MHA之 master_ip_failover.sh脚本

    master_ip_failover.sh脚本是用perl编写的,可以在mha-manager源码包中可以找到,下面给出的结合keepalived进行自动切换的脚本: [root@mha script ...

  10. vscode舒适的字体风格

    首选项-->设置-->输入setting.json-->查找到设置文件 添加如下配置 "editor.tabSize": 2, "files.assoc ...