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
相关推荐
\光辉岁月/11 小时前
2.spring5-IOC
java·容器·ioc·注解
分布式存储与RustFS11 小时前
把 LSM 引擎直接架在对象存储上:slatedb 能不能跑在 RustFS 上?
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
java_logo11 小时前
Docker 部署 Excalidraw:轻松搭建手绘风格白板
运维·docker·容器·excalidraw·白板·轩辕镜像
时间售卖铺14 小时前
MySQL 日志管理
运维·数据库·mysql·云原生
老郭a14 小时前
流量一涨 Pod 扩不出来?K8s HPA 弹性伸缩配置避坑指南
云原生
程序员清风14 小时前
LibreChat 实战:用 Docker 搭建可扩展的多模型对话平台
运维·docker·容器
Web3&Basketball15 小时前
从0到1落地AI Agent沙箱隔离Docker实战:踩坑全记录
运维·docker·容器·agent·容器安全·沙箱隔离
xianyuCcCcCCCcc15 小时前
Kubernetes Service 与网络代理
网络·云原生·kubernetes
bluebonnet2716 小时前
【docker】使用regctl免安装docker下载镜像
运维·docker·容器
我不会起名字32216 小时前
PV/PVC 一直 Pending:StorageClass 与绑定条件的 4 个检查点
云原生·kubernetes·pvc·排查