跳到主要内容

实战:nfs动态供给安装(helm方式)(测试成功)-2022.8.13 【荐】

实战:nfs动态供给安装(helm方式)(测试成功)-2022.8.13 【荐】

目录

[toc]

环境

  • 实验环境
实验环境:
1、win10,vmwrokstation虚机;
2、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
k8s version:v1.22.2
containerd://1.5.5
  • 实验软件

链接:https://pan.baidu.com/s/166m8lMseErl0wbuQDOUA6w?pwd=y4yi

提取码:y4yi

2022.2.22-44.NFS存储-实验代码

前置条件

  • 已经部署好nfs服务;

前言

K8s默认不支持NFS动态供给,需要单独部署社区开发的插件。

项目地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

有的场景下面需要自动创建 PV,这个时候就需要使用到 StorageClass 了,并且需要一个对应的 provisioner 来自动创建 PV,比如这里我们使用的 NFS 存储,则可以使用 nfs-subdir-external-provisioner 这个 Provisioner,它使用现有的和已配置的NFS 服务器来支持通过 PVC 动态配置 PV,持久卷配置为 ${namespace}-${pvcName}-${pvName}

1、安装nfs服务

nfs server端配置

在master1配置:

一般情况,nfs是一个专门的服务器,这里为了提高服务器的复用率,将采用master1作为本次的nfs服务端来使用。

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

1.关闭防火墙

[root@master1 ~]#systemctl stop firewalld.service
[root@master1 ~]#systemctl disable firewalld.service

2.安装配置 nfs

[root@master1 ~]#yum -y install nfs-utils rpcbind

#说明:每个Node上都要安装nfs-utils包(包括mastre,因为master本质上也是一个node,只是做了额外的标记);因为在挂载nfs目录时,需要用到其中一个库,而这个库是由这个nfs-utils提供的;

3.共享目录设置权限

[root@master1 ~]#mkdir -p /var/lib/k8s/data
[root@master1 ~]#chmod 755 /var/lib/k8s/data/

配置 nfs,nfs 的默认配置文件在 /etc/exports 文件下,在该文件中添加下面的配置信息:

[root@master1 ~]#vim /etc/exports
/var/lib/k8s/data *(rw,sync,no_root_squash)

配置说明:

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

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

4.启动服务

启动服务 nfs 需要向 rpc 注册,rpc 一旦重启了,注册的文件都会丢失,向他注册的服务都需要重启 注意启动顺序,先启动 rpcbind

[root@master1 ~]#systemctl start rpcbind.service
[root@master1 ~]#systemctl enable rpcbind.service
[root@master1 ~]#systemctl status rpcbind.service
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-01-19 20:30:33 CST; 1 months 2 days ago
Main PID: 5571 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─5571 /sbin/rpcbind -w

Jan 19 20:30:33 master1 systemd[1]: Starting RPC bind service...
Jan 19 20:30:33 master1 systemd[1]: Started RPC bind service.

看到上面的 Started 证明启动成功了。

然后启动 nfs 服务:

[root@master1 ~]#systemctl start nfs.service
[root@master1 ~]#systemctl enable nfs.service
[root@master1 ~]#systemctl status nfs.service
● 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 Mon 2022-02-21 20:42:05 CST; 17s ago
Main PID: 27590 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service

Feb 21 20:42:05 master1 systemd[1]: Starting NFS server and services...
Feb 21 20:42:05 master1 systemd[1]: Started NFS server and services.

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

5.测试

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

[root@master1 ~]#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@master1 nfs]#showmount -e 172.29.9.51
Export list for 172.29.9.51:
/var/lib/k8s/data *

到这里我们就把 nfs server 给安装成功了。


nfs client端配置(可选)

nfs client端配置

1.关闭防火墙

然后就是前往节点安装 nfs 的客户端来验证,安装 nfs 当前也需要先关闭防火墙:

systemctl stop firewalld.service
systemctl disable firewalld.service

2.安装 nfs

yum -y install nfs-utils rpcbind

3.启动服务

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

systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl start nfs.service
systemctl enable nfs.service

4.验证

挂载数据目录 客户端启动完成后,我们在客户端来挂载下 nfs 测试下,首先检查下 nfs 是否有共享目录:

[root@node1 ~]#showmount -e 172.29.9.51
Export list for 172.29.9.51:
/var/lib/k8s/data *

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

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

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

[root@node1 ~]#mount -t nfs 172.29.9.51:/var/lib/k8s/data /root/course/kubeadm/data

挂载成功后,在客户端上面的目录中新建一个文件,然后我们观察下 nfs 服务端的共享目录下面是否也会出现该文件:

[root@node1 ~]#touch /root/course/kubeadm/data/test.txt

然后在 nfs 服务端查看:

[root@master1 ~]#ls -ls /var/lib/k8s/data/
total 0
0 -rw-r--r-- 1 root root 0 Feb 21 20:46 test.txt

如果上面出现了 test.txt 的文件,那么证明我们的 nfs 挂载成功了。

注意事项:

注意:以上只是用node1来作为nfs client来测试nfs共享存储的可用性而已,实际nfs作为k8s集群共享存储使用时,只要保证nfs server可用,k8s node节点都可以正常访问到nfs服务就可以(不需要在节点上挂载nfs配置,因为在pv里面已经有指定了nfs路径新信息)

实验结束,完美。😘

2、安装nfs provisioner

首先我们使用 Helm Chart 来安装:

[root@master1 ~]#helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
[root@master1 nfs]#helm repo update

#安装
[root@master1 ~]#helm upgrade --install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=172.29.9.51 --set nfs.path=/var/lib/k8s/data --set image.repository=cnych/nfs-subdir-external-provisioner --set storageClass.defaultClass=true -n kube-system

上面的命令会在 kube-system 命名空间下安装 nfs-subdir-external-provisioner,并且会创建一个名为 nfs-client 默认的 StorageClass:

[root@master1 ~]#kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 17h
nfs-client (default) cluster.local/nfs-subdir-external-provisioner Delete Immediate true 3m1s 38d
➜ kubectl get sc nfs-client -o yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
......
name: nfs-client
parameters:
archiveOnDelete: "true"
provisioner: cluster.local/nfs-subdir-external-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

这样当以后我们创建的 PVC 中如果没有指定具体的 StorageClass 的时候,则会使用上面的 SC 自动创建一个 PV。

  • 注意:这里的镜像版本是v4.0.2
[root@devops8 nfs-subdir-external-provisioner]#docker pull cnych/nfs-subdir-external-provisioner:v4.0.2
v4.0.2: Pulling from cnych/nfs-subdir-external-provisioner
60775238382e: Pull complete
528677575c0b: Pull complete
Digest: sha256:f741e403b3ca161e784163de3ebde9190905fdbf7dfaa463620ab8f16c0f6423
Status: Downloaded newer image for cnych/nfs-subdir-external-provisioner:v4.0.2
docker.io/cnych/nfs-subdir-external-provisioner:v4.0.2
[root@devops8 nfs-subdir-external-provisioner]#docker images|grep nfs-subdir-external-provisioner
cnych/nfs-subdir-external-provisioner v4.0.2 932b0bface75 3 years ago 43.8MB
[root@devops8 nfs-subdir-external-provisioner]#

image-20240526141556595

3、应用测试

  • 测试:比如我们创建一个如下所示的 PVC
# 03-nfs-sc-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-sc-pvc
spec:
# storageClassName: nfs-client # 不指定则使用默认的 SC
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi

直接创建上面的 PVC 资源对象后就会自动创建一个 PV 与其进行绑定:

$ kubectl apply -f 03-nfs-sc-pvc.yaml 
persistentvolumeclaim/nfs-sc-pvc created
[root@master1 ~]#kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound nfs-pv 1Gi RWO manual 124m
nfs-sc-pvc Bound pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 1Gi RWO nfs-client 11s
[root@master1 ~]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 1Gi RWO Retain Bound default/nfs-pvc manual 125mpvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 1Gi RWO Delete Bound default/nfs-sc-pvc nfs-client 29s

对应自动创建的 PV 如下所示:

[root@master1 ~]#kubectl get pv pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 -oyaml
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/provisioned-by: cluster.local/nfs-subdir-external-provisioner
creationTimestamp: "2022-02-21T23:52:37Z"
finalizers:
- kubernetes.io/pv-protection
name: pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92
resourceVersion: "1339652"
uid: 536ff7a4-7eac-49f8-bb08-64b2719a483f
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
claimRef:
apiVersion: v1
kind: PersistentVolumeClaim
name: nfs-sc-pvc
namespace: default
resourceVersion: "1339647"
uid: af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92
nfs:
path: /var/lib/k8s/data/default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92
server: 172.29.9.51
persistentVolumeReclaimPolicy: Delete
storageClassName: nfs-client
volumeMode: Filesystem
status:
phase: Bound

挂载的 nfs 目录为 /var/lib/k8s/data/default-nfs-sc-pvc-pvc-ed8e2fb7-897d-465f-8735-81d52c91d074,和上面的 ${namespace}-${pvcName}-${pvName} 规范一致的。

我们可以到这个nfs共享路径下面看看:

[root@master1 ~]#cd /var/lib/k8s/data/                                                           
[root@master1 data]#ls
default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 test-volumes test.txt
[root@master1 data]#cd default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92/
[root@master1 default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92]#ls
  • 测试:我们再次测试一个pod应用
# 04-nfs-sc-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfs-sc-pod
spec:
volumes:
- name: nfs
persistentVolumeClaim:
claimName: nfs-sc-pvc #这里直接使用之前的pvc就好
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
volumeMounts:
- name: nfs
# subPath: test-volumes #注意:这个就是在nfs目录会创建有一个子目录`test-volumes`,在storageclass里面,这边就不需要这个参数了。
mountPath: "/usr/share/nginx/html"

直接部署上面资源:

$ kubectl apply -f 04-nfs-sc-pod.yaml 
pod/nfs-sc-pod created

查看:

[root@master1 ~]#kubectl get po nfs-sc-pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-sc-pod 1/1 Running 0 33s 10.244.1.78 node1 <none> <none>
[root@master1 ~]#kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound nfs-pv 1Gi RWO manual 133m
nfs-sc-pvc Bound pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 1Gi RWO nfs-client 9m3s
[root@master1 ~]#kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 1Gi RWO Retain Bound default/nfs-pvc manual 134mpvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 1Gi RWO Delete Bound default/nfs-sc-pvc nfs-client 9m14s

测试:

[root@master1 ~]#cd /var/lib/k8s/data/
[root@master1 data]#ls
default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 test-volumes test.txt
[root@master1 data]#cd default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92/
[root@master1 default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92]#ls
[root@master1 default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92]#echo "nfs sc pv content" > /var/lib/k8s/data/default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92/index.html
[root@master1 default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92]#curl 10.244.1.78
nfs sc pv content

实验结束,完美。😘

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

https://onedayxyy.cn/

image-20240502070225650

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!