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: 最小的资源需求,节点资源不足这个限制,不会调度到该节点 limits 和 requests 限制的资源 storage、cpu、memory
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
相关推荐
寻林写彡15 小时前
01| 裸机部署 K8S:从零搭建生产可用集群
云原生·kubernetes
更深兼春远18 小时前
第2篇:Dify 部署保姆级教程:用 Docker跑起来
docker·容器·dify
念何架构之路18 小时前
zap WriteSyncer与Sink体系
云原生·golang
小白的码BUG之路1 天前
Docker -- No space left on device
运维·docker·容器
EatFan1 天前
从云原生到AI原生:2026后端架构“三驾马车”(事件驱动、虚拟线程、AI Agent内嵌)演进解析
spring boot·云原生·架构·虚拟线程·ai-native·ai agent·spring ai
wzq11_6661 天前
Kubernetes集群——Service篇(详细讲解!!!)
云原生·容器·kubernetes
程序员老陆1 天前
Docker 命令全景指南:从镜像构建到生产运维
运维·docker·容器
Henry-SAP2 天前
SAP MRP失效根源业务角度解析
人工智能·云原生·sap·erp
江湖有缘2 天前
3款开源绘图工具整理合集,可Docker一键部署!
docker·容器·开源
nhdh2 天前
Higress:AI时代云原生网关新选择
人工智能·云原生