「KUBERNETES-ADDONS」- NFS StorageClass

  CREATED BY JENKINSBOT

问题描述

使用 PV + PVC 方式使用存储比较麻烦,因为每次都需要集群管理员提前进行 PV 定义。

而通过 StorageClass 资源,管理员仅需进行 PV 定义,PV 资源将由集群动态创建。当开发者通过 PVC 申请存储资源时,需要在 PVC 中指定使用 StorageClass 名称,然后集群会动态创建 PV 资源。

该笔记将记录:在 Kubernetes 中,如何使用 StorageClass + PVC 提供存储服务,以及相关问题解决方法。

解决方案

我们倾向于通过 HELM 进行部署,其主要目的是能够容易进行配置管理;

// 安装服务

# helm repo add nfs-subdir-external-provisioner                                \
    https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

# helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner

# helm show values ./nfs-subdir-external-provisioner-4.0.16.tgz                \
    > nfs-subdir-external-provisioner-4.0.16.helm-values.yaml

# vim nfs-subdir-external-provisioner-4.0.16.helm-values.yaml
...(1)修改镜像地址:image.repository=easzlab/nfs-subdir-external-provisioner 
...(2)修改存储地址:nfs.server=<NFS-IP-ADDRESS>
...(3)修改目录地址:nfs.path=<NFS-EXPORTS>
...(4)nfs.mountOptions

# helm -n kube-storage-nfs --create-namespace                                  \
    install nfs-subdir-external-provisioner                                    \
    ./nfs-subdir-external-provisioner-4.0.16.tgz                               \
    -f nfs-subdir-external-provisioner-4.0.16.helm-values.yaml

// 更新配置

# helm -n kube-storage-nfs                                                     \
    upgrade nfs-subdir-external-provisioner                                    \
    ./nfs-subdir-external-provisioner-4.0.16.tgz                               \
    -f nfs-subdir-external-provisioner-4.0.16.helm-values.yaml

通过命令行直接指定参数进行安装(鉴于无法进行配置参数的管理,废弃该做法):

helm -n kube-storage-nfs --create-namespace                                    \
    install nfs-subdir-external-provisioner                                    \
    nfs-subdir-external-provisioner/nfs-subdir-external-provisioner            \
    --set image.repository=easzlab/nfs-subdir-external-provisioner             \
    --set nfs.server=192.168.10.193                                            \
    --set nfs.path=/srv/nfs/k8s-storage                                        \
    --set storageClass.name=nas-client-provisioner

通过清单文件部署(废弃)

环境概述

自建 Kubernetes 1.18 集群;存储使用 NFS 服务;

第一步、运行 NFS Provisioner 服务

NFS Provisioner 负责 NFS 存储的管理。如下为部署 NFS Provisioner 的步骤:

git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git

NAMESPACE="kube-storage" # 假设使用该命名空间
sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/rbac.yaml ./deploy/deployment.yaml

./deploy/rbac.yaml:

kubectl create -f deploy/rbac.yaml

./deploy/deployment.yaml:

# 修改 deploy/deployment.yaml 文件
...
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          # eipwork/nfs-subdir-external-provisioner:v4.0.2
          image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
              # 根据自己需要来决定是否使用子目录
              # subPath: <YOUR NFS SUBPATH>
          env:
            # StorageClass 将使用该参数
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: <YOUR NFS SERVER HOSTNAME>
            - name: NFS_PATH
              value: <YOUR NFS SERVER PATH>
      volumes:
        - name: nfs-client-root
          nfs:
            server: <YOUR NFS SERVER HOSTNAME>
            path: <YOUR NFS SERVER PATH>
...

# 然后,运行该服务
kubectl apply -f deploy/deployment.yaml

# 检查 provisioner 运行
kubectl get pod -l app=nfs-client-provisioner --all-namespaces
kubectl get pod -l app=nfs-client-provisioner

deploy/class.yaml

kubectl apply -f deploy/class.yaml

第二步、验证存储类

kubectl apply -f test-claim.yaml
kubectl apply -f test-pod.yaml

如果部署成功,将在 NFS 存储的子目录(该子目录名称由 Provisioner 创建)中,看到 SUCCESS 文件;

参考文献

Storage Classes | Kubernetes
nacos-k8s/README.md at master · nacos-group/nacos-k8s · GitHub
How do I create a storage class for NFS dynamic storage provisioning in an OpenShift environment?
eipwork/nfs-subdir-external-provisioner Tags | Docker Hub
GitHub – kubernetes-sigs/nfs-subdir-external-provisioner: Dynamic sub-dir volume provisioner on a remote NFS server.