Skip to content

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

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

目录

[toc]

环境

  • 实验环境
bash
实验环境:1、win10,vmwrokstation虚机;2、k8s集群:3台centos7.61810虚机,1个master节点,2个node节点k8sversion:v1.22.2containerd:[root@master1 ~]#systemctl disable firewalld.service

2.安装配置 nfs

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

3.共享目录设置权限

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

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

bash
[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

bash
[root@master1 ~]#systemctl start rpcbind.service[root@master1 ~]#systemctl enable rpcbind.service[root@master1 ~]#systemctl status rpcbind.servicerpcbind.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 服务:

bash
[root@master1 ~]#systemctl start nfs.service[root@master1 ~]#systemctl enable nfs.service[root@master1 ~]#systemctl status nfs.servicenfs-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.测试

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

bash
[root@master1 ~]#rpcinfo -p|grepnfs1000033tcp2049nfs1000034tcp2049nfs1002273tcp2049nfs_acl1000033udp2049nfs1000034udp2049nfs1002273udp2049nfs_acl

查看具体目录挂载权限:

bash
[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 当前也需要先关闭防火墙:

bash
systemctlstopfirewalld.servicesystemctldisablefirewalld.service

2.安装 nfs

bash
yum-yinstallnfs-utilsrpcbind

3.启动服务

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

bash
systemctlstartrpcbind.servicesystemctlenablerpcbind.servicesystemctlstartnfs.servicesystemctlenablenfs.service

4.验证

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

bash
[root@node1 ~]#showmount -e 172.29.9.51Exportlistfor172.29.9.51:/var/lib/k8s/data*

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

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

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

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

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

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

然后在 nfs 服务端查看:

bash
[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 来安装:

bash
[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:

bash
[root@master1 ~]#kubectl get scNAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGElocal-storagekubernetes.io/no-provisionerDeleteWaitForFirstConsumerfalse17hnfs-client(default) cluster.local/nfs-subdir-external-provisioner Delete Immediate true 3m1s 38dkubectlgetscnfs-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
bash
[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]#

image-20240526141556595

3、应用测试

  • 测试:比如我们创建一个如下所示的 PVC
yaml
# 03-nfs-sc-pvc.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:nfs-sc-pvcspec:# storageClassName:nfs-client # 不指定则使用默认的 SCaccessModes:- ReadWriteOnceresources:requests:storage:1Gi

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

bash
$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 如下所示:

bash
[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共享路径下面看看:

bash
[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应用
yaml
# 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"

直接部署上面资源:

bash
$kubectlapply-f04-nfs-sc-pod.yamlpod/nfs-sc-podcreated

查看:

bash
[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

测试:

bash
[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。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

https:

版权:此文章版权归 One 所有,如有转载,请注明出处!

链接:可点击右上角分享此页面复制文章链接

上次更新时间:

最近更新