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 を作成する

Hyperdisk をサポートするため、Compute Engine Persistent Disk の CSI ドライバには、次の Persistent Disk ストレージの Type フィールドが用意されています。

  • 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 MiBps 単位のスループット値は「Mi」修飾子で表します。たとえば、必要なスループットが 250 MiBps の場合は、StorageClass の作成時に "250Mi" を指定します。
provisioned-iops-on-create Hyperdisk Balanced、Hyperdisk IOPS IOPS 値は修飾子なしで指定する必要があります。たとえば、7,000 IOPS が必要な場合は、StorageClass の作成時に "7000" を指定します。
* セキュリティを強化し、Confidential Google Kubernetes Engine ノードの使用を計画している場合は、Hyperdisk Balanced の情報保護モードを作成することを検討し、Hyperdisk Balanced の情報保護モードの制限事項を確認して、Confidential Google Kubernetes Engine ノードの詳細を確認してください。

次の例では、Hyperdisk のタイプごとに StorageClass の作成方法を示します。

Hyperdisk Balanced

  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 Balanced

この例では、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 ボリュームを使用する

PersistentVolume で Pod を使用する場合は、ワークロード コントローラ(DeploymentStatefulSet など)を使用することをおすすめします。

  1. 次の例では、前のセクションで作成した PersistentVolumeClaim を使用して、Nginx ウェブサーバーをデプロイする Pod を構成するマニフェストを作成します。次のマニフェストの例を 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 Console で [ディスク] ページに移動します。

    [ディスク] に移動

  2. [ディスクを作成] をクリックします。

  3. [ディスクタイプ] で、ディスクタイプに次のいずれかを選択します。

    • Hyperdisk Balanced
    • Hyperdisk Extreme
    • Hyperdisk Throughput
  4. [ディスクソースのタイプ] で、[スナップショット] をクリックします。

  5. 復元するスナップショットの名前を選択します。

  6. 新しいディスクのサイズ(GiB)を選択します。この数は、スナップショットの元のソースディスク以上である必要があります。

  7. デフォルト値と異なる場合は、ディスクに必要な [プロビジョニングされたスループット] または [プロビジョニングされた IOPS] を設定します。

  8. [作成] をクリックして、Hyperdisk ボリュームを作成します。

gcloud

gcloud compute disks create コマンドを実行して、スナップショットから Hyperdisk ボリュームを作成します。

Hyperdisk Balanced

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 ディスクの場合、これはディスクが処理できる 1 秒あたりの 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 時間に 1 回まで)を変更できます。新しいスループット レベルが有効になるまでに、最大で 15 分かかることがあります。パフォーマンスの変更中は、パフォーマンス SLA と SLO が無効になります。実行中のインスタンスにディスクをアタッチしているかどうかにかかわらず、既存のボリュームのスループット レベルをいつでも変更できます。

指定する新しいスループット レベルは、Hyperdisk ボリュームでサポートされている値に従う必要があります。

IOPS

プロビジョニングされた IOPS の更新は、Hyperdisk Balanced ボリュームと Hyperdisk Extreme ボリュームでのみサポートされています。

Hyperdisk ボリュームのプロビジョニングされた IOPS レベルを更新するには、Hyperdisk ボリュームにプロビジョニングされたパフォーマンスを変更するの Google Cloud コンソール、gcloud CLI、Compute Engine API の手順に沿って操作します。

ボリュームの作成後に、Hyperdisk IOPS ボリュームに対してプロビジョニングされた IOPS レベル(4 時間に 1 回まで)を変更できます。新しい 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 volume ボリュームのプロビジョニングされたパフォーマンスをモニタリングするには、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 ボリュームにプロビジョニングされるスループットは、次の要件を満たす必要があります。

  • 容量 1 TiB あたり少なくとも 10 MiBps、容量 1 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 時間に 1 回更新できます。この問題を解決するには、ボリュームのクールダウン タイマーが経過するまで待ってから、コマンドを再発行します。

次のステップ