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