将 StorageClass 与工作负载配合使用

GKE on AWS 会自动部署适用于 Amazon Elastic Block Store (EBS) 的容器存储接口 (CSI) 驱动程序,以预配和管理集群中的 Amazon EBS 卷。

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

如何使用默认 StorageClass

如果在不设置字段 spec.storageClassName 的情况下创建 PersistentVolumeClaim,则系统会使用默认的 GKE on AWS EBS CSI 驱动程序 StorageClass 预配 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,它可预配吞吐量更高的 io1

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

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

如何使用自定义 StorageClass

您可以为 EBS 卷创建额外的 StorageClass,或者使用容器存储接口 (CSI) 驱动程序。

  1. 如果使用的是 EBS 卷或者特定 CSI 驱动程序,请选择使用自定义 StorageClass。

    EBS 卷

    您可以创建自己的自定义 StorageClass,用于指定 EBS 卷类型、文件系统类型和其他参数。您可以在 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
    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    

    CSI 驱动程序

    您可以在 provisioner 字段中指定其他 CSI 驱动程序。

    如需使用其他 CSI 驱动程序创建 StorageClass,您可以使用以下 YAML 示例。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: CLASS_NAME
    provisioner: CSI_DRIVER_NAME
    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      type: EBS_VOLUME_TYPE
    

    请替换以下内容:

    • EBS_VOLUME_TYPE:StorageClass 创建的 AWS EBS 卷类型
    • CLASS_NAME 替换为新 StorageClass 的名称

    例如,以下 YAML 会创建一个新的默认 StorageClass,用于预配使用 XFS 文件系统格式化的吞吐量优化型 HDD EBS 卷。

    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
    volumeBindingMode: WaitForFirstConsumer
    parameters:
      csi.storage.k8s.io/fsType: xfs
      type: st1
    
  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

后续步骤