Bootstrap

《Kubernetes存储篇:基于NFS创建动态存储StorageClass》

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级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

2、nfs-client-provisioner安装

# 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集群运维实战

;