kubernetes中通过nfs实现动态存储置备需部署nfs-subdir-external-provisioner供给器、创建关联该provisioner的storageclass,并提交pvc触发自动创建nfs子目录及绑定pv。

在 Kubernetes 中通过 NFS 实现动态存储置备,核心是借助 external-provisioner(如 nfs-subdir-external-provisioner)配合 StorageClass,让 PVC 自动触发 NFS 目录创建,无需手动在 NFS 服务端预建路径。
前提条件:NFS 服务已就绪
确保集群外有一台稳定运行的 NFS 服务器(例如 IP 为 192.168.10.100),且已导出一个根共享目录(如 /data/nfs),并开放给 K8s 节点 IP 段读写权限:
- 检查 NFS 服务状态:
systemctl status nfs-server(Linux) - 确认 export 配置(
/etc/exports)包含类似:
/data/nfs *(rw,sync,no_root_squash,no_subtree_check) - 执行
exportfs -ra并验证:showmount -e 192.168.10.100
部署 NFS 动态供给器(nfs-subdir-external-provisioner)
该组件以 Pod 形式运行在集群中,监听 PVC 创建事件,并在指定 NFS 共享下自动新建子目录作为 PV 底层存储。
- 使用官方 Helm Chart 或 YAML 部署(推荐 Helm):
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \<br> --set nfs.server=192.168.10.100 \<br> --set nfs.path=/data/nfs
- 若用 YAML,需修改
values.yaml中nfs.server和nfs.path为实际地址与路径 - 部署后检查 Pod 是否 Running:
kubectl get pod -n default | grep nfs-provisioner
创建 StorageClass 并关联供给器
StorageClass 定义了“如何动态生成 PV”,关键在于 provisioner 字段必须与供给器 Deployment 中的 PROVISIONER_NAME(默认为 nfs-subdir-external-provisioner)严格一致。
- 示例 StorageClass 清单(
storageclass-nfs.yaml):
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-sc provisioner: nfs-subdir-external-provisioner parameters: archiveOnDelete: "false" # 删除 PVC 时是否归档对应目录(true 则重命名,false 则直接删除) reclaimPolicy: Delete volumeBindingMode: Immediate
- 应用:
kubectl apply -f storageclass-nfs.yaml - 验证:
kubectl get sc应看到nfs-sc状态为Available
测试动态置备流程
创建 PVC 后,供给器会自动生成 PV、绑定 PVC,并在 NFS 服务器的 /data/nfs 下创建唯一子目录(如 default-test-pvc-pvc-xxxxx)。
- 编写 PVC(
pvc-test.yaml):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-nfs-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs-sc
resources:
requests:
storage: 1Gi
- 应用并观察:
kubectl apply -f pvc-test.yaml - 查看状态:
kubectl get pvc,pv—— 状态应变为Bound - 登录 NFS 服务器,确认
/data/nfs/default-test-pvc-pvc-xxxxx目录已存在










