实战-nfs动态供给安装(helm方式)(测试成功)-20220813-荐
实战: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]#
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。
🍀 微信公众号
《云原生架构师实战》
🍀 个人博客站点
🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
🍀 知乎
https://www.zhihu.com/people/foryouone
最后
好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!