リージョン永続ディスクと Hyperdisk Balanced High Availability ボリュームのプロビジョニング


このページでは、Hyperdisk Balanced High Availability ボリュームリージョン永続ディスクの動的プロビジョニングを有効にする方法と、Google Kubernetes Engine(GKE)でそれらを手動でプロビジョニングする方法について説明します。マシンタイプの互換性については、リージョン ディスクの制限事項Hyperdisk のマシンシリーズのサポートをご覧ください。通常、第 3 世代以降のマシンシリーズには Hyperdisk Balanced High Availability ボリュームを使用し、第 2 世代以前のマシンシリーズにはリージョン永続ディスクを使用します。マシンシリーズの世代の詳細については、Compute Engine の用語をご覧ください。

リージョン永続ディスクを使用した高可用性アプリケーション用のエンドツーエンドのソリューションの作成については、Stateful HA Operator を使用してステートフル アプリの可用性を向上させるをご覧ください。 この機能は、Hyperdisk Balanced High Availability ボリュームをサポートしていません。

Hyperdisk Balanced の高可用性

この例では、Hyperdisk Balanced High Availability ボリュームを必要に応じて動的にプロビジョニングする方法と、クラスタ管理者が事前に手動でプロビジョニングする方法を示します。

動的プロビジョニング

  1. 次のマニフェストを balanced-ha-storage.yaml という名前のファイルに保存します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: balanced-ha-storage
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: hyperdisk-balanced-high-availability
      provisioned-throughput-on-create: "250Mi"
      provisioned-iops-on-create: "7000"
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - ZONE1
        - ZONE2
    

    次のように置き換えます。

    • ZONE1ZONE2: 動的にプロビジョニングされたボリュームが複製されるリージョン内のゾーン。
  2. StorageClass を作成します。

    kubectl create -f hdb-ha-example-class.yaml
    
  3. 次の PersistentVolumeClaim マニフェストを pvc-example.yaml という名前のファイルに保存します。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ACCESS_MODE
      storageClassName: balanced-ha-storage
      resources:
        requests:
          storage: 20Gi
    

    次のように置き換えます。

    • ACCESS_MODE: Hyperdisk Balanced High Availability は ReadWriteOnceReadWriteManyReadWriteOncePod をサポートしています。各アクセスモードの違いとユースケースについては、永続ボリュームのアクセスモードをご覧ください。
  4. 前に作成した StorageClass を参照する PersistentVolumeClaim を適用します。

    kubectl apply -f pvc-example.yaml
    

手動プロビジョニング

  1. Compute Engine のドキュメントに沿って、Hyperdisk Balanced High Availability ボリュームを手動で作成します。

  2. 次の PersistentVolume マニフェストを pv-example.yaml という名前のファイルに保存します。マニフェストは、作成した Hyperdisk Balanced High Availability ボリュームを参照します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-demo
    spec:
      capacity:
        storage: 500Gi
      accessModes:
        - ACCESS_MODE
      claimRef:
        namespace: default
        name: podpvc
      csi:
        driver: pd.csi.storage.gke.io
        volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
              - key: topology.gke.io/zone
                operator: In
                values:
                - ZONE1
                - ZONE2
    

    次のように置き換えます。

    • PROJECT_ID: 作成したボリュームのプロジェクト ID。
    • REGION: 作成したディスクのリージョンご利用いただける最新のリージョンについては、Compute Engine のドキュメントをご覧ください。
    • ZONE1ZONE2: 作成したボリュームが複製されるリージョン内のゾーン。
    • ACCESS_MODE: Hyperdisk Balanced High Availability は ReadWriteOnceReadWriteManyReadWriteOncePod をサポートしています。各アクセスモードの違いとユースケースについては、永続ボリュームのアクセスモードをご覧ください。
  3. 前に作成した Hyperdisk Balanced High Availability ボリュームを参照する永続ボリュームを作成します。

    kubectl apply -f pv-example.yaml
    
  4. 次の PersistentVolumeClaim マニフェストを pvc-example.yaml という名前のファイルに保存します。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ACCESS_MODE
      storageClassName: balanced-ha-storage
      resources:
        requests:
          storage: 20Gi
    

    次のように置き換えます。

    • ACCESS_MODE: Hyperdisk Balanced High Availability は ReadWriteOnceReadWriteManyReadWriteOncePod をサポートしています。前のステップの PersistentVolume で指定されているアクセスモードと同じである必要があります。各アクセスモードの違いとユースケースについては、永続ボリュームのアクセスモードをご覧ください。
  5. 前に作成した PersistentVolume を参照する PersistentVolumeClaim を適用します。

    kubectl apply -f pvc-example.yaml
    

リージョン永続ディスク

ゾーン永続ディスクは、通常の永続ディスクと同様に、必要に応じて動的にプロビジョニングすることも、クラスタ管理者が事前に手動でプロビジョニングすることもできますが、動的プロビジョニングをおすすめします。pd-standard タイプのリージョン永続ディスクを使用するには、PersistentVolumeClaim の spec.resources.requests.storage 属性を 200 GiB 以上に設定します。ユースケースでより小さいボリュームが必要な場合は、代わりに pd-balanced または pd-ssd の使用を検討してください。

動的プロビジョニング

リージョン永続ディスクの動的プロビジョニングを有効にするには、replication-type パラメータを使用して StorageClass を作成し、allowedTopologies にゾーン制約を指定します。

たとえば、次のマニフェストは regionalpd-storageclass という名前の StorageClass について記述しています。標準永続ディスクを使用し、データを europe-west1-b ゾーンと europe-west1-c ゾーンに複製しています。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

リージョン クラスタを使用する場合は、allowedTopologies を未指定のままにしておくことができます。指定しなければ、この StorageClass を使用する PersistentVolumeClaim で Pod を作成するときに、次の 2 つのゾーンとともにリージョン永続ディスクがプロビジョニングされます。一方のゾーンは、Pod がスケジュールされているゾーンと同じです。もう一方のゾーンは、クラスタで使用可能なゾーンからランダムに選択されます。

ゾーンクラスタを使用する場合は、allowedTopologies を設定する必要があります。

StorageClass を作成したら、PersistentVolumeClaim オブジェクトを作成し、storageClassName フィールドを使用して StorageClass を参照します。たとえば、次のマニフェストは regional-pvc という名前の PersistentVolumeClaim を作成し、regionalpd-storageclass を参照しています。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: regional-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Gi
  storageClassName: regionalpd-storageclass

StorageClassvolumeBindingMode: WaitForFirstConsumer で構成されているため、PersistentVolumeClaim を使用する Pod が作成されるまで PersistentVolume はプロビジョニングされません。

次のマニフェストは、以前に作成した PersistentVolumeClaim を使用する Pod の例です。

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: regional-pvc
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

手動プロビジョニング

まず、gcloud compute disks create コマンドを使用してリージョン永続ディスクを作成します。次の例では、europe-west1-b ゾーンと europe-west1-c ゾーンに複製されるディスクを gce-disk-1 という名前で作成しています。

gcloud compute disks create gce-disk-1 \
   --size 500Gi \
   --region europe-west1 \
   --replica-zones europe-west1-b,europe-west1-c

その後、作成したリージョン永続ディスクを参照する PersistentVolume を作成できます。また、既存の永続ディスクを PersistentVolume として使用するのオブジェクトに加えて、リージョン永続ディスクの PersistentVolume にも node-affinity を指定する必要があります。StorageClass を使用する場合、永続ディスクの CSI ドライバを指定する必要があります。

以下に、標準永続ディスクを使用して、データを europe-west1-b ゾーンと europe-west1-c ゾーンに複製する StorageClass マニフェストの例を示します。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-balanced
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.gke.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

以下に、pv-demo という名前の PersistentVolume を作成し、regionalpd-storageclass を参照するマニフェストの例を示します。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "regionalpd-storageclass"
  capacity:
     storage: 500Gi
  accessModes:
     - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  csi:
    driver: pd.csi.storage.gke.io
    volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
          - key: topology.gke.io/zone
            operator: In
            values:
               - europe-west1-b
               - europe-west1-c

PersistentVolume の例で、次のことに注意してください。

  • volumeHandle フィールドには、PROJECT_ID 呼び出しなど、gcloud compute disks create 呼び出しの詳細が含まれています。
  • default に設定されている場合でも、claimRef.namespace フィールドを指定する必要があります。

永続ディスクに名前を付ける

Kubernetes は、同じ名前のゾーン永続ディスクとリージョナル永続ディスクを区別できません。この問題を回避するために、永続ディスクに固有の名前を付けてください。動的にプロビジョニングされた永続ディスクを使用している場合には、この問題は発生しません。

次のステップ