在工作負載中使用自訂 StorageClass

如要為 Azure 上 Google Kubernetes Engine (GKE) 的容器化工作負載定義特定儲存空間行為,請建立及使用自訂 StorageClass。您可以自訂 StorageClass,為 PersistentVolume 選取不同的 Azure 磁碟類型、檔案系統類型和其他參數,進而為應用程式調整儲存空間效能和成本。這項功能可根據工作負載的確切需求調整儲存空間,協助您執行有效率的服務。

GKE on Azure 會自動部署及管理 Azure Disk CSI 驅動程式和 Azure File CSI 驅動程式,這兩者對於處理儲存空間佈建作業至關重要。這些驅動程式的版本與 GKE on Azure Kubernetes 版本相關,並會隨著叢集升級自動更新,確保自訂 StorageClass 的相容性。

使用自訂 StorageClass

您可以為磁碟區建立額外的 StorageClass,或使用容器儲存介面 (CSI) 驅動程式。

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

    Azure 磁碟區

    您可以建立自己的自訂 StorageClass,指定 Azure 磁碟磁碟區類型、檔案系統類型和其他參數。如要瞭解其他 StorageClass 參數,請前往 GKE on Azure Azure Disk CSI 驅動程式的 GitHub 頁面

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

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

    CLASS_NAME 替換為新 StorageClass 的名稱。

    舉例來說,下列 YAML 會建立新的 StorageClass,在特定儲存空間帳戶中佈建磁碟區,並為每個新磁碟區套用 group=dev標記

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: my-custom-class
    provisioner: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
     storageAccount: my-storage-account
     tags: group=dev
    

    CSI 驅動程式

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

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

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

    替換下列值:

    • CLASS_NAME:StorageClass 的名稱 (例如 my-custom-class)。
    • CSI_DRIVER_NAME:CSI 驅動程式的名稱 (例如 csi.example.com)。

    接下來,請根據 CSI 驅動程式的文件,在 parameters 下方設定子欄位。

  2. 將 YAML 套用至叢集。

    kubectl apply -f my-custom-class.yaml
    
  3. 使用自訂 StorageClass 建立 PersistentVolumeClaim。

    建立自訂 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
    

設定預設儲存空間級別

Azure 上的 GKE 會使用名為 standard-rwo 的預設 StorageClass,佈建具有 LRS 的標準 SSD Azure 磁碟。您可以將預設值變更為其他 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 範例使用 disk.csi.azure.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: disk.csi.azure.com
    volumeBindingMode: WaitForFirstConsumer
    parameters:
     skuName: VOLUME_TYPE
    

    更改下列內容:

    • CLASS_NAME:新 StorageClass 的名稱。
    • VOLUME_TYPE:StorageClass 建立的 Azure 磁碟磁碟區類型

    舉例來說,下列 YAML 會建立新的預設 StorageClass,用於佈建 Premium SSD Azure 磁碟磁碟區。

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

    kubectl apply -f my-custom-class.yaml
    

套用這個資訊清單後,Azure 上的 GKE 會將 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

後續步驟