クラスタで Google Kubernetes Engine(GKE)Pod スナップショットを有効にして構成し、スナップショットを保存するように Cloud Storage を設定する方法について説明します。
Pod スナップショットの仕組みの詳細については、Pod スナップショットについてをご覧ください。
始める前に
始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、
インストールして
初期化する
gcloud CLI。gcloud CLI をインストール済みの場合は、最新の
バージョンを
gcloud components updateコマンドを実行して取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
Pod スナップショットを有効にする
Pod スナップショットを有効にするには、Pod スナップショット機能を有効にしてクラスタを作成または更新します。Standard クラスタの場合は、GKE Sandbox で実行するノードプールを作成または更新する必要があります。GKE Sandbox は、Autopilot クラスタでデフォルトでサポートされています。
クラスタで Pod スナップショットを有効にするには、使用する GKE のオペレーション モードに応じて、次のいずれかの手順を行います。
Autopilot
新しいクラスタで Pod スナップショットを有効にするには、次のコマンドを実行します。
gcloud container clusters create-auto CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION \ --cluster-version=CLUSTER_VERSION次のように置き換えます。
CLUSTER_NAME: クラスタの名前。CONTROL_PLANE_LOCATION:クラスタのコントロール プレーンのロケーション。CLUSTER_VERSION: 新しいクラスタのバージョン。 1.35.3-gke.1234000 以降にする必要があります。
既存のクラスタで Pod スナップショットを有効にするには、次の操作を行います。
クラスタをバージョン 1.35.3-gke.1234000 以降にアップグレードします。
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATION次のように置き換えます。
CLUSTER_NAME: クラスタの名前。CONTROL_PLANE_LOCATION:クラスタのコントロール プレーンのロケーション。CLUSTER_VERSION: 新しいクラスタのバージョン。 1.35.3-gke.1234000 以降にする必要があります。
クラスタで Pod スナップショットを有効にします。
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION
デフォルトの
whole-podスコープの Pod スナップショットは、E2 マシンタイプをサポートしていません。Autopilot では、GKE は Pod スナップショットをサポートしていないマシンタイプをデフォルトで使用する場合があります。whole-podスコープのスナップショットを使用する場合は、ワークロードが互換性のある ハードウェアで実行されるように、カスタムの ComputeClass を使用して互換性のある マシン ファミリーを優先する必要があります。ファイル システム スナップショット(rootfs-only)は、E2 マシンタイプをサポートしています。
カスタム ComputeClass を作成して使用する手順は次のとおりです。
次のマニフェストを
non-e2-class.yamlとして保存します。apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: non-e2-class spec: priorities: - machineFamily: n2 - machineFamily: c3 activeMigration: optimizeRulePriority: false whenUnsatisfiable: DoNotScaleUp次のようにマニフェストを適用します。
kubectl apply -f non-e2-class.yamlPod 仕様で、
cloud.google.com/compute-classノードセレクタを使用して ComputeClass を参照します。spec: nodeSelector: cloud.google.com/compute-class: non-e2-class ...
Standard
新しいクラスタで Pod スナップショットを有効にするには、次のコマンドを実行します。
gcloud container clusters create CLUSTER_NAME \ --enable-pod-snapshots \ --cluster-version=CLUSTER_VERSION \ --workload-pool=PROJECT_ID.svc.id.goog \ --workload-metadata=GKE_METADATA \ --location=CONTROL_PLANE_LOCATION次のように置き換えます。
CLUSTER_NAME: クラスタの名前。CLUSTER_VERSION: 新しいクラスタのバージョン。 1.35.3-gke.1234000 以降にする必要があります。PROJECT_ID: プロジェクト ID。CONTROL_PLANE_LOCATION:クラスタのコントロール プレーンのロケーション。
既存のクラスタで Pod スナップショットを有効にするには、次の操作を行います。
クラスタをバージョン 1.35.3-gke.1234000 以降にアップグレードします。
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODEPOOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATION次のように置き換えます。
CLUSTER_NAME: クラスタの名前。NODEPOOL_NAME: ノードプールの名前。CLUSTER_VERSION: 新しいクラスタを更新するバージョン。 1.35.3-gke.1234000 以降にする必要があります。CONTROL_PLANE_LOCATION:クラスタのコントロール プレーンのロケーション。
クラスタで Pod スナップショットを有効にします。
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION次のように置き換えます。
CLUSTER_NAME: クラスタの名前。CONTROL_PLANE_LOCATION:クラスタのコントロール プレーンのロケーション。
Standard クラスタの GKE Sandbox で Pod を実行するには、gVisor を有効にしてノードプールを作成または更新します。ノードプールを更新するには、--sandbox type=gvisor フラグを使用します。gVisor を有効にしてノードプールを作成するには、次のコマンドを実行します。
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--node-version=NODE_VERSION \
--machine-type=MACHINE_TYPE \
--location=CONTROL_PLANE_LOCATION \
--image-type=cos_containerd \
--sandbox type=gvisor
次の変数を置き換えます。
NODE_POOL_NAME: 新しいノードプールの名前。CLUSTER_NAME: クラスタの名前。NODE_VERSION: ノードプールに使用するバージョン。MACHINE_TYPE: ノードに使用するマシンのタイプ。CONTROL_PLANE_LOCATION:クラスタのコントロール プレーンのロケーション。
gVisor の使用方法については、GKE Sandbox を使用してワークロードを分離するをご覧ください。
スナップショットを保存する
Pod スナップショットは Cloud Storage バケットに保存されます。このバケットには、メモリと(必要に応じて)GPU の状態が含まれます。Pod スナップショットには、Pod のサービス アカウントを有効にして使用し、Cloud Storage に対する認証を行うために Workload Identity Federation for GKE が必要です。
Pod スナップショットには、バケットに対する次の構成が必要です。
- 階層型名前空間: 読み取りと書き込みの秒間クエリ数を増やすには、 有効にする必要があります。階層型名前空間では、 均一なバケットレベルのアクセスも有効にする必要があります。
- 削除(復元可能): Pod スナップショットは 並列複合アップロードを使用するため、 削除(復元可能)などのデータ保護機能を無効にする必要があります。これらの機能を有効のままにしておくと、一時オブジェクトの削除(復元可能)によりストレージの請求額が大幅に増加する可能性があります。
- ロケーション: スナップショットが異なるリージョン間で転送されるとパフォーマンスに影響する可能性があるため、Cloud Storage バケットのロケーションは GKE クラスタと同じにする必要があります。
必要なバケットと権限の両方を作成する手順は次のとおりです。
Cloud Storage バケットを作成する。次のコマンドは、必要な構成でバケットを作成します。
gcloud storage buckets create "gs://BUCKET_NAME" \ --uniform-bucket-level-access \ --enable-hierarchical-namespace \ --soft-delete-duration=0d \ --location="LOCATION"次のように置き換えます。
BUCKET_NAME: バケットの名前。LOCATION: バケットのロケーション。
バケットの作成オプションの完全なリストについては、
buckets createオプションをご覧ください。
Cloud Storage バケットへのアクセス権をワークロードに付与する
デフォルトでは、GKE は Cloud Storage にアクセスできません。 スナップショット ファイルの読み取りと書き込みを行うには、ワークロード Pod で使用される Kubernetes ServiceAccount(KSA)に対応する権限を含む IAM ロールを付与するか、有効期間の短いトークンを付与する必要があります。
特定の Kubernetes ServiceAccount にロールを付与する
kubectlコマンドを使用してクラスタと通信できるように、認証情報を取得します。gcloud container clusters get-credentials "CLUSTER_NAME"Pod ごとに、次の操作を行います。
各 Pod の KSA を作成します。
kubectl create serviceaccount "KSA_NAME" \ --namespace "NAMESPACE"次のように置き換えます。
KSA_NAME: KSA の名前。NAMESPACE: Pod の名前空間。
バケットにアクセスする権限を KSA に付与します。
gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role="roles/storage.bucketViewer"gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role="roles/storage.objectUser"次のように置き換えます。
BUCKET_NAME: バケットの名前。PROJECT_NUMBER: プロジェクトの番号。PROJECT_ID: プロジェクト ID。NAMESPACE: Pod の名前空間。KSA_NAME: KSA の名前。
有効期間の短いトークンを使用してマルチテナンシーを有効にする
個々の KSA に権限を付与する代わりに、有効期間が短くスコープが制限されたトークンを使用してマルチテナンシーを有効にできます。この方法では、手動の IAM バインディングに関連する伝播遅延を回避できます。
各 KSA に権限を付与するのではなく、スナップショット ストレージ バケットに対する roles/storage.admin ロールの付与を GKE ノードサービス アカウントに対して 1 回だけ行います。その後、ノードサービス アカウントは、特定のパスに対して有効期間の短いトークンをオンデマンドで作成します。
Pod スナップショットでトークンを有効にするには、GKE バージョン 1.35.3-gke.1737000 以降が必要です。
マルチテナンシーを有効にする手順は次のとおりです。
ノードサービス アカウントにバケットへのアクセス権を付与するには、次のコマンドを実行します。
gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \ --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkenode.iam.gserviceaccount.com" \ --role="roles/storage.admin"スナップショットのストレージを構成する場合は、
tokenSourceフィールドの値をfederatedP4SAに設定します。
Pod スナップショット コントローラに Cloud Storage バケットへのアクセス権を付与する
Pod スナップショット コントローラが Cloud Storage バケット内のスナップショットを削除できるようにするには、GKE サービス エージェントにプロジェクトに対する Storage Object User(roles/storage.objectUser)ロールを付与する必要があります。次のコマンドを実行して、roles/storage.objectUser ロールを付与します。
gcloud projects add-iam-policy-binding "PROJECT_ID" \
--member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
--role="roles/storage.objectUser" \
--condition="expression=resource.name.startsWith(\"projects/_/buckets/BUCKET_NAME\"),title=restrict_to_bucket,description=Restricts access to one bucket only"
次のように置き換えます。
PROJECT_NUMBER: プロジェクトの番号。PROJECT_ID: プロジェクト ID。BUCKET_NAME: バケットの名前。
(省略可)Cloud Storage バケットのマネージド フォルダを作成する
フォルダを作成すると、スナップショットの権限を、相互に信頼できない Pod から分離できます。これは、マルチテナントのユースケースで役立ちます。マネージド フォルダを設定する手順は次のとおりです。
Pod スナップショットに必要な権限のみを含むカスタム IAM ロールを作成します。
gcloud iam roles create podSnapshotGcsReadWriter \ --project="PROJECT_ID" \ --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"ターゲット名前空間内のすべての KSA に
roles/storage.bucketViewerロールを付与します。このロールを使用すると、KSA はバケット メタデータを読み取りますが、バケット内のオブジェクトに対する読み取り権限や書き込み権限は付与されません。gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/namespace/NAMESPACE" \ --role="roles/storage.bucketViewer"次のように置き換えます。
BUCKET_NAME: バケットの名前。PROJECT_NUMBER: プロジェクトの番号。PROJECT_ID: プロジェクト ID。NAMESPACE: Pod の名前空間。
Pod スナップショットを保存する必要がある KSA ごとに、次の操作を行います。
KSA のマネージド フォルダを作成します。
gcloud storage managed-folders create "gs://BUCKET_NAME/FOLDER_PATH/"次のように置き換えます。
BUCKET_NAME: バケットの名前。FOLDER_PATH: マネージド フォルダのパス(my-app-snapshotsなど)。
マネージド フォルダに対するカスタム
podSnapshotGcsReadWriterロールを KSA に付与します。gcloud storage managed-folders add-iam-policy-binding "gs://BUCKET_NAME/FOLDER_PATH/" \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"次のように置き換えます。
BUCKET_NAME: バケットの名前。FOLDER_PATH: マネージド フォルダのパス(my-app-snapshotsなど)。PROJECT_NUMBER: プロジェクトの番号。PROJECT_ID: プロジェクト ID。NAMESPACE: Pod の名前空間。KSA_NAME: KSA の名前。
スナップショットのストレージを構成する
スナップショット ファイルの保存場所を指定するには、PodSnapshotStorageConfig リソースを作成します。
次の例では、Cloud Storage バケット BUCKET_NAME 内の
FOLDER_PATH/パスに Pod スナップショットを保存するように GKE を構成します。次のマニフェストをexample-pod-snapshot-storage-configとして保存します。apiVersion: podsnapshot.gke.io/v1 kind: PodSnapshotStorageConfig metadata: name: example-pod-snapshot-storage-config spec: snapshotStorageConfig: gcs: bucket: "BUCKET_NAME" path: "FOLDER_PATH" tokenSource: "TOKEN_SOURCE"次のように置き換えます。
BUCKET_NAME: Cloud Storage バケットの名前。FOLDER_PATH: Cloud Storage マネージド フォルダのパス。TOKEN_SOURCE: アクセスの ID プロバイダ。マルチテナンシーにはpodKSA(デフォルト)またはfederatedP4SAを使用します。
次のようにマニフェストを適用します。
kubectl apply -f example-pod-snapshot-storage-config.yaml
次のステップ
- Pod スナップショットをトリガーする方法を学習する。