一、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

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 匹配 map[string]string 这个类型
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

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

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

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

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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐