认识
使用 PV + PVC 方式使用存储比较麻烦,因为每次都需要集群管理员提前进行 PV 定义。而通过 StorageClass 资源,管理员仅需进行 PV 定义,PV 资源将由集群动态创建。当开发者通过 PVC 申请存储资源时,需要在 PVC 中指定使用 StorageClass 名称,然后集群会动态创建 PV 资源。
该笔记将记录:在 Kubernetes 中,如何使用 StorageClass + PVC 提供存储服务,以及相关问题解决方法;
官网:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
文档:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/blob/master/README.md
仓库:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
构建
通过 Helm 部署
我们倾向于通过 HELM 进行部署,其主要目的是能够容易进行配置管理;
通过命令行直接指定参数进行安装(鉴于无法进行配置参数的管理,废弃该做法):
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
通过 Helm 导出 values.yaml 文件,并执行安装:
// 安装服务
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.18.tgz \
> nfs-subdir-external-provisioner.helm-values.yaml
vim nfs-subdir-external-provisioner.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 upgrade --install -n nfs-provisioner --create-namespace \
nfs-subdir-external-provisioner \
./nfs-subdir-external-provisioner-4.0.18.tgz \
-f nfs-subdir-external-provisioner.helm-values.yaml
通过清单文件部署(废弃)
环境概述
自建 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.