「Kubernetes」- NFS StorageClass

  CREATED BY JENKINSBOT

问题描述

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

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

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

解决方案

环境概述

自建 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 文件;

通过 HELM 部署(推荐)

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

# 在 4.0.16 中,我们没有找到 chart 指定命名空间的参数
kubectl create namespace kube-storage-nfs

helm -n kube-storage-nfs 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

参考文献

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.