Kubernests YAML 详细之卷(PV、PVC、StorageClass)

一、PersistentVolume YAML

PersistentVolume(PV)是集群中已由管理员配置的一段网络存储

复制代码
kubectl explain pv
字段 值类型 说明 选项
accessModes []string 访问模式 ReadWriteOnce: 卷可以被同一个节点上资源以读写方式挂载。(list 中简称 RWX) ReadOnlyMany: 卷可以被多个节点以只读方式挂载。(list 中简称 ROX) ReadWriteMany: 卷可以被多个节点以读写方式挂载。(list 中简称 RWX) ReadWriteOncePod: 卷可以被单个 Pod 以读写方式挂载。这只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本。(list 中简称 RWOP )
capacity map[string]string 设置存储容量 storage: 容量大小(单位:Ki Mi Gi Ti Pi Ei),如:storage: 10Gi
nfs Object nfs 网络存储 * path: nfs 目录地址 readOnly: 是否只读,默认 False * server: nfs 服务器地址
persistentVolumeReclaimPolicy string 回收策略 Delete: 删除 pv 后数据也删除 注意: \color{red}{注意:} 注意:这里我试验的时候删除 pvc 和 pv 后 nfs 里面的数据没有被删除 Retain: 默认 删除 pv 里面的 pvc 后 pv 状态为 released,pv 里面的数据不会被删除。重新创建 pvc 数据恢复。删除 pv 里面的数据也不会被删除
claimRef ObjectReference PersistentVolumeClaim(PVC)的绑定引用。 设置后代表该 PV 已被绑定使用
csi CSIPersistentVolumeSource 使用 CSI 插件提供的卷。 用于外部存储驱动插件(CSI Driver)挂载卷
fc FCVolumeSource 光纤通道。使用 Fibre Channel 卷,适用于 SAN 网络存储。 依赖主机支持 FC 协议
hostPath HostPathVolumeSource 使用主机路径作为卷,仅适用于测试或单节点。 不支持多节点集群使用,详见 hostpath
iscsi ISCSIPersistentVolumeSource 使用 iSCSI 卷,连接外部 SAN 存储。 需要配置 iSCSI 目标地址和 Lun 等
local LocalVolumeSource 直接挂载本地磁盘设备,具有节点亲和性。 推荐用于 StatefulSet 本地存储
mountOptions []string 卷挂载时的参数设置。 如:["ro", "soft"],无效值会导致挂载失败
nodeAffinity VolumeNodeAffinity 定义该卷在哪些节点上可用。 控制 Pod 调度到匹配的节点
photonPersistentDisk PhotonPersistentDiskVolumeSource 用于 VMware Photon Controller 的卷。 适用于 Photon 云环境
quobyte QuobyteVolumeSource 使用 Quobyte 文件系统的卷。 Quobyte 是一个分布式文件系统
scaleIO ScaleIOPersistentVolumeSource 使用 Dell EMC ScaleIO 卷。 需要特定插件支持
storageClassName string 指定该卷使用的 StorageClass 名称。 留空代表手动创建的 PV,不会被动态绑定
storageos StorageOSPersistentVolumeSource 使用 StorageOS 卷的声明。 StorageOS 是一种容器原生存储方案
volumeMode string 卷是否作为文件系统或块设备使用。 Filesystem(默认):卷会被格式化为文件系统(如 ext4、xfs),然后以文件系统的形式挂载到 Pod 中使用。 Block: 卷不会被格式化,也不会挂载为文件系统,而是作为原始块设备,直接映射给 Pod 中的容器使用。
vsphereVolume VsphereVirtualDiskVolumeSource 使用 VMware vSphere 的虚拟磁盘卷。 用于 VMware 虚拟化环境

示例: 创建 pv

yaml 复制代码
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-1
  labels:
    pv: pv1
spec:
  accessModes:                  # 定义 pv 续写默认
  - "ReadWriteOnce"
  capacity:                     # 定义可使用的容量
    storage: 100Mi
  nfs:                          # 使用 nfs 定义 pv
    path: /root/nfs_data/data1  # nfs 文件地址
    server: fns_ip              # nfs 服务器 ip 地址

二、PersistentVolumeClaim yaml

持久卷申领 PersistentVolumeClaim(PVC)是用户存储的请求

复制代码
kubectl explain pvc
字段 值类型 说明
accessModes []string 访问模式, 注意: \color{red}{注意:} 注意:必须和 PV 的访问模式相同 ReadWriteOnce: 卷可以被同一个节点上资源以读写方式挂载。(list 中简称 RWX) ReadOnlyMany: 卷可以被多个节点以只读方式挂载。(list 中简称 ROX) ReadWriteMany: 卷可以被多个节点以读写方式挂载。(list 中简称 RWX) ReadWriteOncePod: 卷可以被单个 Pod 以读写方式挂载。这只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本。(list 中简称 RWOP )
dataSource Object
dataSourceRef Object
resources Object 资源限制 limits: 限制最大可用资源 requests: 最小的资源需求,节点资源不足这个限制,不会调度到该节点 limitsrequests 限制的资源 storagecpumemory
selector Object 便签选择器,选择要使用的 pv 匹配方式: matchExpressions:表达式方式匹配 pod,参考上面示例有很多 matchLabels:标签 pod 匹配 mapstringstring 这个类型
storageClassName string 存储类的名字,存储类的名字,关于存储类 看 \color{red}{看} 看: S t o r a g e C l a s s Y A M L \color{blue}{StorageClass YAML} StorageClassYAML
volumeMode string
volumeName string

示例: 创建 pvc

yaml 复制代码
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-1
spec:
  accessModes:        # 定义访问模式,必须和 pv 的访问模式相同
  - "ReadWriteOnce"
  selector:           # 定义标签选择器
    matchLabels:
      pv: pv1         # 这是 pv 的标签
  resources:          # 资源限制
    requests:         # 限制最小可用资源
      storage: 100Mi  # 限制存储为 100Mi

三、StorageClass YAML

动态创建 pv。简写 sc

复制代码
kubectl explain sc
字段 值类型 说明
allowVolumeExpansion boolean 是否允许卷扩展,只扩不缩。扩展支持情况
allowedTopologies []Object
mountOptions []string
parameters map[string]string 给供应商提供的参数
provisioner string 供应商,如: ceph、AzureFile 等
reclaimPolicy string 回收策略,默认:delete
volumeBindingMode string

示例:

示例是以 nfs 为例;k8s 部署 nfs provisioner

创建 StorageClass

yaml 复制代码
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs
provisioner: example.com/nfs   # 这里是你 nfs deployment 服务创建时候 PROVISIONER_NAME 的值

使用 StorageClass 关联 nfs 服务创建 pvc。此时自动创建 pv 和 pvc

yaml 复制代码
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc1
spec:
  accessModes:  ["ReadWriteMany"]
  resources:
    requests:
      storage: 1Gi                  # 存储资源请求大小
  storageClassName:  nfs            # 这里是 StorageClass.metadata.name 的值

---

kind: Pod
apiVersion: v1
metadata:
  name: test-mount
spec:
  containers:
  - name: test-mount
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - name: nfs-pvc               # 下面卷的名字
        mountPath: /usr/share/nginx/html
  restartPolicy: "Never"            # 重启策略
  volumes:
    - name: nfs-pvc                 # 创建的卷的名字
      persistentVolumeClaim:
        claimName: test-pvc1        # 这里是 pvc 的名字

四、之间的关系

组件 功能
PV(持久化卷) 是"真实的存储资源",可以是手动创建或通过 StorageClass 动态创建出来的
PVC(持久化卷声明) 说"我要一个什么样的卷"
StorageClass(存储类) 定义了"怎么创建卷",用于动态创建 PV
相关推荐
独自归家的兔2 分钟前
2026年7月2日 Docker 容器化部署 PaddleOCR-VL 实战(OpenAI 协议兼容 HTTP 调用)
运维·docker·容器
kylin-运维1 小时前
k8s可视化看板嵌入AI助手(悬浮对话球)
人工智能·容器·kubernetes·aicoding
会飞的土拨鼠呀2 小时前
Docker 容器维护手册
docker·容器·eureka
hhb_6182 小时前
云原生AI工作流分布式调度实战
人工智能·云原生
慕伏白2 小时前
【慕伏白】Docker 常用指令
docker·容器·eureka
阿里云云原生2 小时前
明文不扩散,日志仍可用:阿里云可观测敏感数据保护方案
云原生
java_logo2 小时前
Docker 部署 Trilium Notes 完整教程:自建大型知识库
docker·容器·trilium·trilium note·trilium部署·docker部署trilium·trilium部署文档
梦想的颜色2 小时前
【Docker 原理】Docker 数据持久化完全指南:三种挂载原理、数据卷实操、数据库落地实战
docker·云原生·数据持久化·volume·数据卷·容器挂载
石小千4 小时前
修改Docker Engine 存储路径
运维·docker·容器
@insist1235 小时前
系统规划与管理师-云原生系统建设规划与实践案例
云原生·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师