このページでは、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 ボリュームを必要に応じて動的にプロビジョニングする方法と、クラスタ管理者が事前に手動でプロビジョニングする方法を示します。
動的プロビジョニング
次のマニフェストを
balanced-ha-storage.yamlという名前のファイルに保存します。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: balanced-ha-storage provisioner: pd.csi.storage.gke.io volumeBindingMode: WaitForFirstConsumer # Allow volume expansion. allowVolumeExpansion: true parameters: type: hyperdisk-balanced-high-availability # Provisioned throughput in MiB/s. provisioned-throughput-on-create: "250Mi" # Provisioned IOPS (input/output operations per second). provisioned-iops-on-create: "7000" allowedTopologies: - matchLabelExpressions: - key: topology.gke.io/zone values: - ZONE1 - ZONE2次のように置き換えます。
ZONE1、ZONE2: 動的にプロビジョニングされたボリュームが複製されるリージョン内のゾーン。
StorageClass を作成します。
kubectl create -f hdb-ha-example-class.yaml次の 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 はReadWriteOnce、ReadWriteMany、ReadWriteOncePodをサポートしています。各アクセスモードの違いとユースケースについては、永続ボリュームのアクセスモードをご覧ください。ReadWriteManyを使用する場合は、PersistentVolumeClaimにvolumeMode: Blockも追加する必要があります。この設定により、複数の Pod がストレージに同時に書き込むことで発生する可能性のあるデータ破損を防ぐことができます。volumeMode: Block設定では、Kubernetes によるファイル システム管理をバイパスする未加工のブロック デバイスとしてディスクが公開されます。次に例を示します。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany volumeMode: Block storageClassName: balanced-ha-storage resources: requests: storage: 20Gi ```前に作成した StorageClass を参照する PersistentVolumeClaim を適用します。
kubectl apply -f pvc-example.yaml
手動プロビジョニング
Compute Engine のドキュメントに沿って、Hyperdisk Balanced High Availability ボリュームを手動で作成します。
次の PersistentVolume マニフェストを
pv-example.yamlという名前のファイルに保存します。マニフェストは、作成した Hyperdisk Balanced High Availability ボリュームを参照します。apiVersion: v1 kind: PersistentVolume metadata: name: pv-demo spec: capacity: storage: 500Gi accessModes: - ACCESS_MODE # ClaimRef links this PersistentVolume to a PersistentVolumeClaim. claimRef: namespace: default name: podpvc csi: driver: pd.csi.storage.gke.io # The unique identifier of the Compute Engine disk resource that backs this volume. volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1 # Node affinity to ensure the Pod is scheduled in a zone where the volume is replicated. nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.gke.io/zone operator: In values: - ZONE1 - ZONE2次のように置き換えます。
PROJECT_ID: 作成したボリュームのプロジェクト ID。REGION: 作成したディスクのリージョンご利用いただける最新のリージョンについては、Compute Engine のドキュメントをご覧ください。ZONE1、ZONE2: 作成したボリュームが複製されるリージョン内のゾーン。ACCESS_MODE: Hyperdisk Balanced High Availability はReadWriteOnce、ReadWriteMany、ReadWriteOncePodをサポートしています。各アクセスモードの違いとユースケースについては、永続ボリュームのアクセスモードをご覧ください。
前に作成した Hyperdisk Balanced High Availability ボリュームを参照する永続ボリュームを作成します。
kubectl apply -f pv-example.yaml次の 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 はReadWriteOnce、ReadWriteMany、ReadWriteOncePodをサポートしています。前のステップの PersistentVolume で指定されているアクセスモードと同じである必要があります。各アクセスモードの違いとユースケースについては、永続ボリュームのアクセスモードをご覧ください。
前に作成した PersistentVolume を参照する PersistentVolumeClaim を適用します。
kubectl apply -f pvc-example.yaml
ブロックモードでマルチライター ボリュームを使用する
ブロックモードでボリュームを使用するには、使用する Pod で volumeMounts の代わりに volumeBlock を指定する必要があります。以前に導入した PersistenVolumeClaim を使用する Pod の例は次のようになります。
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
# Use volumeDevices instead of volumeMounts to consume the volume as a raw block device.
volumeDevices:
# The "mountPath" field specifies the path where the block device is accessible in the container.
- mountPath: /dev/my-device
name: mypvc
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: podpvc
readOnly: false
リージョン永続ディスク
ゾーン永続ディスクは、通常の永続ディスクと同様に、必要に応じて動的にプロビジョニングすることも、クラスタ管理者が事前に手動でプロビジョニングすることもできますが、動的プロビジョニングをおすすめします。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
# Specifies that the disk should be a regional persistent disk.
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
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
# This Pod uses the PVC that's associated with the
# "regionalpd-storageclass" StorageClass.
persistentVolumeClaim:
claimName: regional-pvc
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
# The volume is mounted into the container at the "/usr/share/nginx/html" path.
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
# Specifies that the disk should be a regional persistent disk.
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
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:
# The StorageClass that specifies regional replication.
storageClassName: "regionalpd-storageclass"
capacity:
storage: 500Gi
accessModes:
- ReadWriteOnce
claimRef:
namespace: default
name: pv-claim-demo
csi:
driver: pd.csi.storage.gke.io
# The unique identifier for the pre-existing regional disk.
volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
# Ensures that Pods are scheduled in zones where the disk is replicated.
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 は、同じ名前のゾーン永続ディスクとリージョナル永続ディスクを区別できません。この問題を回避するために、永続ディスクに固有の名前を付けてください。動的にプロビジョニングされた永続ディスクを使用している場合には、この問題は発生しません。
次のステップ
- チュートリアルで、Persistent Disk と Cloud SQL を使用して GKE に WordPress をデプロイするについて学習する。