使用 nfs-client-provisioner 动态创建不同子目录的 pvc
使用场景
目前使用 StorageClass 自动创建 CFS 类型 PVC 和 PV,每个 PV 都需要对应一个文件系统(CFS 实例),如果想要多个 PV(不同子路径) 使用同一个文件系统,就需要手动创建 PV 时指定 CFS 文件系统的具体的路径然后绑定 PVC 使用,这是一种办法,但是当需要的 PV 数量多了就会非常繁琐, 对于此使用场景我们可以使用社区的 nfs-client-provisioner 项目来实现动态创建 CFS 文件系统中的子路径,接下来我们来介绍下如何在 TKE 中使用nfs-client-provisioner
。
操作步骤
1.准备 CFS 文件系统实例
使用 CFS-CSI 插件 创建或通过 CFS 控制台 创建一个 CFS 文件系统实例。
2.安装部署nfs-subdir-external-provisioner
官方提供两种安装方式, helm 安装 和 手动部署 YAML 安装,这里为了方便,我们采用 helm 安装的方式。
1.在访问集群的客户端安装 helm
可以是在集群节点中,也可以是本地能连接集群的客户端,安装 helm3 参考 helm 安装 。
2.安装部署
可以根据需求修改指定参数后部署:
1helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
2# 下载 helm chart 文件至本地目录,查看可以指定的 values 选项(可选)
3helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --untar
4# 使用类似下面命令安装 nfs-subdir-external-provisioner 资源
5helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
6 --set nfs.server=x.x.x.x \
7 --set nfs.path=/exported/path \
8 --set image.repository=xxxxx \
9 --set image.tag=xxx
10 ...
3 . 配置使用 CFS 文件系统子目录的 PVC 。
使用上一步部署的nfs-subdir-external-provisioner
动态创建存储卷。
部署后会默认生成一个存储类资源,默认存储类名是"nfs-client"(也可以在部署时自定义指定),如下:
1[root@VM-0-85-tlinux ~]# kubectl get sc
2NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
3...
4nfs-client cluster.local/nfs-subdir-external-provisioner Delete Immediate true 16d
5...
然后使用上述生成的存储类动态创建存储卷:
1kind: PersistentVolumeClaim
2apiVersion: v1
3metadata:
4 name: test-claim
5spec:
6 storageClassName: nfs-client
7 accessModes:
8 - ReadWriteMany
9 resources:
10 requests:
11 storage: 1Mi
等待 PVC 状态为 Bound ,则说明动态创建成功:
1[root@VM-0-126-tlinux ~]# kubectl get pvc
2NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
3test-claim Bound pvc-a3751ae4-4937-4fdc-92d4-6706eec8e01c 1Mi RWX nfs-client 10s
在nfs-subdir-external-provisioner
Pod 所在节点查看已经自动创建了对应 PVC 的子目录,如下图:
1[root@VM-0-85-tlinux ~]# df -h | grep <nfs server>
2<nfs server>:/ 14G 32M 14G 1% /var/lib/kubelet/pods/d12c6680-0871-44db-87ab-2e0cd384649a/volumes/kubernetes.io~nfs/nfs-subdir-external-provisioner-root
3[root@VM-0-85-tlinux ~]# ls /var/lib/kubelet/pods/d12c6680-0871-44db-87ab-2e0cd384649a/volumes/kubernetes.io~nfs/nfs-subdir-external-provisioner-root
4default-test-claim-pvc-a3751ae4-4937-4fdc-92d4-6706eec8e01c
然后创建一个工作负载设置挂载上面生成的 PVC, 在 Pod 所在节点可以看到 PVC 挂载点说明可以正常使用:
1[root@VM-0-126-tlinux ~]# df -h | grep <nfs server>
2<nfs server>:/default-test-claim-pvc-a3751ae4-4937-4fdc-92d4-6706eec8e01c 14G 32M 14G 1% /var/lib/kubelet/pods/0cbf27d3-5357-4b9c-bda4-6e4c8cdc3b4a/volumes/kubernetes.io~nfs/pvc-a3751ae4-4937-4fdc-92d4-6706eec8e01c
3[root@VM-0-126-tlinux ~]# ls /var/lib/kubelet/pods/0cbf27d3-5357-4b9c-bda4-6e4c8cdc3b4a/volumes/kubernetes.io~nfs/pvc-a3751ae4-4937-4fdc-92d4-6706eec8e01c
4text.txt # pod中产生的数据
总结
本文使用社区的 nfs-client-provisioner 项目实现了在 TKE 集群只使用一个 CFS 文件系统实例,动态创建多个不同子路径的 PVC 供工作负载挂载。