このページでは、リージョン永続ディスクの動的プロビジョニングを有効にする方法と、Google Kubernetes Engine(GKE)でそれらを手動でプロビジョニングする方法について説明します。
リージョン永続ディスクを使用した高可用性アプリケーション用のエンドツーエンドのソリューションの作成については、Stateful HA Operator を使用してステートフル アプリの可用性を向上させるをご覧ください。
リージョン永続ディスク
ゾーン永続ディスクは、通常の永続ディスクと同様に、必要に応じて動的にプロビジョニングすることも、クラスタ管理者が事前に手動でプロビジョニングすることもできますが、動的プロビジョニングをおすすめします。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
StorageClass
は volumeBindingMode: 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 は、同じ名前のゾーン永続ディスクとリージョナル永続ディスクを区別できません。この問題を回避するために、永続ディスクに固有の名前を付けてください。動的にプロビジョニングされた永続ディスクを使用している場合には、この問題は発生しません。