利用 Hyperdisk 扩缩存储性能


Compute Engine Persistent Disk CSI 驱动程序是您访问使用 Google Kubernetes Engine (GKE) 集群的 Hyperdisk 存储的主要方式。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 将您的默认区域和可用区设置为某个支持的值

要求

如需在 GKE 中使用 Hyperdisk 卷,您的集群必须满足以下要求:

为 GKE 创建 Hyperdisk 卷

本部分介绍如何在 GKE 中创建由 Compute Engine CSI 驱动程序支持的 Hyperdisk 卷。

创建一个 StorageClass

Compute Engine Persistent Disk CSI 驱动程序提供了以下 Persistent Disk 存储 Type 字段,用于支持 Hyperdisk:

  • hyperdisk-balanced
  • hyperdisk-throughput
  • hyperdisk-extreme
  • hyperdisk-ml

如需创建具有所需的吞吐量或 IOPS 级别的新 StorageClass,请在预配工具字段中使用 pd.csi.storage.gke.io,并指定其中一种 Hyperdisk 存储类型。

对于由预配的初始磁盘大小确定的性能,每种 Hyperdisk 类型都有默认值。创建 StorageClass 时,您可以根据 Hyperdisk 类型选择性地指定以下参数。如果您省略这些参数,GKE 会改用基于容量的磁盘类型默认值。如需获得允许的吞吐量或 IOPS 值指南,请参阅规划 Hyperdisk 卷的性能级别

参数 Hyperdisk 类型 用法
provisioned-throughput-on-create Hyperdisk Balanced*、Hyperdisk Throughput 使用“Mi”限定符表示吞吐量值(以 MiBps 为单位);例如,如果您需要的吞吐量为 250 MiBps,请在创建 StorageClass 时指定 "250Mi"
provisioned-iops-on-create Hyperdisk Balanced、Hyperdisk IOPS IOPS 值应不带任何限定符表示;例如,如果您需要 7,000 IOPS,请在创建 StorageClass 时指定 "7000"
* 如果您需要增强安全性并计划使用机密 Google Kubernetes Engine 节点,请考虑创建机密模式的 Hyperdisk Balanced,查看其他机密模式的 Hyperdisk Balanced 限制,并详细了解机密 Google Kubernetes Engine 节点

以下示例展示了如何为每种 Hyperdisk 类型创建 StorageClass:

  1. 将以下清单保存在名为 hdb-example-class.yaml 的文件中:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: balanced-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced
      provisioned-throughput-on-create: "250Mi"
      provisioned-iops-on-create: "7000"
    
  2. 创建 StorageClass:

    kubectl create -f hdb-example-class.yaml
    
  1. 将以下清单保存在名为 hdt-example-class.yaml 的文件中:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: throughput-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-throughput
      provisioned-throughput-on-create: "50Mi"
    
  2. 创建 StorageClass:

    kubectl create -f hdt-example-class.yaml
    
  1. 将以下清单保存在名为 hdx-example-class.yaml 的文件中:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: extreme-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-extreme
      provisioned-iops-on-create: "50000"
    
  2. 创建 StorageClass:

    kubectl create -f hdx-example-class.yaml
    

如需查找集群中可用的 StorageClass 的名称,请运行以下命令:

kubectl get sc

创建一个 PersistentVolumeClaim

您可以创建一个引用 Compute Engine Persistent Disk CSI 驱动程序的 StorageClass 的 PersistentVolumeClaim。

在此示例中,您将 Hyperdisk Balanced 卷的目标存储容量指定为 20 GiB。

  1. 将以下 PersistentVolumeClaim 清单保存到名为 pvc-example.yaml 的文件中:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: balanced-storage
      resources:
        requests:
          storage: 20Gi
    
  2. 应用引用您在前面示例中创建的 StorageClass 的 PersistentVolumeClaim:

    kubectl apply -f pvc-example.yaml
    

在此示例中,您需要将 Hyperdisk Throughput 卷的目标存储容量指定为 2 TiB。

  1. 将以下 PersistentVolumeClaim 清单保存到名为 pvc-example.yaml 的文件中:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: throughput-storage
      resources:
        requests:
          storage: 2Ti
    
  2. 应用引用您在前面示例中创建的 StorageClass 的 PersistentVolumeClaim:

    kubectl apply -f pvc-example.yaml
    

在此示例中,您将 Hyperdisk Extreme 卷的最小存储容量指定为 64 GiB。

  1. 将以下 PersistentVolumeClaim 清单保存到名为 pvc-example.yaml 的文件中:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ReadWriteOnce
      storageClassName: extreme-storage
      resources:
        requests:
          storage: 64Gi
    
  2. 应用引用您在前面示例中创建的 StorageClass 的 PersistentVolumeClaim:

    kubectl apply -f pvc-example.yaml
    

创建 Deployment 以使用 Hyperdisk 卷

将 Pod 与 PersistentVolume 搭配使用时,我们建议您使用工作负载控制器(例如 DeploymentStatefulSet)。

  1. 以下示例将创建一个清单,该清单将配置 Pod 以使用上一部分中创建的 PersistentVolumeClaim 部署 Nginx Web 服务器。将以下示例清单保存为 hyperdisk-example-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-deployment
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /var/lib/www/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: podpvc
              readOnly: false
    
  2. 如需根据 hyperdisk-example-deployment.yaml 清单文件创建 Deployment,请运行以下命令:

    kubectl apply -f hyperdisk-example-deployment.yaml
    
  3. 确认已成功创建 Deployment:

    kubectl get deployment
    

    Hyperdisk 实例可能需要几分钟才能完成预配。 部署完成预配后,会报告 READY 状态。

  4. 您可以运行以下命令来监控 PersistentVolumeClaim 状态,以查看进度:

    kubectl get pvc
    

通过快照预配 Hyperdisk 卷

如需通过现有 Persistent Disk 快照创建新的 Hyperdisk 卷,请使用 Google Cloud 控制台、Google Cloud CLI 或 Compute Engine API。如需了解如何创建 Persistent Disk 快照,请参阅创建和使用卷快照

  1. 转到 Google Cloud 控制台中的磁盘页面。

    打开“磁盘”

  2. 点击创建磁盘

  3. 磁盘类型下,选择以下磁盘类型之一:

    • 平衡 Hyperdisk
    • Hyperdisk Extreme
    • Hyperdisk Throughput
  4. 磁盘来源类型下,点击快照

  5. 选择要恢复的快照的名称。

  6. 选择新磁盘的大小(以 GiB 为单位)。此数字必须等于或大于快照最初的来源磁盘大小。

  7. 为磁盘设置预配吞吐量预配 IOPS(如果与默认值不同)。

  8. 点击创建以创建 Hyperdisk 卷。

运行 gcloud compute disks create 命令以通过快照创建 Hyperdisk 卷。

gcloud compute disks create DISK_NAME \
    --size=SIZE \
    --source-snapshot=SNAPSHOT_NAME \
    --provisioned-throughput=TRHROUGHPUT_LIMIT \
    --provisioned-iops=IOPS_LIMIT \
    --type=hyperdisk-balanced

替换以下内容:

  • DISK_NAME:新磁盘的名称。
  • SIZE:新磁盘的大小,以吉比字节 (GiB) 或太比字节 (TiB) 为单位。如需了解最新的容量限制,请参阅 Compute Engine 文档
  • SNAPSHOT_NAME:要恢复的快照的名称。
  • THROUGHPUT_LIMIT:可选。对于 Hyperdisk Balanced 磁盘,这是一个整数,表示磁盘可以处理的吞吐量(以 MiBps 为单位)。如需了解最新的限制,请参阅 Compute Engine 文档
  • IOPS_LIMIT:可选。对于 Hyperdisk Balanced 磁盘,这是磁盘可以处理的 IOPS 数。如需了解最新的性能限制,请参阅 Compute Engine 文档
gcloud compute disks create DISK_NAME \
    --size=SIZE \
    --source-snapshot=SNAPSHOT_NAME \
    --provisioned-throughput=TRHROUGHPUT_LIMIT \
    --type=hyperdisk-throughput

请替换以下内容:

  • DISK_NAME:新磁盘的名称。
  • SIZE:新磁盘的大小,以吉比字节 (GiB 或 GB) 或太比字节 (TiB 或 TB) 为单位。如需了解最新的容量限制,请参阅 Compute Engine 文档
  • SNAPSHOT_NAME:要恢复的快照的名称。
  • THROUGHPUT_LIMIT:可选:对于 Hyperdisk Throughput 磁盘,这是一个整数,表示磁盘可以处理的吞吐量(以 MiBps 为单位)。如需了解最新的性能限制,请参阅 Compute Engine 文档
gcloud compute disks create DISK_NAME \
    --size=SIZE \
    --source-snapshot=SNAPSHOT_NAME \
    --provisioned-iops=IOPS_LIMIT \
    --type=hyperdisk-iops

请替换以下内容:

  • DISK_NAME:新磁盘的名称。
  • SIZE:新磁盘的大小,以吉比字节 (GiB 或 GB) 或太比字节 (TiB 或 TB) 为单位。如需了解最新的容量限制,请参阅 Compute Engine 文档
  • SNAPSHOT_NAME:要恢复的快照的名称。
  • IOPS_LIMIT(可选):对于 Hyperdisk Extreme 磁盘,这是磁盘每秒可处理的 I/O 操作数。如需了解最新的性能限制,请参阅 Compute Engine 文档

为 Hyperdisk 卷创建快照

如需通过 Hyperdisk 卷创建快照,请按照与为 Persistent Disk 卷创建快照相同的步骤操作:

更新现有 Hyperdisk 卷的预配吞吐量或 IOPS

本部分介绍如何修改 Hyperdisk 卷的预配性能。

只有 Hyperdisk Balanced 和 Hyperdisk Throughput 卷才支持更新预配吞吐量。

如需更新 Hyperdisk 卷的预配吞吐量级别,请按照更改 Hyperdisk 卷的预配性能中的 Google Cloud 控制台、gcloud CLI 或 Compute Engine API 说明进行操作。

您可以在创建卷后更改 Hyperdisk 卷的预配吞吐量级别(最多每 4 小时一次)。新的吞吐量级别最多可能需要 15 分钟才能生效。在性能更改期间,任何性能 SLA 和 SLO 都不会生效。 无论磁盘是否挂接到正在运行的实例,您都可以随时更改现有卷的吞吐量级别。

您指定的新吞吐量级别必须遵循 Hyperdisk 卷支持的值

只有 Hyperdisk Balanced 和 Hyperdisk Extreme 卷才支持更新预配 IOPS。

如需更新 Hyperdisk 卷的预配 IOPS 级别,请按照更改 Hyperdisk 卷的预配性能中的 Google Cloud 控制台、gcloud CLI 或 Compute Engine API 说明进行操作。

您可以在创建卷后更改 Hyperdisk IOPS 卷的预配 IOPS 级别(最多每 4 小时一次)。新的 IOPS 级别最多可能需要 15 分钟才能生效。在性能更改期间,任何性能 SLA 和 SLO 都不会生效。 无论磁盘是否挂接到正在运行的实例,您都可以随时更改现有卷的 IOPS 级别。

您指定的新 IOPS 级别必须遵循 Hyperdisk 卷支持的值

如需更新 Hyperdisk 卷的预配 IOPS 级别,您必须确定支持 PersistentVolumeClaim 和 PersistentVolume 资源的 Persistent Disk 的名称:

  1. 在 Google Cloud 控制台中,转到对象浏览器

    转到对象浏览器

  2. 查找 PersistentVolumeClaim 对象的条目。

  3. 点击链接。

  4. 打开关联 PersistentVolume 的 YAML 标签页。在此标签页中找到 CSI volumeHandle 值。

  5. 请注意此句柄的最后一个元素(其值应类似于“pvc-XXXXX”)。这是 PersistentVolumeClaim 的名称。您还应该记下项目和可用区。

监控 Hyperdisk 卷上的吞吐量或 IOPS

如需监控 Hyperdisk 卷的预配性能,请参阅 Compute Engine 文档中的分析预配的 IOPS 和吞吐量

问题排查

本部分提供了解决 GKE 上的 Hyperdisk 卷问题的问题排查指南。

无法更改性能或容量:比率超出范围

如果您尝试更改预配的性能级别或容量,但您选择的性能级别或容量超出卷的可接受范围,则会发生以下错误:

  • Requested provisioned throughput cannot be higher than <value>.
  • Requested provisioned throughput cannot be lower than <value>.
  • Requested provisioned throughput is too high for the requested disk size.
  • Requested provisioned throughput is too low for the requested disk size.
  • Requested disk size is too high for current provisioned throughput.

为 Hyperdisk Throughput 卷预配的吞吐量必须满足以下要求:

  • 每 TiB 容量至少为 10 MiBps,每 TiB 容量不超过 90 MiBps。
  • 每个卷最多 600 MiBps。

要解决此问题,请将请求的吞吐量或容量更正在允许的范围内,然后重新发出命令。

无法更改性能:速率受限

如果您尝试更改预配的性能级别,但性能级别在过去 4 小时内已更改,则会发生以下错误:

Cannot update provisioned throughput due to being rate limited.
Cannot update provisioned iops due to being rate limited.

Hyperdisk Throughput 卷和 IOPS 卷可以每 4 小时更新一次预配的性能。如需解决此问题,请等待冷却期让卷到期,然后重新发出命令。

后续步骤