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

目录
[toc]
环境
- 实验环境
1实验环境:
21、win10,vmwrokstation虚机;
32、k8s集群:3台centos7.6 1810虚机,1个master节点,2个node节点
4 k8s version:v1.22.2
5 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.关闭防火墙
1[root@master1 ~]#systemctl stop firewalld.service
2[root@master1 ~]#systemctl disable firewalld.service
2.安装配置 nfs
1[root@master1 ~]#yum -y install nfs-utils rpcbind
2
3#说明:每个Node上都要安装nfs-utils包(包括mastre,因为master本质上也是一个node,只是做了额外的标记);因为在挂载nfs目录时,需要用到其中一个库,而这个库是由这个nfs-utils提供的;
3.共享目录设置权限
1[root@master1 ~]#mkdir -p /var/lib/k8s/data
2[root@master1 ~]#chmod 755 /var/lib/k8s/data/
配置 nfs,nfs 的默认配置文件在 /etc/exports 文件下,在该文件中添加下面的配置信息:
1[root@master1 ~]#vim /etc/exports
2/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
1[root@master1 ~]#systemctl start rpcbind.service
2[root@master1 ~]#systemctl enable rpcbind.service
3[root@master1 ~]#systemctl status rpcbind.service
4● rpcbind.service - RPC bind service
5 Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
6 Active: active (running) since Wed 2022-01-19 20:30:33 CST; 1 months 2 days ago
7 Main PID: 5571 (rpcbind)
8 CGroup: /system.slice/rpcbind.service
9 └─5571 /sbin/rpcbind -w
10
11Jan 19 20:30:33 master1 systemd[1]: Starting RPC bind service...
12Jan 19 20:30:33 master1 systemd[1]: Started RPC bind service.
看到上面的 Started 证明启动成功了。
然后启动 nfs 服务:
1[root@master1 ~]#systemctl start nfs.service
2[root@master1 ~]#systemctl enable nfs.service
3[root@master1 ~]#systemctl status nfs.service
4● nfs-server.service - NFS server and services
5 Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
6 Drop-In: /run/systemd/generator/nfs-server.service.d
7 └─order-with-mounts.conf
8 Active: active (exited) since Mon 2022-02-21 20:42:05 CST; 17s ago
9 Main PID: 27590 (code=exited, status=0/SUCCESS)
10 CGroup: /system.slice/nfs-server.service
11
12Feb 21 20:42:05 master1 systemd[1]: Starting NFS server and services...
13Feb 21 20:42:05 master1 systemd[1]: Started NFS server and services.
同样看到 Started 则证明 NFS Server 启动成功了。
5.测试
另外我们还可以通过下面的命令确认下:
1[root@master1 ~]#rpcinfo -p|grep nfs
2 100003 3 tcp 2049 nfs
3 100003 4 tcp 2049 nfs
4 100227 3 tcp 2049 nfs_acl
5 100003 3 udp 2049 nfs
6 100003 4 udp 2049 nfs
7 100227 3 udp 2049 nfs_acl
查看具体目录挂载权限:
1[root@master1 nfs]#showmount -e 172.29.9.51
2Export list for 172.29.9.51:
3/var/lib/k8s/data *
到这里我们就把 nfs server 给安装成功了。
nfs client端配置(可选)
nfs client端配置
1.关闭防火墙
然后就是前往节点安装 nfs 的客户端来验证,安装 nfs 当前也需要先关闭防火墙:
1systemctl stop firewalld.service
2systemctl disable firewalld.service
2.安装 nfs
1yum -y install nfs-utils rpcbind
3.启动服务
安装完成后,和上面的方法一样,先启动 rpc、然后启动 nfs:
1systemctl start rpcbind.service
2systemctl enable rpcbind.service
3systemctl start nfs.service
4systemctl enable nfs.service
4.验证
挂载数据目录 客户端启动完成后,我们在客户端来挂载下 nfs 测试下,首先检查下 nfs 是否有共享目录:
1[root@node1 ~]#showmount -e 172.29.9.51
2Export list for 172.29.9.51:
3/var/lib/k8s/data *
然后我们在客户端上新建目录:
1[root@node1 ~]#mkdir -p /root/course/kubeadm/data
将 nfs 共享目录挂载到上面的目录:
1[root@node1 ~]#mount -t nfs 172.29.9.51:/var/lib/k8s/data /root/course/kubeadm/data
挂载成功后,在客户端上面的目录中新建一个文件,然后我们观察下 nfs 服务端的共享目录下面是否也会出现该文件:
1[root@node1 ~]#touch /root/course/kubeadm/data/test.txt
然后在 nfs 服务端查看:
1[root@master1 ~]#ls -ls /var/lib/k8s/data/
2total 0
30 -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 来安装:
1[root@master1 ~]#helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
2[root@master1 nfs]#helm repo update
3
4#安装
5[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:
1[root@master1 ~]#kubectl get sc
2NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
3local-storage kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 17h
4nfs-client (default) cluster.local/nfs-subdir-external-provisioner Delete Immediate true 3m1s 38d
5➜ kubectl get sc nfs-client -o yaml
6apiVersion: storage.k8s.io/v1
7kind: StorageClass
8metadata:
9 ......
10 name: nfs-client
11parameters:
12 archiveOnDelete: "true"
13provisioner: cluster.local/nfs-subdir-external-provisioner
14reclaimPolicy: Delete
15volumeBindingMode: Immediate
16allowVolumeExpansion: true
这样当以后我们创建的 PVC 中如果没有指定具体的 StorageClass 的时候,则会使用上面的 SC 自动创建一个 PV。
- 注意:这里的镜像版本是
v4.0.2
1[root@devops8 nfs-subdir-external-provisioner]#docker pull cnych/nfs-subdir-external-provisioner:v4.0.2
2v4.0.2: Pulling from cnych/nfs-subdir-external-provisioner
360775238382e: Pull complete
4528677575c0b: Pull complete
5Digest: sha256:f741e403b3ca161e784163de3ebde9190905fdbf7dfaa463620ab8f16c0f6423
6Status: Downloaded newer image for cnych/nfs-subdir-external-provisioner:v4.0.2
7docker.io/cnych/nfs-subdir-external-provisioner:v4.0.2
8[root@devops8 nfs-subdir-external-provisioner]#docker images|grep nfs-subdir-external-provisioner
9cnych/nfs-subdir-external-provisioner v4.0.2 932b0bface75 3 years ago 43.8MB
10[root@devops8 nfs-subdir-external-provisioner]#

3、应用测试
- 测试:比如我们创建一个如下所示的 PVC
1# 03-nfs-sc-pvc.yaml
2apiVersion: v1
3kind: PersistentVolumeClaim
4metadata:
5 name: nfs-sc-pvc
6spec:
7 # storageClassName: nfs-client # 不指定则使用默认的 SC
8 accessModes:
9 - ReadWriteOnce
10 resources:
11 requests:
12 storage: 1Gi
直接创建上面的 PVC 资源对象后就会自动创建一个 PV 与其进行绑定:
1$ kubectl apply -f 03-nfs-sc-pvc.yaml
2persistentvolumeclaim/nfs-sc-pvc created
3[root@master1 ~]#kubectl get pvc
4NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
5nfs-pvc Bound nfs-pv 1Gi RWO manual 124m
6nfs-sc-pvc Bound pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 1Gi RWO nfs-client 11s
7[root@master1 ~]#kubectl get pv
8NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
9nfs-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 如下所示:
1[root@master1 ~]#kubectl get pv pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 -oyaml
2apiVersion: v1
3kind: PersistentVolume
4metadata:
5 annotations:
6 pv.kubernetes.io/provisioned-by: cluster.local/nfs-subdir-external-provisioner
7 creationTimestamp: "2022-02-21T23:52:37Z"
8 finalizers:
9 - kubernetes.io/pv-protection
10 name: pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92
11 resourceVersion: "1339652"
12 uid: 536ff7a4-7eac-49f8-bb08-64b2719a483f
13spec:
14 accessModes:
15 - ReadWriteOnce
16 capacity:
17 storage: 1Gi
18 claimRef:
19 apiVersion: v1
20 kind: PersistentVolumeClaim
21 name: nfs-sc-pvc
22 namespace: default
23 resourceVersion: "1339647"
24 uid: af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92
25 nfs:
26 path: /var/lib/k8s/data/default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92
27 server: 172.29.9.51
28 persistentVolumeReclaimPolicy: Delete
29 storageClassName: nfs-client
30 volumeMode: Filesystem
31status:
32 phase: Bound
挂载的 nfs 目录为 /var/lib/k8s/data/default-nfs-sc-pvc-pvc-ed8e2fb7-897d-465f-8735-81d52c91d074,和上面的 ${namespace}-${pvcName}-${pvName} 规范一致的。
我们可以到这个nfs共享路径下面看看:
1[root@master1 ~]#cd /var/lib/k8s/data/
2[root@master1 data]#ls
3default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 test-volumes test.txt
4[root@master1 data]#cd default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92/
5[root@master1 default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92]#ls
- 测试:我们再次测试一个pod应用
1# 04-nfs-sc-pod.yaml
2apiVersion: v1
3kind: Pod
4metadata:
5 name: nfs-sc-pod
6spec:
7 volumes:
8 - name: nfs
9 persistentVolumeClaim:
10 claimName: nfs-sc-pvc #这里直接使用之前的pvc就好
11 containers:
12 - name: web
13 image: nginx
14 ports:
15 - name: web
16 containerPort: 80
17 volumeMounts:
18 - name: nfs
19 # subPath: test-volumes #注意:这个就是在nfs目录会创建有一个子目录`test-volumes`,在storageclass里面,这边就不需要这个参数了。
20 mountPath: "/usr/share/nginx/html"
直接部署上面资源:
1$ kubectl apply -f 04-nfs-sc-pod.yaml
2pod/nfs-sc-pod created
查看:
1[root@master1 ~]#kubectl get po nfs-sc-pod -owide
2NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
3nfs-sc-pod 1/1 Running 0 33s 10.244.1.78 node1 <none> <none>
4[root@master1 ~]#kubectl get pvc
5NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
6nfs-pvc Bound nfs-pv 1Gi RWO manual 133m
7nfs-sc-pvc Bound pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 1Gi RWO nfs-client 9m3s
8[root@master1 ~]#kubectl get pv
9NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
10nfs-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
测试:
1[root@master1 ~]#cd /var/lib/k8s/data/
2[root@master1 data]#ls
3default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 test-volumes test.txt
4[root@master1 data]#cd default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92/
5[root@master1 default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92]#ls
6[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
7[root@master1 default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92]#curl 10.244.1.78
8nfs sc pv content
实验结束,完美。😘
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

🍀 微信公众号
《云原生架构师实战》

🍀 个人博客站点


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

🍀 知乎
https://www.zhihu.com/people/foryouone

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

