需要澄清一下概念
- 误区:单纯通过
StorageClass
无法自动创建 PV,需要配置StorageClass
动态供应器(Provisioner) 例:NFS Provisioner。 - 结论:不依赖动态供应器时,必须手动创建 PV;若想实现 PVC 直接引用
StorageClass
自动创建 PV,需先部署 NFS Provisioner。
分步说明
1. 动态供应与静态供应的区别
类型 | 是否需要手动创建 PV | 是否需要 Provisioner | 适用场景 |
---|---|---|---|
静态供应 | 是 | 否 | NFS 目录固定,PV 数量少 |
动态供应 | 否 | 必须安装 Provisioner | 按需自动创建 PV |
方案一:静态供应(需手动创建 PV)
即PVC 必须依赖预先存在的 PV。
方案二:动态供应(需安装 NFS Provisioner)
以下是 真正实现 PVC 自动创建 PV 的实例:
1. 部署 NFS Provisioner
使用社区工具:
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 \
--set nfs.server=192.168.1.100 \
--set nfs.path=/data/nfs/dynamic
社区工具可能失败可以指定阿里云镜像
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.1.100 \ # 替换为你的 NFS 服务器 IP
--set nfs.path=/data/nfs/dynamic \ # 替换为你的 NFS 共享目录
--set image.repository=registry.cn-hangzhou.aliyuncs.com/google_containers/sig-storage/nfs-subdir-external-provisioner \
--set image.tag=v4.0.2 # 指定镜像版本
2. 创建 StorageClass(自动生成)
kubectl get storageclass
3. 创建 PVC
# dynamic-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-nfs-pvc
spec:
storageClassName: nfs-client # 与 Provisioner 的 StorageClass 名称一致
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
应用配置:
kubectl apply -f dynamic-pvc.yaml
4. 验证自动创建的 PV
kubectl get pvc dynamic-nfs-pvc # 状态应为 Bound
kubectl get pv # 自动生成的 PV,名称类似 pvc-xxxx
5. 挂载 PVC 到 Pod
# pod-with-dynamic-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: dynamic-pvc-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: nfs-storage
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: dynamic-nfs-pvc
应用配置:
kubectl apply -f pod-with-dynamic-pvc.yaml
6. 验证数据持久化
写入数据到容器挂载目录:
kubectl exec -it dynamic-pvc-pod -- touch /usr/share/nginx/html/test.txt
检查 NFS 服务器的 /data/nfs/dynamic
目录,会看到自动创建的子目录,其中包含 test.txt
。
关键区别说明
配置项 | 静态供应 | 动态供应 |
---|---|---|
PV 创建方式 | 手动预先创建 | 由 Provisioner 自动创建 |
NFS 目录 | 固定路径 | 动态生成子目录(如 /data/nfs/dynamic/default-pvc-xxxx ) |
适用场景 | 存储路径需严格控制 | 按需分配,避免手动管理 PV |
总结一下
- 若 不安装 Provisioner,PVC 直接引用
StorageClass
无法自动创建 PV,必须手动创建 PV。- 若需 完全自动化,必须部署 NFS Provisioner 并正确配置
StorageClass
。
更详细过程请访问: