将 StorageClass 与工作负载配合使用

GKE on AWS 会自动部署容器存储接口 (CSI) Amazon Elastic Block Store (EBS)Amazon Elastic File Store (EFS)

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

使用默认 StorageClass

如果在不设置字段 spec.storageClassName 的情况下创建 PersistentVolumeClaim,则系统会使用默认的 GKE on AWS EBS CSI 驱动程序 StorageClass 预配通用 SSD (gp2) 卷

以下 YAML 会创建一个名为 mypvc 的 PersistentVolumeClaim (PVC),其大小为 30 吉比字节。

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

使用其他预安装的 StorageClass

GKE on AWS EBS CSI 驱动程序还包含 premium-rwo StorageClass,它可预配吞吐量更高的预配 IOPS SSD (io1) 卷

您可以通过在 PVC 的 spec.storageClassName 中指定该 StorageClass 来使用它。

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

使用自定义 StorageClass

如果默认 StorageClass 和 premium-rwo StorageClass 都不符合您的需求,您可以为 EBS 卷创建额外的 StorageClass,或使用容器存储接口 (CSI) 驱动程序。

  1. 选择您使用的是 EBS 卷还是其他 CSI 驱动程序。

    EBS 卷

    此标签页介绍如何创建用于指定 EBS 卷类型、文件系统类型和其他参数的自定义 StorageClass。您可以在 GKE on AWS EBS CSI 驱动程序的 GitHub 页面上找到额外的 StorageClass 参数。

    如需配置自定义 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 替换为您的 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 且引用 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 AWS 使用一个名为 standard-rwo 的默认 StorageClass,用于预配 gp2 EBS 卷您可以将默认 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 使用 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 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

后续步骤