Kubernetes Engine でプリエンプティブ VM を使用する

このページでは、Kubernetes Engine でのプリエンプティブ VM のサポートの概要について説明します。

概要

プリエンプティブ VM は、最長持続時間が 24 時間で、可用性が保証されない Google Compute Engine VM インスタンスです。プリエンプティブ VM は標準的な Compute Engine VM よりも低価格で、同じマシンタイプとオプションを使用できます。

Kubernetes Engine のクラスタまたはノードプールでプリエンプティブ VM を使用して、一時的で保証がないというプリエンプティブ VM の特性の影響を受けにくいバッチジョブやフォールトトレラント ジョブを実行できます。

プリエンプティブ VM について詳しくは、Compute Engine ドキュメントのプリエンプティブ VM をご覧ください。

v1beta1 API を使用するように gcloud を設定する

この機能を gcloud と一緒に使用するには、gcloud 用の v1beta1 API サーフェスを有効にする必要があります。これによって、gcloud beta container clusters コマンドを実行できます。

v1beta1 APIを使用するように gcloud コマンドライン ツールを設定するには、シェルまたはターミナル ウィンドウで次のいずれかのコマンドを実行します。

export CLOUDSDK_CONTAINER_USE_V1_API_CLIENT=false
または
gcloud config set container/use_v1_api false

プリエンプティブ VM の仕組み

Kubernetes Engine クラスタまたはノードプールによって Compute Engine VM が作成されると、それらの VM はマネージド インスタンス グループのように動作します。Kubernetes Engine のプリエンプティブ VM には、マネージド インスタンス グループ内のプリエンプティブ インスタンスと同じ制約が適用されます。

さらに、これらのプリエンプティブ VM には Kubernetes ラベル cloud.google.com/gke-preemptible=true が付けられます。Kubernetes ラベルを nodeSelector フィールドで使用することで、ポッドを特定のノードにスケジュールできます。

プリエンプティブ VM をフィルタリングするセレクタの例を次に示します。

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-preemptible: "true"

プリエンプティブ VM を含むクラスタまたはノードプールを作成する

GCP Console または gcloud beta container clusters create を使用して、プリエンプティブ VM を含むクラスタまたはノードプールを作成できます。

Console

  1. GCP Console で [Kubernetes Engine] メニューにアクセスします。

    [Kubernetes Engine] メニューにアクセス

  2. [クラスタを作成] をクリックします。

  3. 必要に応じてクラスタを設定します。次に、[その他] をクリックします。
  4. [プリエンプティブ ノード] プルダウン メニューから、[有効] を選択します。
  5. [作成] をクリックします。

gcloud

--preemptible フラグを指定して、プリエンプティブ VM を含むクラスタまたはノードプールを作成できます。

プリエンプティブ VM を含むクラスタを作成するには、次のコマンドを実行します。

gcloud beta container clusters create [CLUSTER_NAME] --preemptible \
[--zone [COMPUTE_ZONE] --project [PROJECT_ID]]

ここで、[COMPUTE_ZONE] はクラスタのコンピューティング ゾーンです。

プリエンプティブ VM を含むノードプールを作成するには、次のコマンドを実行します。

gcloud beta container node-pools create [POOL_NAME] --preemptible \
--cluster [CLUSTER_NAME] [--zone [COMPUTE_ZONE] --project [PROJECT_ID]]

ノードテイントを使用してプリエンプティブ VM ノードへのスケジューリングを回避する

ユースケースによっては、非常に重要なポッドがプリエンプティブ VM ノードにスケジュールされないようにする必要があります。そのような場合、ノードテイントとノードテイントに対する容認機能を使用して、プリエンプティブ VM が含まれるノードにポッドがスケジュールされないようにすることができます。

プリエンプティブ VM が含まれるノードに対するノードテイントを追加するには、次のコマンドを実行します。

kubectl taint nodes [NODE_NAME] cloud.google.com/gke-preemptible="true":NoSchedule

これで、ノードテイントを許容するポッドだけが、このノードにスケジュールされるようになります。

関連する容認機能をポッドに追加するには、次の要素をポッドの仕様またはオブジェクトのポッド テンプレート仕様に追加します。

tolerations:
- key: cloud.google.com/gke-preemptible
  operator: Equal
  value: "true"
  effect: NoSchedule

おすすめ

プリエンプティブ VM では可用性が保証されないため、Compute Engine インスタンスのいずれかまたはすべてがプリエンプトされて使用できなくなる可能性があることを想定してシステムを設計する必要があります。新しいインスタンスがいつ使用可能になるかは保証されません。

プリエンプティブ VM が使用できないときでもジョブまたはワークロードを確実に処理したい場合は、クラスタ内に非プリエンプティブ ノードプールとプリエンプティブ ノードプールの両方を作成できます。

既知の問題

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...