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

GKE on Azure 会自动部署 Azure Disk CSI 驱动程序Azure File CSI 驱动程序

Azure Disk CSI 驱动程序和 Azure File CSI 驱动程序版本与 GKE on Azure 的 Kubernetes 版本相关联。此驱动程序版本通常是发布 GKE 版本时可用的最新版本。集群升级后,驱动程序会自动更新。

使用自定义 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

后续步骤