【k8s】pvc 配置的两种方式volumeClaimTemplates 和 PersistentVolumeClaim

pvc配置实例

实例1

复制代码
在Deployment中配置 

  template:
     xxxxxx
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
        storageClassName: nfsdev-storageclass (创建好的storageClassName)

实例2

复制代码
#先创建一个pvc 然后在 Deployment中引用
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nacosserver-pvc
  namespace: xxxdev
spec:
  storageClassName: course-nfs64storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

##################################################
      containers
          ........
          #创建了卷pvcdata,然后挂载到容器中的某个目录
          volumeMounts:
            - name: pvcdata
              mountPath: /home/nacos/plugins/peer-finder
              subPath: peer-finder
            - name: pvcdata
              mountPath: /home/nacos/data
              subPath: data
            - name: pvcdata
              mountPath: /home/nacos/logs
              subPath: logs
      # 修复点 2: volumes 定义在 Pod 级别(与 containers 同级)
      volumes:
        - name: pvcdata
          persistentVolumeClaim:
            claimName: nacosserver-pvc

两种pvc使用的不同

这两个配置涉及 Kubernetes 中两种不同的 PVC(PersistentVolumeClaim)使用方式,主要区别在于创建方式使用场景


1. volumeClaimTemplates (动态模板方式)

复制代码
volumeClaimTemplates:       # 用于 StatefulSet 的动态 PVC 模板
  - metadata:
      name: data           # 生成的 PVC 名称前缀(如 data-0, data-1)
    spec:
      accessModes: [ "ReadWriteMany" ]  # 多节点读写
      storageClassName: "course-nfs64storag"  # 存储类名称(注意拼写)
      resources:
        requests:
          storage: 20Gi    # 请求 20GB 存储
✅ 特点:
  • 动态创建 PVC

    StatefulSet 被部署时,Kubernetes 会自动为每个 Pod 副本生成独立的 PVC (如 data-<pod-name>-0, data-<pod-name>-1)。

  • 绑定 StatefulSet 生命周期

    删除 StatefulSet 时,关联的 PVC 默认不会被删除(需手动清理)。

  • 适用场景

    有状态应用(如 MySQL、Redis 集群),每个 Pod 需要独立的持久化存储。


2. 独立 PVC + 手动引用方式

复制代码
# 先创建独立的 PVC 资源
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nacosserver-pvc      # 固定名称的 PVC
  namespace: xxxdev     # 指定命名空间
spec:
  storageClassName: course-nfs64storage  # 存储类名称
  accessModes:
    - ReadWriteOnce         # 单节点读写
  resources:
    requests:
      storage: 1Gi          # 请求 1GB 存储
---
# 在 Pod/Deployment 中引用已存在的 PVC
volumes:
  - name: pvcdata
    persistentVolumeClaim:
      claimName: nacosserver-pvc  # 直接引用 PVC 名称
✅ 特点:
  • 静态创建 PVC

    手动提前创建 PVC 资源(通过 kubectl apply)。

  • 跨 Pod 共享存储

    多个 Pod 可通过 claimName 引用同一个 PVC(需访问模式支持,如 ReadWriteMany)。

  • 独立生命周期

    PVC 与 Pod 解耦,删除 Pod 不会删除 PVC。

  • 适用场景

    通用存储需求(如单实例应用、共享存储目录)。


🔍 关键区别总结:

特性 volumeClaimTemplates (StatefulSet) 独立 PVC + claimName
PVC 创建方式 动态生成(按 Pod 副本数自动创建) 手动预先创建
PVC 命名规则 自动生成(如 data-0, data-1 固定名称(如 nacosserver-pvc
存储隔离性 每个 Pod 有独立 PVC 多个 Pod 可共享同一 PVC
访问模式 示例中为 ReadWriteMany(多节点读写) 示例中为 ReadWriteOnce(单节点读写)
适用控制器 专用于 StatefulSet 适用于 Pod/Deployment/StatefulSet
生命周期管理 随 StatefulSet 创建/删除(PVC 需手动删) 独立管理

❗ 注意事项:

  1. 访问模式冲突

    示例中 volumeClaimTemplates 使用 ReadWriteMany,而独立 PVC 使用 ReadWriteOnce
    若多个 Pod 同时挂载独立 PVC,必须使用 ReadWriteMany,否则会出现挂载错误

  2. 存储类名称拼写
    volumeClaimTemplates 中为 course-nfs64storag(少字母 e),独立 PVC 中为 course-nfs64storage
    需确保名称一致,否则可能因存储类不存在导致 PVC 挂起。

  3. 存储大小差异

    动态模板申请 20Gi,独立 PVC 申请 1Gi,根据实际需求调整。


💡 选择建议:

  • 需要 为每个 Pod 提供独立存储 (如数据库集群)→ volumeClaimTemplates + StatefulSet

  • 需要 共享存储卷 (如配置文件目录)→ 独立 PVC + claimName

    (确保存储类支持 ReadWriteMany,如 NFS)