You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 先部署nfs-subdir-external-provisioner,配置它连接你的NFS服务器(192.168.0.2)的根目录(比如/data)。
  2. 创建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目录
  1. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:36:15