将自定义 StorageClass 用于您的工作负载

如需为 Google Kubernetes Engine (GKE) on Azure 上的容器化工作负载定义特定的存储行为,请创建并使用自定义 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 磁盘卷类型、文件系统类型和其他参数。您可以在 GKE on Azure 的 Azure Disk CSI 驱动程序 GitHub 页面上找到更多 StorageClass 参数。

    如需配置自定义 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 且引用 StorageClass my-custom-class 的 PVC。

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

设置默认 StorageClass

GKE on Azure 使用名为 standard-rwo 的默认 StorageClass,用于预配具有 LRS 的标准 SSD Azure 磁盘。您可以将默认 StorageClass 更改为另一个 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,用于预配 高级 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
    

应用此清单后,GKE on Azure 会使用 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 GiB 的卷:

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

后续步骤