在工作負載中使用 StorageClasses

AWS 上的 GKE 會自動部署容器儲存介面 (CSI) Amazon Elastic Block Store (EBS)Amazon Elastic File Store (EFS)

EBS CSI 驅動程式和 EFS CSI 驅動程式版本與 AWS 上的 GKE Kubernetes 版本相關。GKE 版本發布時,驅動程式版本通常是最新版本。叢集升級時,驅動程式會自動更新。

使用預設 StorageClass

建立 PersistentVolumeClaim 時,如果沒有 spec.storageClassName 欄位,系統會使用預設的 GKE on AWS EBS CSI Driver StorageClass,佈建一般用途 SSD 磁碟區 (gp2)

下列 YAML 會建立名為 mypvc 的 PersistentVolumeClaim (PVC),大小為 30 gibibytes。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

使用其他預先安裝的 StorageClass

AWS EBS CSI 驅動程式的 GKE 也包含 premium-rwo StorageClass,可佈建總處理量較高的佈建 IOPS SSD 磁碟區 (io1) 磁碟區

如要使用,請在 PVC 的 spec.storageClassName 中指定。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: premium-rwo

使用自訂 StorageClass

如果預設或 premium-rwo StorageClass 都不符合需求,您可以為 EBS 磁碟區建立額外的 StorageClass,或使用 Container Storage Interface (CSI) 驅動程式。

  1. 選擇您使用的是 EBS 磁碟區或其他 CSI 驅動程式。

    EBS 磁碟區

    這個分頁說明如何建立自訂 StorageClass,指定 EBS 磁碟區類型、檔案系統類型和其他參數。如要瞭解其他 StorageClass 參數,請前往 GKE on AWS EBS CSI Driver GitHub 頁面

    如要設定自訂 StorageClass,請將下列 YAML 資訊清單複製到名為 my-custom-class.yaml 的檔案。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    

    CLASS_NAME 替換為新 StorageClass 的名稱。

    舉例來說,下列 YAML 會建立新的 StorageClass,並使用 XFS 檔案系統格式化,佈建以輸送量最佳化 HDD 為基礎的 EBS 磁碟區

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-class
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    自訂 EFS StorageClass

    本分頁說明如何為 EFS CSI 驅動程式佈建器建立自訂 StorageClass。如需這個 StorageClass 的必要條件清單,請參閱「使用 EFS 資源」。EFS CSI 驅動程式頁面列出下列資訊清單以外的其他 StorageClass 參數。

    將下列 YAML 資訊清單複製到名為 my-custom-class.yaml 的檔案。

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: <var>EFS_STORAGE_CLASS_NAME</var>
    provisioner: efs.csi.aws.com
    mountOptions:
      - tls
    parameters:
      provisioningMode: efs-ap
      fileSystemId: EFS_ID
      directoryPerms: "700"
    

    取代:

    • EFS_STORAGE_CLASS_NAME 替換為 StorageClass 的名稱。
    • EFS_ID,例如 fs-12345678a。

    CSI 驅動程式

    您可以在 provisioner 欄位中指定其他 CSI 驅動程式。

    如要使用其他 CSI 驅動程式建立 StorageClass,可以使用下列 YAML 範例。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      ...
    

    更改下列內容:

    • CSI_DRIVER_NAME,並提供 CSI 驅動程式的名稱,例如 csi.example.com
    • CLASS_NAME 替換為 StorageClass 的名稱,例如 my-custom-class

    根據 CSI 驅動程式,設定 parameters 底下的子欄位。

  2. 將 YAML 套用至叢集。

    kubectl apply -f my-custom-class.yaml
    

使用自訂 StorageClass 建立 PersistentVolumeClaim

  1. 建立自訂 StorageClass 後,您可以在 PVC 中指定該類別。以下範例會建立名為 my-pvc 的 PVC,並參照 StorageClass my-custom-class

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 30Gi
      storageClassName: my-custom-class
    

設定預設儲存空間級別

GKE on AWS 使用名為 standard-rwo 的預設 StorageClass,可佈建 gp2 EBS 磁碟區。您可以將預設值變更為其他 StorageClass。

如要變更預設的 StorageClass,請按照下列步驟操作:

  1. 使用 kubectl patch 更新 standard-rwo StorageClass 的 is-default-class 註解。

    kubectl patch storageclass standard-rwo -p \
    '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    
  2. 建立具有註解 storageclass.kubernetes.io/is-default-class: true 的新 StorageClass。

    下列範例 StorageClass 使用 ebs.csi.aws.com 驅動程式。如要安裝其他儲存空間驅動程式,請參閱「安裝其他 CSI 驅動程式」。

    將下列 YAML 複製到名為 my-custom-class.yaml 的檔案。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
      annotations:
        storageclass.kubernetes.io/is-default-class: true
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

    更改下列內容:

    • EBS_VOLUME_TYPE:StorageClass 建立的 AWS EBS 磁碟區類型
    • CLASS_NAME,並將其替換為新的 StorageClass 名稱

    舉例來說,下列 YAML 會建立新的預設 StorageClass,用於佈建一般用途 SSD 磁碟區 (gp3)

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: my-custom-default-class
      annotations:
        storageclass.kubernetes.io/is-default-class: "true"
    provisioner: ebs.csi.aws.com
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: gp3
    
  3. 將新的自訂類別套用至叢集。

    kubectl apply -f my-custom-class.yaml
    

套用這個資訊清單後,GKE on AWS 會將 my-custom-default-class StorageClass 用於新的儲存空間要求。

在 StatefulSet 中參照 StorageClass

如要使用新的 StorageClass,您必須在 StatefulSet 的 volumeClaimTemplates 中參照該類別。

在 StatefulSet 的 volumeClaimTemplates 規格中參照 StorageClass 時,Kubernetes 會使用 PersistentVolume (PV) 提供穩定儲存空間。Kubernetes 會呼叫 StorageClass 中定義的佈建器,建立新的儲存空間磁碟區。佈建磁碟區後,Kubernetes 會自動建立 PV。

下列 StatefulSet 會參照 my-custom-class StorageClass,並佈建 1 gibibyte 的磁碟區:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # This is the specification in which you reference the StorageClass
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
      storageClassName: my-custom-class # This field references the existing StorageClass

後續步驟