リージョン永続ディスクのプロビジョニング


このページでは、リージョン永続ディスクの動的プロビジョニングを有効にする方法と、Google Kubernetes Engine(GKE)でそれらを手動でプロビジョニングする方法について説明します。

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

リージョン永続ディスク

ゾーン永続ディスクは、通常の永続ディスクと同様に、必要に応じて動的にプロビジョニングすることも、クラスタ管理者が事前に手動でプロビジョニングすることもできますが、動的プロビジョニングをおすすめします。pd-standard タイプのリージョン永続ディスクを使用するには、PersistentVolumeClaim の spec.resources.requests.storage を attribute to a minimum of200 GiB. If your use case requires a smaller volume, consider usingpd-balancedorpd-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 は、同じ名前のゾーン永続ディスクとリージョナル永続ディスクを区別できません。この問題を回避するために、永続ディスクに固有の名前を付けてください。動的にプロビジョニングされた永続ディスクを使用している場合には、この問題は発生しません。

次のステップ