StorageClass描述了集群中的存儲類型“分類”,在創建PVC/PV均需要指定StorageClass。目前CCE默認提供csi-disk、csi-nas、csi-obs等StorageClass,在聲明PVC時使用對應StorageClassName,就可以自動創建對應類型PV,并自動創建底層的存儲資源。
執行如下命令即可查詢CCE提供的默認StorageClass。您可以使用CCE提供的CSI插件自定義創建StorageClass,但從功能角度與CCE提供的默認StorageClass并無區別,這里不做過多描述。
# kubectl get sc
NAME PROVISIONER AGE
csi-disk everest-csi-provisioner 17d # 云硬盤 StorageClass
csi-nas everest-csi-provisioner 17d # 文件存儲 1.0 StorageClass
csi-sfs everest-csi-provisioner 17d # 文件存儲 3.0 StorageClass
csi-obs everest-csi-provisioner 17d # 對象存儲 StorageClass
csi-sfsturbo everest-csi-provisioner 17d # 極速文件存儲 StorageClass
csi-local-topology everest-csi-provisioner 17d # 本地持久卷
定義了StorageClass后,就可以減少創建并維護PV的工作,PV變成了自動創建,作為使用者,只需要在聲明PVC時指定StorageClassName即可,這就大大減少工作量。
除了使用CCE提供的StorageClass外,您還可以自定義StorageClass,使用自定義StorageClass有時能為使用帶來一定的方便。下面將詳細介紹這些的應用現狀、解決方案以及自定義StorageClass的方法等。
應用現狀
CCE中使用存儲時,最常見的方法是創建PVC時通過指定StorageClassName定義要創建存儲的類型,如下所示,使用PVC申請一個SAS(高I/O)類型云硬盤/塊存儲。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-evs-example
namespace: default
annotations:
everest.io/disk-volume-type: SAS
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-disk
可以看到在CCE中如果需要指定云硬盤的類型,是通過everest.io/disk-volume-type: SAS字段指定,這里SAS是云硬盤的類型,代表高I/O,還有SSD(超高I/O)可以指定。
這種寫法在如下幾種場景下存在問題:
- 部分用戶覺得使用everest.io/disk-volume-type指定云硬盤類型比繁瑣,希望只通過StorageClassName指定。
- 部分用戶是從自建Kubernetes或其他Kubernetes服務切換到CCE,已經寫了很多應用的YAML文件,這些YAML文件中通過不同StorageClassName指定不同類型存儲,遷移到CCE上時,使用存儲就需要修改大量YAML文件或Helm Chart包,這非常繁瑣且容易出錯。
- 部分用戶希望能夠設置默認的StorageClassName,所有應用都使用默認存儲類型,在YAML中不用指定StorageClassName也能按創建默認類型存儲。
解決方案
本文介紹在CCE中自定義StorageClass的方法,并介紹設置默認StorageClass的方法,通過不同StorageClassName指定不同類型存儲。
- 對于第一個問題:可以將SAS、SSD類型云硬盤分別定義一個StorageClass,比如定義一個名為csi-disk-sas的StorageClass,這個StorageClass創建SAS類型的存儲,則前后使用的差異如下圖所示,編寫YAML時只需要指定StorageClassName,符合特定用戶的使用習慣。

- 對于第二個問題:可以定義與用戶現有YAML中相同名稱的StorageClass,這樣可以省去修改YAML中StorageClassName的工作。
- 對于第三個問題:可以設置默認的StorageClass,則YAML中無需指定StorageClassName也能創建存儲,按如下寫法即可。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-evs-example namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi
自定義StorageClass
自定義高I/O類型StorageClass,使用YAML描述如下,這里取名為csi-disk-sas,指定云硬盤類型為SAS,即高I/O。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-disk-sas # 高IO StorageClass名字,用戶可自定義
parameters:
csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
csi.storage.k8s.io/fstype: ext4
everest.io/disk-volume-type: SAS # 云硬盤高I/O類型,用戶不可自定義
everest.io/passthrough: "true"
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true # true表示允許擴容
超高I/O類型StorageClass,這里取名為csi-disk-ssd,指定云硬盤類型為SSD,即超高I/O。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-disk-ssd # 超高I/O StorageClass名字,用戶可自定義
parameters:
csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
csi.storage.k8s.io/fstype: ext4
everest.io/disk-volume-type: SSD # 云硬盤超高I/O類型,用戶不可自定義
everest.io/passthrough: "true"
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
reclaimPolicy:底層云存儲的回收策略,支持Delete、Retain回收策略。
- Delete :刪除PVC,PV資源與云硬盤均被刪除。
- Retain :刪除PVC,PV資源與底層存儲資源均不會被刪除,需要手動刪除回收。PVC刪除后PV資源狀態為“已釋放(Released)”,不能直接再次被PVC綁定使用。
說明
此處設置的回收策略對SFS Turbo類型的存儲無影響,因此刪除集群或刪除PVC時不會回收包周期的SFS Turbo資源。
如果數據安全性要求較高,建議使用Retain以免誤刪數據。
定義完之后,使用kubectl create命令創建。
# kubectl create -f sas.yaml
storageclass.storage.k8s.io/csi-disk-sas created
# kubectl create -f ssd.yaml
storageclass.storage.k8s.io/csi-disk-ssd created
再次查詢StorageClass,回顯如下,可以看到多了兩個類型的StorageClass。
# kubectl get sc
NAME PROVISIONER AGE
csi-disk everest-csi-provisioner 17d
csi-disk-sas everest-csi-provisioner 2m28s
csi-disk-ssd everest-csi-provisioner 16s
csi-disk-topology everest-csi-provisioner 17d
csi-nas everest-csi-provisioner 17d
csi-obs everest-csi-provisioner 17d
csi-sfsturbo everest-csi-provisioner 17d
其他類型存儲自定義方法類似,可以使用 kubectl 獲取YAML,在YAML基礎上根據需要修改。
- 文件存儲
# kubectl get sc csi-nas -oyaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-nas
provisioner: everest-csi-provisioner
parameters:
csi.storage.k8s.io/csi-driver-name: nas.csi.everest.io
csi.storage.k8s.io/fstype: nfs
everest.io/share-access-level: rw
everest.io/share-access-to: 5e3864c6-e78d-4d00-b6fd-de09d432c632 # 集群所在VPC ID
everest.io/share-is-public: 'false'
everest.io/zone: xxxxx # 可用區
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
- 對象存儲
# kubectl get sc csi-obs -oyaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-obs
provisioner: everest-csi-provisioner
parameters:
csi.storage.k8s.io/csi-driver-name: obs.csi.everest.io
csi.storage.k8s.io/fstype: s3fs # 對象存儲文件類型,s3fs是對象桶,obsfs是并行文件系統
everest.io/obs-volume-type: STANDARD # OBS桶的存儲類別
reclaimPolicy: Delete
volumeBindingMode: Immediate
指定StorageClass的企業項目
CCE支持使用存儲類創建云硬盤和對象存儲類型PVC時指定企業項目,將創建的存儲資源(云硬盤和對象存儲)歸屬于指定的企業項目下, 企業項目可選為集群所屬的企業項目或default企業項目 。
若不指定企業項目,則創建的存儲資源默認使用存儲類StorageClass中指定的企業項目,CCE提供的 csi-disk 和 csi-obs 存儲類,所創建的存儲資源屬于default企業項目。
如果您希望通過StorageClass創建的存儲資源能與集群在同一個企業項目,則可以自定義StorageClass,并指定企業項目ID,如下所示。
說明
該功能需要Everest插件升級到1.2.33及以上版本。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: csi-disk-epid # 自定義名稱
provisioner: everest-csi-provisioner
parameters:
csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
csi.storage.k8s.io/fstype: ext4
everest.io/disk-volume-type: SAS
everest.io/enterprise-project-id: 86bfc701-9d9e-4871-a318-6385aa368183 # 指定企業項目id
everest.io/passthrough: 'true'
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
指定默認StorageClass
您還可以指定某個StorageClass作為默認StorageClass,這樣在創建PVC時不指定StorageClassName就會使用默認StorageClass創建。
例如將csi-disk-ssd指定為默認StorageClass,則可以按如下方式設置。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-disk-ssd
annotations:
storageclass.kubernetes.io/is-default-class: "true" # 指定集群中默認的StorageClass,一個集群中只能有一個默認的StorageClass
parameters:
csi.storage.k8s.io/csi-driver-name: disk.csi.everest.io
csi.storage.k8s.io/fstype: ext4
everest.io/disk-volume-type: SSD
everest.io/passthrough: "true"
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
先刪除之前創建的csi-disk-ssd,再使用kubectl create命令重新創建,然后再查詢StorageClass,顯示如下。
# kubectl delete sc csi-disk-ssd
storageclass.storage.k8s.io "csi-disk-ssd" deleted
# kubectl create -f ssd.yaml
storageclass.storage.k8s.io/csi-disk-ssd created
# kubectl get sc
NAME PROVISIONER AGE
csi-disk everest-csi-provisioner 17d
csi-disk-sas everest-csi-provisioner 114m
csi-disk-ssd (default) everest-csi-provisioner 9s
csi-disk-topology everest-csi-provisioner 17d
csi-nas everest-csi-provisioner 17d
csi-obs everest-csi-provisioner 17d
csi-sfsturbo everest-csi-provisioner 17d
配置驗證
- 使用csi-disk-sas創建PVC。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sas-disk
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-disk-sas
創建并查看詳情,如下所示,可以發現能夠創建,且StorageClass顯示為csi-disk-sas
# kubectl create -f sas-disk.yaml
persistentvolumeclaim/sas-disk created
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 24s
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 30s
在CCE控制臺界面上查看PVC詳情,在存儲配置中可以看到磁盤類型是高I/O。
- 不指定StorageClassName,使用默認配置,如下所示,并未指定storageClassName。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ssd-disk
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
創建并查看,可以看到PVC ssd-disk的StorageClass為csi-disk-ssd,說明默認使用了csi-disk-ssd。
# kubectl create -f ssd-disk.yaml
persistentvolumeclaim/ssd-disk created
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
sas-disk Bound pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO csi-disk-sas 16m
ssd-disk Bound pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO csi-disk-ssd 10s
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-4d2b059c-0d6c-44af-9994-f74d01c78731 10Gi RWO Delete Bound default/ssd-disk csi-disk-ssd 15s
pvc-6e2f37f9-7346-4419-82f7-b42e79f7964c 10Gi RWO Delete Bound default/sas-disk csi-disk-sas 17m
在CCE控制臺界面上查看PVC詳情,在存儲配置中可以看到磁盤類型是超高I/O。