PVC描述的是负载对存储卷的申领,PVC的申领会消耗集群中存量的PV资源,若集群中无存量PV资源,会动态创建底层存储及PV资源;创建PVC时,需描述请求的持久化存储的属性,比如,Volume存储的大小、可读写权限等等。
约束与限制
创建PVC会先匹配集群中是否有配置相同、且状态为可用状态的PV,如果存在,PVC将首先选择可匹配的,且为可用状态的PV进行绑定,在集群中无满足匹配条件的PV时,动态创建新的存储。
字段含义 | pvc字段 | pv字段 | 匹配逻辑 |
---|---|---|---|
region | pvc.metadata.labels(failure-domain.beta.kubernetes.io/region或者topology.kubernetes.io/region) | pv.metadata.labels(failure-domain.beta.kubernetes.io/region或者topology.kubernetes.io/region) | 同时定义/不被定义,若定义需要内容一致 |
zone | pvc.metadata.labels(failure-domain.beta.kubernetes.io/zone或者topology.kubernetes.io/zone) | pv.metadata.labels(failure-domain.beta.kubernetes.io/zone或者topology.kubernetes.io/zone) | 同时定义/不被定义,若定义需要内容一致 |
云硬盘类型 | pvc.metadata.annotations(everest.io/disk-volume-type) | pv.spec.csi.volumeAttributes(everest.io/disk-volume-type) | 同时定义/不被定义,若定义需要内容一致 |
秘钥id | pvc.metadata.annotations(everest.io/crypt-key-id) | pv.spec.csi.volumeAttributes(everest.io/crypt-key-id) | 同时定义/不被定义,若定义需要内容一致 |
企业项目id | pvc.metadata.annotations(everest.io/enterprise-project-id) | pv.spec.csi.volumeAttributes(everest.io/enterprise-project-id) | 同时定义/不被定义,若定义需要内容一致 |
accessMode | accessMode | accessMode | 内容一致 |
存储类 | storageclass | storageclass | 内容一致 |
存储卷访问模式
PV只能以底层存储资源所支持的方式挂载到宿主系统上。例如,文件存储可以支持多个节点读写,云硬盘只能被一个节点读写。
- ReadWriteOnce:卷可以被一个节点以读写方式挂载,云硬盘存储卷支持此类型。
- ReadWriteMany:卷可以被多个节点以读写方式挂载,文件存储、对象存储、极速文件存储支持此类型。
表 支持访问模式
存储类型 | ReadWriteOnce | ReadWriteMany |
---|---|---|
云硬盘EVS | √ | × |
文件存储SFS | × | √ |
对象存储OBS | × | √ |
极速文件存储SFS Turbo | × | √ |
本地持久卷LocalPV | √ | × |
企业项目支持说明
说明该功能需要Everest插件升级到1.2.33及以上版本。
-
使用存储类创建PVC:
CCE支持使用存储类创建云硬盘和对象存储类型PVC时指定企业项目,将创建的存储资源(云硬盘和对象存储)归属于指定的企业项目下, 企业项目可选为集群所属的企业项目或default企业项目 。
若不指定企业项目,则创建的存储资源默认使用存储类StorageClass中指定的企业项目。
- 对于自定义的StorageClass,可以在StorageClass中指定企业项目,详见指定StorageClass的企业项目。StorageClass中如不指定的企业项目,则默认为default企业项目。
- 对于CCE提供的 csi-disk 和 csi-obs 存储类,所创建的存储资源属于default企业项目。
-
使用存储卷PV创建PVC:
使用PV创建PVC时,因为存储资源在创建时已经指定了企业项目,如果PVC中指定企业项目,则务必确保在PVC和PV中指定的everest.io/enterprise-project-id保持一致,否则两者无法正常绑定。
使用存储类创建PVC
说明使用存储类创建的底层云硬盘、文件存储和对象存储均为按需计费模式。
存储类(StorageClass)描述了集群中的存储类型“分类”,在创建PVC需要可以指定StorageClass,动态创建PV及底层存储资源。
使用控制台创建
步骤 1 登录CCE控制台。
步骤 2 单击集群名称进入集群,在左侧选择“容器存储”,在右侧选择“存储卷声明”页签。
步骤 3 单击右上角“创建存储卷声明”,在弹出的窗口中填写存储卷“声明”参数。
-
存储卷声明类型:请根据您的需求进行选择。
-
PVC名称:指定PVC的名称。
-
创建方式:选择“动态创建”。
-
存储类:选择需要的存储类型。当前支持如下几类存储动态创建。
- csi-disk:云硬盘。
- csi-local-topology:本地持久卷。
- csi-obs:对象存储。
-
可用区(仅云硬盘支持):选择云硬盘所在可用区。
-
云硬盘类型(仅云硬盘支持):选择云硬盘的类型。云硬盘类型在不同区域会有所不同。
- 高I/O
- 超高I/O
- 通用型SSD
- 极速型SSD
-
访问模式:ReadWriteOnce和ReadWriteMany,具体请参见存储卷访问模式。
-
存储池(仅本地持久卷支持):显示支持本地持久卷的节点,具体请参见本地持久存储卷和临时存储卷。
-
容量(仅云硬盘和文件存储支持):存储的容量大小。仅云硬盘和文件存储需要配置,对象存储无需配置。
-
加密(仅云硬盘和文件存储支持):勾选底层存储是否加密,勾选后需要选择使用的加密密钥。仅云硬盘和文件存储支持加密。
-
密钥(仅对象存储支持):对象存储需要选择访问密钥,具体使用请参见对象存储卷挂载设置自定义访问密钥(AK/SK)。
-
企业项目(仅云硬盘和对象存储支持):集群所属的企业项目或default企业项目。
步骤 4 单击“创建”。
使用YAML创建
云硬盘YAML示例。
- failure-domain.beta.kubernetes.io/region:集群所在的region。
- ailure-domain.beta.kubernetes.io/zone:创建云硬盘所在的可用区,必须和工作负载规划的可用区保持一致。
- everest.io/enterprise-project-id:企业项目ID。仅支持集群所属企业项目和default企业项目,"0"表示default企业项目。
获取方法 :在CCE控制台,单击左侧栏目树中的“集群管理”,选择集群,并进入指定的集群详情页,在“基本信息”页签下找到企业项目,点击并进入对应的企业项目控制台,复制对应的ID值即可获取集群所属的企业项目的ID。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-evs-auto-example
namespace: default
annotations:
everest.io/disk-volume-type: SSD # 云硬盘的类型
everest.io/crypt-key-id: 0992dbda-6340-470e-a74e-4f0db288ed82 # 可选字段,密钥的id,使用该密钥加密云硬盘
everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 可选字段,企业项目id,Everest需升级到1.2.33及以上版本,仅支持集群所属企业项目和default企业项目,"0"表示default企业项目。
labels:
failure-domain.beta.kubernetes.io/region: cn-north-4
failure-domain.beta.kubernetes.io/zone: cn-north-4b
spec:
accessModes:
- ReadWriteOnce # 云硬盘必须为ReadWriteOnce
resources:
requests:
storage: 10Gi # 云硬盘大小,取值范围 1-32768
storageClassName: csi-disk # StorageClass类型为云硬盘
本地持久卷YAML示例,本地持久卷使用要求在节点上导入了本地持久卷,具体请参见本地持久存储卷和临时存储卷。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: obs-warm-provision-pvc
namespace: default
annotations:
everest.io/obs-volume-type: STANDARD # 桶类型,当前支持标准(STANDARD)和低频(WARM)两种桶。
csi.storage.k8s.io/fstype: obsfs # 文件类型,obsfs表示创建并行文件系统,推荐使用;s3fs表示创建对象桶
everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 可选字段,企业项目id,Everest需升级到1.2.33及以上版本,仅支持集群所属企业项目和default企业项目,"0"表示default企业项目。
spec:
accessModes:
- ReadWriteMany # 对象存储必须为ReadWriteMany
resources:
requests:
storage: 1Gi # 此处仅为校验需要(不能为空和0),设置的大小不起作用,此处设定为固定值1Gi
storageClassName: csi-obs # StorageClass类型为对象存储
使用存储卷PV创建PVC
如果已经创建了PV,则可以创建PVC申请PV的资源。
使用控制台创建
步骤 1 登录CCE控制台。
步骤 2 单击集群名称进入集群,在左侧选择“容器存储”,在右侧选择“存储卷声明”页签。
步骤 3 单击右上角“创建存储声明”,在弹出的窗口中填写存储卷“声明”参数。
- 存储卷声明类型:请根据您的需求进行选择。
- PVC名称:指定PVC的名称。
- 创建方式:选择“已有存储卷”。
- 关联存储卷:选择要关联的存储卷,即PV。
步骤 4 单击“创建”。
使用YAML创建
云硬盘YAML示例。
- failure-domain.beta.kubernetes.io/region:集群所在的region。
- failure-domain.beta.kubernetes.io/zone:创建云硬盘所在的可用区,必须和工作负载规划的可用区保持一致。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-test
namespace: default
annotations:
everest.io/disk-volume-type: SAS # 云硬盘的类型
everest.io/crypt-key-id: fe0757de-104c-4b32-99c5-ee832b3bcaa3 # 可选字段,密钥的id,使用该密钥加密云硬盘
volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 可选字段,如果指定企业项目,需保证与PV中指定的everest.io/enterprise-project-id一致,否则无法绑定
labels:
failure-domain.beta.kubernetes.io/region: cn-north-4
failure-domain.beta.kubernetes.io/zone: cn-north-4b
spec:
accessModes:
- ReadWriteOnce # 云硬盘必须为ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-disk # StorageClass的名称,云硬盘为csi-disk
volumeName: cce-evs-test # PV的名称
文件存储示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-sfs-test
namespace: default
annotations:
volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
spec:
accessModes:
- ReadWriteMany # 文件存储必须为ReadWriteMany
resources:
requests:
storage: 100Gi # PVC申请容量大小
storageClassName: csi-nas # StorageClass的名称
volumeName: cce-sfs-test # PV的名称
对象存储示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-obs-test
namespace: default
annotations:
everest.io/obs-volume-type: STANDARD # 桶类型,当前支持标准(STANDARD)和低频(WARM)两种桶。
csi.storage.k8s.io/fstype: obsfs # 文件类型,obsfs表示创建并行文件系统,推荐使用;s3fs表示创建对象桶
csi.storage.k8s.io/node-publish-secret-name: test-user
csi.storage.k8s.io/node-publish-secret-namespace: default
volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 可选字段,如果指定企业项目,需保证与PV中指定的everest.io/enterprise-project-id一致,否则无法绑定
spec:
accessModes:
- ReadWriteMany # 对象存储必须为ReadWriteMany
resources:
requests:
storage: 1Gi # PVC申请容量大小,此处仅为校验需要(不能为空和0),设置的大小不起作用,此处设定为固定值1Gi
storageClassName: csi-obs # StorageClass的名称,对象存储为csi-obs
volumeName: cce-obs-test # PV的名称
极速文件存储示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-test
namespace: default
annotations:
volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner
spec:
accessModes:
- ReadWriteMany # 极速文件存储必须为ReadWriteMany
resources:
requests:
storage: 100Gi # PVC申请容量大小
storageClassName: csi-sfsturbo # StorageClass的名称,极速文件存储为csi-sfsturbo
volumeName: pv-sfsturbo-test # PV的名称
使用快照创建PVC
通过快照创建云硬盘PVC时,磁盘类型、磁盘模式、加密属性需和快照源云硬盘保持一致。
使用控制台创建
步骤 1 登录CCE控制台。
步骤 2 单击集群名称进入集群,在左侧选择“容器存储”,在右侧选择“快照与备份”页签。
步骤 3 找到需要创建PVC的快照,单击“创建存储卷声明”,并在弹出窗口中指定PVC的名称。
步骤 4 单击“创建”。
使用YAML创建
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-test
namespace: default
annotations:
everest.io/disk-volume-type: SSD # 云硬盘类型,需要与快照源云硬盘保持一致
labels:
failure-domain.beta.kubernetes.io/region: cn-north-4
failure-domain.beta.kubernetes.io/zone: cn-north-4b
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: '10'
storageClassName: csi-disk
dataSource:
name: cce-disksnap-test # 快照的名称
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io