kubernetes持久化NFS

IT
IT
IT
335
文章
1
评论
2020年8月27日14:30:44 评论 626 7285字阅读24分17秒

概念

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

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

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

  • 节点
10.10.1.34 k8s-master
10.10.1.35 k8s-node1
10.10.1.36 k8s-node2

NFS

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

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

配置说明:

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

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

然后启动 nfs 服务:

[root@k8s-master ~]# systemctl start nfs.service
[root@k8s-master ~]# 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@k8s-master ~]# 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 Thu 2020-08-27 14:32:18 CST; 13s ago
Main PID: 5066 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service

Aug 27 14:32:18 k8s-master systemd[1]: Starting NFS server and services...
Aug 27 14:32:18 k8s-master 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@k8s-master ~]# cat /var/lib/nfs/etab
/data/nfs *(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@k8s-node1 ~]# systemctl start nfs.service
[root@k8s-node1 ~]# systemctl enable nfs.service
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@k8s-node1 ~]# showmount -e 10.10.1.34
Export list for 10.10.1.34:
/data/nfs *

然后我们在客户端上新建目录

[root@k8s-node1 ~]# mkdir -p /root/course/kubeadm/data

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

[root@k8s-node1 ~]# mount -t nfs 10.10.1.34:/data/nfs /root/course/kubeadm/data
[root@k8s-node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 1.8G 1.5M 1.8G 1% /run
tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
/dev/vda1 40G 3.3G 35G 9% /
tmpfs 1.8G 12K 1.8G 1% /var/lib/kubelet/pods/03bdf2e3-c6b2-4e97-bd3f-b6a7dca0e3e1/volumes/kubernetes.io~secret/kube-proxy-token-kkwhj
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/3026889a493b75832974c8f758a9b2d4e73cf7ac872a35aa6be5c1f1aa1b5586/merged
shm 64M 0 64M 0% /var/lib/docker/containers/f67ef46cbd79905138685b75631c6b491b6f09420bdede19e4472fe91bc412b7/mounts/shm
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/f9507110613dc7b55775354389776130366a04d4ad27275b3d883763aec62214/merged
tmpfs 1.8G 12K 1.8G 1% /var/lib/kubelet/pods/6efac020-9550-461e-970f-8897c06de466/volumes/kubernetes.io~secret/flannel-token-mpknb
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/6bcb4b12c9005bd8abf2d53c1e7157f487df76e6d99abb00b7415c21a94bd019/merged
shm 64M 0 64M 0% /var/lib/docker/containers/540fe3d20eba5f00467502acb763376e9e9a3751c57aaf92ac34372275f210dc/mounts/shm
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/713125e82a82b7bc5c4cafd91ed2440058f1b48c296e66801638acf7c06bb390/merged
tmpfs 1.8G 12K 1.8G 1% /var/lib/kubelet/pods/ffdd76a7-e2ca-43bf-93e4-9439e26deda8/volumes/kubernetes.io~secret/coredns-token-h2rtx
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/f097d40f583efe4148b901861d77db1438fe2f8171340ee924134810812d3e1b/merged
shm 64M 0 64M 0% /var/lib/docker/containers/a22d356a05fd7e5f92aff684ed65f23317077cbc1f1ff31c94d8dc0aa3b1b238/mounts/shm
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/fb95b3363648f0f29eb528382ba53055f009a13e17fdd85010e48cf408262468/merged
tmpfs 1.8G 12K 1.8G 1% /var/lib/kubelet/pods/d31312f6-44cf-475d-9b2c-272b269255f6/volumes/kubernetes.io~secret/default-token-l9tbc
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/4b92f6fd1a5ce76c37a10f1412112c27e69abe02a91f3bd6ebc7a1a7a6591715/merged
shm 64M 0 64M 0% /var/lib/docker/containers/540805a22ee4d7e321e95715e0a5fcfb3d01be6c297e06e00657d8cc7cde8002/mounts/shm
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/54c5ad0a1787b9bba428a4d80ed27a1d46fe19b25d907a14c54755f3908bda29/merged
tmpfs 1.8G 12K 1.8G 1% /var/lib/kubelet/pods/c706a2c2-f6c6-461c-ba36-a7749d111e0d/volumes/kubernetes.io~secret/kubernetes-dashboard-token-wp6dl
tmpfs 1.8G 0 1.8G 0% /var/lib/kubelet/pods/c706a2c2-f6c6-461c-ba36-a7749d111e0d/volumes/kubernetes.io~secret/kubernetes-dashboard-certs
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/62a47e7ee6aca0a5cef54e98436b0ab4a058e8cde9143cedd0303129d56db446/merged
shm 64M 0 64M 0% /var/lib/docker/containers/6f7258ce02f18fa58b72082821f739ee91e659556ce32ba7992e4540b93f98df/mounts/shm
overlay 40G 3.3G 35G 9% /var/lib/docker/overlay2/2462769352b4e60a53e47891fd33ddbb26d81130201f837e25873e5960ba313c/merged
tmpfs 365M 0 365M 0% /run/user/0
10.10.1.34:/data/k8s 40G 3.7G 34G 10% /root/course/kubeadm/data

PV

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

[root@k8s-master ~]# vim pv1-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /data/nfs
server: 10.10.1.34

pv1-demo.yaml.tar

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

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

[root@k8s-master ~]# kubectl create -f pv1-demo.yaml
persistentvolume/pv1 created
[root@k8s-master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 1Gi RWO Recycle Available 8s

我们可以看到 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...
Pod Kubernetes

Pod

Pod基本概念 Pod存在的意义 Pod实现机制与设计模式 Pod镜像拉取策略
资源编排【YMAL】 Kubernetes

资源编排【YMAL】

YAML 基础 它的基本语法规则如下: 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 # 表示注释,从这个字符一直...