kubernetes持久化NFS

IT
IT
IT
405
文章
1
评论
2020年8月27日14:30:44 评论 5,365 7698字阅读25分39秒

概念

PV 的全称是:PersistentVolume(持久化卷),是对底层的共享存储的一种抽象,PV 由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS 等,都是通过插件机制完成与共享存储的对接。

PVC 的全称是:PersistentVolumeClaim(持久化卷声明),PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

但是通过 PVC 请求到一定的存储空间也很有可能不足以满足应用对于存储设备的各种需求,而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速度、并发性能等,为了解决这一问题,Kubernetes 又为我们引入了一个新的资源对象:StorageClass,通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等,用户根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用的特性去申请合适的存储资源了。

  • 节点
172.21.212.155 k8s-master
172.21.212.156 k8s-node1
172.21.212.157 k8s-node2

NFS

我们这里为了演示方便,决定使用相对简单的 NFS 这种存储资源,接下来我们在节点10.10.1.34上来安装 NFS 服务,数据目录:/data/devops

  • 安装配置nfs服务端
[root@k8s-master ~]# yum -y install nfs-utils -y rpcbind
  • 共享目录设置权限
 [root@iZ0jl4dahgopda92qitm77Z ~]# mkdir -p /data/devops
[root@iZ0jl4dahgopda92qitm77Z ~]# chmod 755 /data/devops
  • 配置 nfs,nfs 的默认配置文件在 /etc/exports 文件下,在该文件中添加下面的配置信息:
[root@k8s-master ~]# vim /etc/exports
/data/devops *(rw,no_root_squash,sync)

配置说明:

  • /data/devops:是共享的数据目录
  • *:表示任何人都有权限连接,当然也可以是一个网段,一个 IP,也可以是域名
  • rw:读写的权限
  • sync:表示文件同时写入硬盘和内存
  • no_root_squash:当登录 NFS 主机使用共享目录的使用者是 root 时,其权限将被转换成为匿名使用者,通常它的 UID 与 GID,都会变成 nobody 身份

当然 nfs 的配置还有很多,感兴趣的同学可以在网上去查找一下。

启动rpcbind

[root@iZ0jl4dahgopda92qitm77Z ~]# systemctl start rpcbind
[root@iZ0jl4dahgopda92qitm77Z ~]# systemctl enable rpcbind
[root@iZ0jl4dahgopda92qitm77Z ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-12-08 22:37:52 CST; 874ms ago
Main PID: 5366 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─5366 /sbin/rpcbind -w

Dec 08 22:37:52 iZ0jl4dahgopda92qitm77Z systemd[1]: Starting RPC bind service...
Dec 08 22:37:52 iZ0jl4dahgopda92qitm77Z systemd[1]: Started RPC bind service.

然后启动 nfs 服务:

[root@iZ0jl4dahgopda92qitm77Z ~]# systemctl restart nfs
[root@iZ0jl4dahgopda92qitm77Z ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@iZ0jl4dahgopda92qitm77Z ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Tue 2020-12-08 22:38:40 CST; 814ms ago
Main PID: 5722 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service

Dec 08 22:38:40 iZ0jl4dahgopda92qitm77Z systemd[1]: Starting NFS server and services...
Dec 08 22:38:40 iZ0jl4dahgopda92qitm77Z systemd[1]: Started NFS server and services.

同样看到 Started 则证明 NFS Server 启动成功了。

另外我们还可以通过下面的命令确认下:

[root@k8s-master ~]# rpcinfo -p|grep nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl

查看具体目录挂载权限

[root@matser ~]# cat /var/lib/nfs/etab
/data/devops *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)

到这里我们就把 nfs server 给安装成功了,接下来我们在其他节点上来安装 nfs 的客户端来验证下 nfs

[root@k8s-node1 ~]# yum -y install nfs-utils rpcbind
[root@k8s-node2 ~]# yum -y install nfs-utils rpcbind

安装完成后,和上面的方法一样,先启动 rpc、然后启动 nfs:

[root@iZ0jl4dahgopda92qitm75Z ~]# systemctl start rpcbind
[root@iZ0jl4dahgopda92qitm75Z ~]# systemctl enable rpcbind
[root@iZ0jl4dahgopda92qitm75Z ~]# systemctl start nfs
[root@iZ0jl4dahgopda92qitm75Z ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
  1. 挂载数据目录 客户端启动完成后,我们在客户端来挂载下 nfs 测试下:

首先检查下 nfs 是否有共享目录:

[root@iZ0jl4dahgopda92qitm76Z ~]# showmount -e 172.21.212.155
Export list for 172.21.212.155:
/home/www.centoscn.vip *

将 nfs 共享目录挂载到上面的目录

[root@node1 ~]# mkdir /data/devops
mkdir: 无法创建目录"/data/devops": 没有那个文件或目录
[root@node1 ~]# mkdir /data/devops -p
[root@node1 ~]# mount -t nfs 192.168.90.19:/data/devops /data/devops
[root@node1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 0 1.4G 0% /dev/shm
tmpfs 1.4G 12M 1.4G 1% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/sda3 17G 5.2G 12G 31% /
/dev/sda1 1014M 142M 873M 15% /boot
tmpfs 1.4G 12K 1.4G 1% /var/lib/kubelet/pods/ca153c35-cf4d-4524-85c3-c47ef761b0fe/volumes/kubernetes.io~secret/flannel-token-fwxvf
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/90e791e9169d5140b7c92169d4d20041b94b5bd66798382a76150c8e69c7a260/merged
shm 64M 0 64M 0% /var/lib/docker/containers/e36c857c4ddf7890d6f2dfc036564d3e6d93c89daa903278b0d9f3430e735497/mounts/shm
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/f7e6269d4bc771ab5506b105ee221665cd807ea4c306b1fa93c34f23d2892040/merged
tmpfs 1.4G 12K 1.4G 1% /var/lib/kubelet/pods/ef085bb9-a811-43e0-b14b-f913e612c954/volumes/kubernetes.io~secret/nginx-ingress-serviceaccount-token-2hrwv
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/55e400f5da0f574c2fcfdf9a508504b6a55b60a8a7ea63d47e556938f39cfa90/merged
shm 64M 0 64M 0% /var/lib/docker/containers/b45c6579802763b2f6584f644e58c0fa4d213f6ef524671b1436d92a25d5974b/mounts/shm
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/fa9734538e9ab502f888709d8be8a0118658535cfccd80bdc1a9845bdde82593/merged
tmpfs 1.4G 12K 1.4G 1% /var/lib/kubelet/pods/515ff99e-a0fd-49f2-8c53-b3debde93941/volumes/kubernetes.io~secret/kubernetes-dashboard-token-vfd7d
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/0f99c849b1be818ca6f67fba7663c7bff7352582916d59f0a445d1baa0d3e2c5/merged
shm 64M 0 64M 0% /var/lib/docker/containers/b9916e172c8471055f6767dac277c220c05ab9a2df1d4bbdd822c9723bd2818b/mounts/shm
tmpfs 1.4G 12K 1.4G 1% /var/lib/kubelet/pods/28688003-1596-4e90-9ed7-c95ed8d811ce/volumes/kubernetes.io~secret/default-token-lsmxp
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/98fd5cd68e78d87f4250778b694a6a35185fce2e11ac1a32069df338ccf0393c/merged
shm 64M 0 64M 0% /var/lib/docker/containers/b4955c841ffe4bc71e23658e7e74784445e7e61ec40ed7323df1d0213c1992c9/mounts/shm
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/1f27b2c02df5bc3103a846b6fa0f550b933d492535cd71f6de2be7e2258d8d53/merged
tmpfs 279M 0 279M 0% /run/user/0
overlay 17G 5.2G 12G 31% /var/lib/docker/overlay2/8c5dd1deb4a258985c7eef089f09f761ba36b0b2c43cb7c19022ee949dc80c9c/merged
192.168.90.19:/data/devops 17G 7.5G 9.6G 44% /data/devops

PV

有了上面的 NFS 共享存储,下面我们就可以来使用 PV 和 PVC 了。PV 作为存储资源,主要包括存储能力、访问模式、存储类型、回收策略等关键信息,下面我们来新建一个 PV 对象,使用 nfs 类型的后端存储,1G 的存储空间,访问模式为 ReadWriteOnce,回收策略为 Recyle,对应的 YAML 文件如下:(pv1-demo.yaml)

[root@iZ0jl4dahgopda92qitm77Z ~]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1 #pv名称
spec:
capacity: #存储能力,一个pv对象都要指定一个存储能力,目前仅支持存储空间的设置
storage: 3Gi #存储空间
accessModes:
- ReadWriteMany #访问模式
persistentVolumeReclaimPolicy: Recycle #回收策略
nfs: #服务模式 (nfs、ceph、hostpath等)
path: /data1/k8s-volume #共享数据目录挂载点
server: 172.21.212.155 #nfs服务器地址

p.tar

Kubernetes 支持的 PV 类型有很多,比如常见的 Ceph、GlusterFs、NFS,甚至 HostPath也可以,不过 HostPath 我们之前也说过仅仅可以用于单机测试,更多的支持类型可以前往 Kubernetes PV 官方文档进行查看,因为每种存储类型都有各自的特点,所以我们在使用的时候可以去查看相应的文档来设置对应的参数。

然后同样的,直接使用 kubectl 创建即可:

[root@iZ0jl4dahgopda92qitm77Z ~]# kubectl apply -f pv.yaml
persistentvolume/pv1 created
[root@iZ0jl4dahgopda92qitm77Z ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 3Gi RWX Recycle Available

我们可以看到 pv1 已经创建成功了,状态是 Available,表示 pv1 就绪,可以被 PVC 申请。我们来分别对上面的属性进行一些解读。

Capacity(存储能力)

一般来说,一个 PV 对象都要指定一个存储能力,通过 PV 的 capacity属性来设置的,目前只支持存储空间的设置,就是我们这里的 storage=1Gi,不过未来可能会加入 IOPS、吞吐量等指标的配置。

AccessModes(访问模式)

AccessModes 是用来对 PV 进行访问模式的设置,用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

  • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
  • ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载

注意:一些 PV 可能支持多种访问模式,但是在挂载的时候只能使用一种访问模式,多种访问模式是不会生效的。

下图是一些常用的 Volume 插件支持的访问模式: kubernetes持久化NFS

persistentVolumeReclaimPolicy(回收策略)

我这里指定的 PV 的回收策略为 Recycle,目前 PV 支持的策略有三种:

  • Retain(保留)- 保留数据,需要管理员手工清理数据
  • Recycle(回收)- 清除 PV 中的数据,效果相当于执行 rm -rf /thevoluem/*
  • Delete(删除)- 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务,比如 ASW EBS。

不过需要注意的是,目前只有 NFS 和 HostPath 两种类型支持回收策略。当然一般来说还是设置为 Retain 这种策略保险一点。

状态

一个 PV 的生命周期中,可能会处于4中不同的阶段:

  • Available(可用):表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定):表示 PVC 已经被 PVC 绑定
  • Released(已释放):PVC 被删除,但是资源还未被集群重新声明
  • Failed(失败): 表示该 PV 的自动回收失败
继续阅读
  • 我的QQ
  • QQ扫一扫
  • weinxin
  • 我的头条
  • 头条扫一扫
  • weinxin
IT
  • 本文由 发表于 2020年8月27日14:30:44
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
NFS安装配置 CentOS

NFS安装配置

环境 两台服务器:一个服务端一个客户端 192.168.1.94 服务端 192.168.1.95 客户端 安装 服务端和客户端都安装 # yum install -y nfs-utils rpcbi...
Kubernetes安装Jenkins Jenkins

Kubernetes安装Jenkins

简述 持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程,然而传统的 Jenkins Slave 一主多从方式会存在一些痛点,...
Ansible自动化部署K8S集群 Ansible

Ansible自动化部署K8S集群

Ansible介绍 Ansible是一种IT自动化工具。它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新。Ansible适用于管理企业IT基础设施,从具有少数主机的小规模到数千...

您必须才能发表评论!