总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战
一、环境信息
IP地址 | 操作系统 | K8S版本 | 集群角色 | NFS角色 |
---|---|---|---|---|
192.168.1.32 | Ubuntu 20.04.6 LTS | v1.24.17 | master节点 | client |
192.168.1.33 | Ubuntu 20.04.6 LTS | v1.24.17 | worker节点 | client |
192.168.1.34 | Ubuntu 20.04.6 LTS | v1.24.17 | worker节点 | client |
192.168.1.35 | Ubuntu 20.04.6 LTS | v1.24.17 | worker节点 | client |
192.168.1.36 | Ubuntu 20.04.6 LTS | v1.24.17 | worker节点 | client |
192.168.1.37 | Ubuntu 20.04.6 LTS | v1.24.17 | worker节点 | client |
192.168.1.38 | Ubuntu 20.04.6 LTS | - | - | server |
二、使用nfs-client实现storageclass
2.1、安装nfs服务端
说明:以下操作只需在nfs server主机上操作。
1、首先,确保您的Ubuntu系统已经更新。在终端中执行以下命令:
apt update
apt upgrade
接下来,安装NFS内核服务器软件包:
apt install nfs-kernel-server -y
2、配置NFS共享目录:
创建一个要共享的目录,例如/data/k8s/volumes
mkdir -p /data/k8s/volumes
为了允许客户端访问该目录,需要修改其权限:
chown nobody:nogroup /data/k8s/volumes
chmod 755 /data/k8s/volumes
接下来,配置NFS导出,编辑 /etc/exports文件以定义要共享的目录和允许访问的客户端
vim /etc/exports
/data/k8s/volumes 192.168.1.0/24(rw,sync,no_subtree_check)
将更改应用到NFS服务器并重新启动服务
exportfs -ra
systemctl restart nfs-kernel-server
2.2、安装nfs客户端
说明:以下操作只需在nfs client主机上操作。
首先,在客户端上安装NFS客户端软件包:
# 客户端不需要创建共享目录和编辑配置文件,只安装服务就行
apt install nfs-common -y
2.3、基于helm安装nfs client插件
说明:以下操作只需在K8S集群其中一个master节点主机上操作。
1、helm安装
root@k8s-master-32:~# wget https://get.helm.sh/helm-v3.12.3-linux-amd64.tar.gz
root@k8s-master-32:~# tar -zxvf helm-v3.12.3-linux-amd64.tar.gz
root@k8s-master-32:~# mv linux-amd64/helm /usr/local/bin/helm
# Add repository
root@k8s-master-32:~# helm repo add moikot https://moikot.github.io/helm-charts
root@k8s-master-32:~# helm repo update
# Install chart
helm install --generate-name \
--set nfs.server=192.168.1.38 \
--set nfs.path=/data/k8s/volumes \
--set storageClass.reclaimPolicy=Delete \
--set image.repository=registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner \
--set image.tag=v4.0.0 \
moikot/nfs-client-provisioner --version 1.3.0
下表列出了此图表的可配置参数及其默认值,如下图所示:
说明:Kubernetes v1.20开始,默认删除了metadata.selfLink字段,然而,部分应用仍然依赖于这个字段,例如nfs-client-provisioner。如果仍然要继续使用这些应用,您将需要重新启用该字段在当前环境中。但是在当前K8S 1.24.17版本中,开启该字段会导致kube-apiserver无法正常启动,经测试将默认的quay.io/external_storage/nfs-client-provisioner:latest镜像,修改为不基于SelfLink功能的provisioner镜像,即registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
3、测试,创建一个test-calim的pvc
vim test-claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
annotations:
volume.beta.kubernetes.io/storage-class: "nfs-client" #可使用kubectl get storageclasses命令查看
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
7、测试,创建一个test-pod文件
vim test-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox:1.24
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
8、如下图所示,查看共享目录/data/volumes/v1/,下面有SUCCESS文件,则表明部署成功
2.4、手动安装nfs client插件
1、下载nfs client资源文件
wget https://github.com/kubernetes-retired/external-storage/archive/refs/heads/master.zip
unzip master.zip
cd external-storage-master/nfs-client/deploy/
如下图所示:
2、 修改deployment.yaml
说明:Kubernetes v1.20开始,默认删除了metadata.selfLink字段,然而,部分应用仍然依赖于这个字段,例如nfs-client-provisioner。如果仍然要继续使用这些应用,您将需要重新启用该字段在当前环境中。但是在当前K8S 1.24.17版本中,开启该字段会导致kube-apiserver无法正常启动,经测试将默认的quay.io/external_storage/nfs-client-provisioner:latest镜像,修改为不基于SelfLink功能的provisioner镜像,即registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0
3、 创建账号
root@k8s-master-32:~/external-storage-master/nfs-client/deploy# kubectl create -f rbac.yaml
4、创建nfs-client
将nfs配置成StorageClass,安装对应的自动配置程序nfs-client,可以来自动创建持久卷(pv)。每当创建storageclass时,就会在kubernetes里面自动创建pv,nfs目录下自动创建文件夹,省去生动创建的繁琐。
root@k8s-master-32:~/external-storage-master/nfs-client/deploy# kubectl create -f deployment.yaml
5、创建nfs-client kubernetes storage class
vim class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
reclaimPolicy: Delete
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"
root@k8s-master-32:~/external-storage-master/nfs-client/deploy# kubectl create -f class.yaml
6、测试,创建一个test-calim的pvc
vim test-claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
7、测试,创建一个test-pod文件
vim test-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox:1.24
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1"
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim
8、如下图所示,查看共享目录/data/volumes/v1/,下面有SUCCESS文件,则表明部署成功
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战