问题描述
使用 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.