NFS存储类与PV/PVC的关联及多服务多目录共享配置咨询
问题解答
PV/PVC 与 StorageClass 的关联
- 静态存储模式:手动创建PV,PVC与PV是1:1绑定关系,适合你这种已经预先规划好NFS目录的场景。
- 动态存储模式:通过StorageClass自动生成PV,无需手动创建PV。但NFS本身不支持动态PV,需要部署第三方NFS Provisioner(比如nfs-subdir-external-provisioner)来实现,适合批量创建标准化存储目录的场景。
针对你的场景的具体操作
你的需求是共享NFS上的特定目录(含跨目录共享),分两种实现方式:
1. 静态模式(手动创建PV/PVC)
这种方式直接复用已存在的NFS目录,步骤清晰可控:
第一步:为每个NFS目录创建PV
每个要共享的目录对应一个PV,示例yaml如下:
# service1-folder1 的 PV apiVersion: v1 kind: PersistentVolume metadata: name: pv-service1-folder1 labels: app: service1-folder1 spec: capacity: storage: 10Gi # 容量仅为标识,实际由NFS服务器决定,按需填写 accessModes: - ReadWriteMany # NFS支持多Pod读写 nfs: server: 192.168.0.2 path: "/data/service1/folder1" --- # service1-folder2 的 PV apiVersion: v1 kind: PersistentVolume metadata: name: pv-service1-folder2 labels: app: service1-folder2 spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: 192.168.0.2 path: "/data/service1/folder2" --- # service2-folder1 的 PV apiVersion: v1 kind: PersistentVolume metadata: name: pv-service2-folder1 labels: app: service2-folder1 spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: server: 192.168.0.2 path: "/data/service2/folder1"
注意:service2需要共享的/data/service1/folder2,直接复用上面的pv-service1-folder2即可,无需重复创建。
第二步:创建PVC绑定PV
为每个服务创建对应的PVC,绑定所需的PV:
# service1 用于挂载 folder1 的 PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-service1-folder1 spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi selector: matchLabels: app: service1-folder1 --- # service1 用于挂载 folder2 的 PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-service1-folder2 spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi selector: matchLabels: app: service1-folder2 --- # service2 用于挂载 folder1 的 PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-service2-folder1 spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi selector: matchLabels: app: service2-folder1 --- # service2 用于挂载 folder2 的 PVC(复用service1的PV) apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-service2-folder2 spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi selector: matchLabels: app: service1-folder2
第三步:在Pod中挂载PVC
将PVC挂载到服务Pod的对应路径,示例:
# service1 的 Pod apiVersion: v1 kind: Pod metadata: name: service1-pod spec: containers: - name: service1-container image: your-service-image volumeMounts: - name: vol-folder1 mountPath: /app/folder1 # 容器内挂载路径 - name: vol-folder2 mountPath: /app/folder2 volumes: - name: vol-folder1 persistentVolumeClaim: claimName: pvc-service1-folder1 - name: vol-folder2 persistentVolumeClaim: claimName: pvc-service1-folder2 --- # service2 的 Pod apiVersion: v1 kind: Pod metadata: name: service2-pod spec: containers: - name: service2-container image: your-service-image volumeMounts: - name: vol-folder1 mountPath: /app/folder1 - name: vol-folder2 mountPath: /app/folder2 volumes: - name: vol-folder1 persistentVolumeClaim: claimName: pvc-service2-folder1 - name: vol-folder2 persistentVolumeClaim: claimName: pvc-service2-folder2
2. 动态模式(使用StorageClass)
如果想减少手动创建PV的工作量,可部署NFS Provisioner实现动态PV:
- 先部署
nfs-subdir-external-provisioner,配置它连接你的NFS服务器(192.168.0.2)的根目录(比如/data)。 - 创建StorageClass:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-sc provisioner: k8s-sigs.io/nfs-subdir-external-provisioner parameters: pathPattern: "${.PVC.namespace}/${.PVC.name}" # 自定义NFS上的目录生成规则 onDelete: "retain" # 删除PVC时保留NFS目录
- 创建PVC时指定该StorageClass,Provisioner会自动在NFS服务器上创建对应目录并生成PV。
但注意:动态模式默认生成新目录,若要复用已存在的目录,需手动关联PV和目录;跨目录共享的场景,还是建议通过让多个PVC绑定同一个PV(静态模式)或者多个Pod挂载同一个PVC来实现。
能不能直接用StorageClass而不用PV/PVC?
不行。StorageClass只是动态生成PV的配置模板,最终存储的请求和分配还是依赖PVC和PV:Pod必须挂载PVC(或直接挂载PV,但不推荐)来获取存储资源,所以无法跳过PV/PVC直接使用StorageClass。
内容的提问来源于stack exchange,提问作者Dr.PB
相关产品推荐
相关产品推荐

