实战-nfs动态供给安装(helm方式)(测试成功)-20220813-荐
实战:nfs动态供给安装(helm方式)(测试成功)-2022.8.13 【荐】
目录
[toc]
环境
- 实验环境
实验环境:1、win10,vmwrokstation虚机;2、k8s集群:3台centos7.61810虚机,1个master节点,2个node节点k8sversion:v1.22.2containerd:[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-RPCbindserviceLoaded:loaded(/usr/lib/systemd/system/rpcbind.service;enabled;vendorpreset:enabled)Active:active(running) since Wed 2022-01-19 20:30:33 CST;1months2daysagoMainPID:5571(rpcbind)CGroup:/system.slice/rpcbind.service└─5571/sbin/rpcbind-wJan1920:30:33master1systemd[1]:StartingRPCbindservice...Jan1920:30:33master1systemd[1]:StartedRPCbindservice.
看到上面的 Started 证明启动成功了。
然后启动 nfs 服务:
[root@master1 ~]#systemctl start nfs.service[root@master1 ~]#systemctl enable nfs.service[root@master1 ~]#systemctl status nfs.service●nfs-server.service-NFSserverandservicesLoaded:loaded(/usr/lib/systemd/system/nfs-server.service;enabled;vendorpreset:disabled)Drop-In:/run/systemd/generator/nfs-server.service.d└─order-with-mounts.confActive:active(exited) since Mon 2022-02-21 20:42:05 CST;17sagoMainPID:27590(code=exited,status=0/SUCCESS)CGroup:/system.slice/nfs-server.serviceFeb2120:42:05master1systemd[1]:StartingNFSserverandservices...Feb2120:42:05master1systemd[1]:StartedNFSserverandservices.
同样看到 Started 则证明 NFS Server 启动成功了。
5.测试
另外我们还可以通过下面的命令确认下:
[root@master1 ~]#rpcinfo -p|grepnfs1000033tcp2049nfs1000034tcp2049nfs1002273tcp2049nfs_acl1000033udp2049nfs1000034udp2049nfs1002273udp2049nfs_acl
查看具体目录挂载权限:
[root@master1 nfs]#showmount -e 172.29.9.51Exportlistfor172.29.9.51:/var/lib/k8s/data*
到这里我们就把 nfs server 给安装成功了。
nfs client
端配置(可选)
nfs client端配置
1.关闭防火墙
然后就是前往节点安装 nfs 的客户端来验证,安装 nfs 当前也需要先关闭防火墙:
systemctlstopfirewalld.servicesystemctldisablefirewalld.service
2.安装 nfs
yum-yinstallnfs-utilsrpcbind
3.启动服务
安装完成后,和上面的方法一样,先启动 rpc、然后启动 nfs:
systemctlstartrpcbind.servicesystemctlenablerpcbind.servicesystemctlstartnfs.servicesystemctlenablenfs.service
4.验证
挂载数据目录 客户端启动完成后,我们在客户端来挂载下 nfs 测试下,首先检查下 nfs 是否有共享目录:
[root@node1 ~]#showmount -e 172.29.9.51Exportlistfor172.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/total00-rw-r--r--1rootroot0Feb2120:46test.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:[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--setnfs.path=/var/lib/k8s/data--setimage.repository=cnych/nfs-subdir-external-provisioner--setstorageClass.defaultClass=true-nkube-system
上面的命令会在 kube-system
命名空间下安装 nfs-subdir-external-provisioner
,并且会创建一个名为 nfs-client
默认的 StorageClass:
[root@master1 ~]#kubectl get scNAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGElocal-storagekubernetes.io/no-provisionerDeleteWaitForFirstConsumerfalse17hnfs-client(default) cluster.local/nfs-subdir-external-provisioner Delete Immediate true 3m1s 38d➜kubectlgetscnfs-client-oyamlapiVersion:storage.k8s.io/v1kind:StorageClassmetadata:......name:nfs-clientparameters:archiveOnDelete:"true"provisioner:cluster.local/nfs-subdir-external-provisionerreclaimPolicy:DeletevolumeBindingMode:ImmediateallowVolumeExpansion:true
这样当以后我们创建的 PVC 中如果没有指定具体的 StorageClass
的时候,则会使用上面的 SC 自动创建一个 PV。
- 注意:这里的镜像版本是
v4.0.2
[root@devops8 nfs-subdir-external-provisioner]#docker pull cnych/nfs-subdir-external-provisioner:v4.0.2v4.0.2:Pullingfromcnych/nfs-subdir-external-provisioner60775238382e:Pullcomplete528677575c0b:PullcompleteDigest:sha256:f741e403b3ca161e784163de3ebde9190905fdbf7dfaa463620ab8f16c0f6423Status:Downloadednewerimageforcnych/nfs-subdir-external-provisioner:v4.0.2docker.io/cnych/nfs-subdir-external-provisioner:v4.0.2[root@devops8 nfs-subdir-external-provisioner]#docker images|grepnfs-subdir-external-provisionercnych/nfs-subdir-external-provisionerv4.0.2932b0bface753yearsago43.8MB[root@devops8 nfs-subdir-external-provisioner]#
3、应用测试
- 测试:比如我们创建一个如下所示的 PVC
# 03-nfs-sc-pvc.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:nfs-sc-pvcspec:# storageClassName:nfs-client # 不指定则使用默认的 SCaccessModes:- ReadWriteOnceresources:requests:storage:1Gi
直接创建上面的 PVC 资源对象后就会自动创建一个 PV 与其进行绑定:
$kubectlapply-f03-nfs-sc-pvc.yamlpersistentvolumeclaim/nfs-sc-pvccreated[root@master1 ~]#kubectl get pvcNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEnfs-pvcBoundnfs-pv1GiRWOmanual124mnfs-sc-pvcBoundpvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d921GiRWOnfs-client11s[root@master1 ~]#kubectl get pv NAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEnfs-pv1GiRWORetainBounddefault/nfs-pvcmanual125mpvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d921GiRWODeleteBounddefault/nfs-sc-pvcnfs-client29s
对应自动创建的 PV 如下所示:
[root@master1 ~]#kubectl get pv pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92 -oyamlapiVersion:v1kind:PersistentVolumemetadata:annotations:pv.kubernetes.io/provisioned-by:cluster.local/nfs-subdir-external-provisionercreationTimestamp:"2022-02-21T23:52:37Z"finalizers:-kubernetes.io/pv-protectionname:pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92resourceVersion:"1339652"uid:536ff7a4-7eac-49f8-bb08-64b2719a483fspec:accessModes:-ReadWriteOncecapacity:storage:1GiclaimRef:apiVersion:v1kind:PersistentVolumeClaimname:nfs-sc-pvcnamespace:defaultresourceVersion:"1339647"uid:af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92nfs:path:/var/lib/k8s/data/default-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92server:172.29.9.51persistentVolumeReclaimPolicy:DeletestorageClassName:nfs-clientvolumeMode:Filesystemstatus: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]#lsdefault-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92test-volumestest.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.yamlapiVersion:v1kind:Podmetadata:name:nfs-sc-podspec:volumes:- name:nfspersistentVolumeClaim:claimName:nfs-sc-pvc#这里直接使用之前的pvc就好containers:- name:webimage:nginxports:- name:webcontainerPort:80volumeMounts:- name:nfs# subPath:test-volumes #注意:这个就是在nfs目录会创建有一个子目录`test-volumes`,在storageclass里面,这边就不需要这个参数了。mountPath:"/usr/share/nginx/html"
直接部署上面资源:
$kubectlapply-f04-nfs-sc-pod.yamlpod/nfs-sc-podcreated
查看:
[root@master1 ~]#kubectl get po nfs-sc-pod -owideNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESnfs-sc-pod1/1Running033s10.244.1.78node1<none><none>[root@master1 ~]#kubectl get pvcNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEnfs-pvcBoundnfs-pv1GiRWOmanual133mnfs-sc-pvcBoundpvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d921GiRWOnfs-client9m3s[root@master1 ~]#kubectl get pv NAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEnfs-pv1GiRWORetainBounddefault/nfs-pvcmanual134mpvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d921GiRWODeleteBounddefault/nfs-sc-pvcnfs-client9m14s
测试:
[root@master1 ~]#cd /var/lib/k8s/data/[root@master1 data]#lsdefault-nfs-sc-pvc-pvc-af1b2b91-38b6-4bf0-99f1-cc2fa4fb2d92test-volumestest.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.78nfsscpvcontent
实验结束,完美。😘
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码
x2675263825 (舍得), qq:2675263825。
🍀 微信公众号
《云原生架构师实战》
🍀 个人博客站点
上次更新时间: