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