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
相关推荐
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
秋播2 天前
国内本地WSL2编译rancher源码
云原生
小猿姐3 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
阿里云云原生4 天前
深入内核:拆解 OpenTelemetry eBPF 探针如何优雅地“透视”多语言微服务?
云原生
2601_961875244 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj4 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵4 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops
正经教主4 天前
【docker基础】 第八周:容器监控与应用更新策略
运维·docker·容器
kiros_wang4 天前
Docker 使用完整指南
运维·docker·容器
正经教主5 天前
【docker基础】第九周:Docker安全与镜像优化
运维·docker·容器