利用 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:

平衡 Hyperdisk

  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
    

Hyperdisk Throughput

  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
    

Hyperdisk Extreme

  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

在此示例中,您将 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

在此示例中,您需要将 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

在此示例中,您将 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

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

平衡 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 文档

Hyperdisk Throughput

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 文档

Hyperdisk Extreme

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 卷支持的值

IOPS

只有 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 小时更新一次预配的性能。如需解决此问题,请等待冷却期让卷到期,然后重新发出命令。

后续步骤