プリエンプティブル VM の実行

このページでは、Google Kubernetes Engine(GKE)でのプリエンプティブル仮想マシン(VM)のサポートの概要を説明します。

概要

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

バッチジョブやフォールト トレラントなジョブを実行するには、GKE クラスタやノードプールでプリエンプティブル VM を使用できます。これらのジョブは、一時的で可用性が保証されないプリエンプティブル VM の性質にそれほど影響されないためです。

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

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

GKE クラスタまたはノードプールによって Compute Engine VM が作成されると、それらの VM はマネージド インスタンス グループのように動作します。GKE のプリエンプティブル VM には、マネージド インスタンス グループ内のプリエンプティブル インスタンスと同じ制約が適用されます。プリエンプティブル インスタンスは、プリエンプション通知を受け取ってから 30 秒後に終了します。

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

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

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

Kubernetes 制約違反

GKE でプリエンプティブル VM を使用すると、一部の Kubernetes 保証が無効になります。次の制約がプリエンプティブル VM によって変更されます。

  • ノード プリエンプションによりポッドが強制的にシャットダウンされ、構成済みのポッドの猶予期間が無視されます。つまり、Pod は予告なくシャットダウンされます。

  • ポッド停止予算のドキュメントでは「予算の保護は任意の強制排除のみを対象としており、利用できない状況のすべての原因を対象としていない。」と記述されています。プリエンプションは任意ではありません。したがって、ポッド停止予算で指定されている使用不能状態よりも大規模な使用不能状態が発生することがあります。

ベスト プラクティス

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

さらに、プリエンプティブル VM 上で動作するポッドが常に正常にシャットダウンできるという保証はありません。ノードがプリエンプトされていることと、ポッドが実行されていないことを GKE が検出するまでに数分間かかることがあります。これが原因で、新しいノードへのポッドのスケジュール変更が遅延します。

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

プリエンプションの後でノード名が置換される場合、ノード名は通常変更されませんが、内部と外部のプリエンプティブル VM IP はプリエンプションの時点で変更されることがあります。

プリエンプティブル VM は、StatefulSets 固有の at-most-one セマンティクスに違反し、データ損失の原因となる可能性があるので、ステートフル ポッドではプリエンプティブル VM を使用しないでください。

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

システムの中断を回避するには、ノード taint を使用して、重要な Pod がプリエンプティブル VM ノードでスケジュールされないようにします。

ノード taint を適用する場合は、DNS などのシステム コンポーネントを実行する標準 VM のノードプールが常に存在するように、クラスタにプリエンプティブル以外の taint が追加されていないノードも含まれるようにします。

プリエンプティブル VM が含まれるノード用にノード taint を追加する

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

kubectl taint nodes node-name cloud.google.com/gke-preemptible="true":NoSchedule

ここで、node-name はノードの名前です。

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

容認機能をポッドに追加する

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

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

GPU プリエンプティブル ノード taint

プリエンプティブル GPU ノードプールを追加する前に、非プリエンプティブル ノードを含むクラスタを作成する必要があります。これにより、プリエンプティブル GPU ノードプールを追加する前の時点で、DNS などのシステム コンポーネントを実行するための標準 VM からなるノードプールが常に存在するようになります。

GPU を含むプリエンプティブル ノードプールがクラスタに追加されるとき(クラスタがプリエンプティブル GPU ノードプールを使用して初めて作成される場合を含む)に、クラスタに他のノードプールがない場合には、通常の "nvidia.com/gpu":NoSchedule taint が割り当てられません。つまり、プリエンプト時点で停止される可能性のあるプリエンプティブル ノード上で、システムポッドがスケジュールされます。これらのポッドは、GPU ノードのリソースも消費します。このため GPU ノードが非 GPU ノードよりも高コストになり、キャパシティだけでなく予算も無駄に消費されることになります。

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

プリエンプティブル VM を含むクラスタまたはノードプールを作成するには、gcloud コマンドライン ツールまたは Cloud Console を使用できます。

gcloud

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

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

gcloud container clusters create cluster-name --preemptible

ここで、cluster-name は作成するクラスタの名前です。

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

gcloud container node-pools create pool-name --preemptible \
    --cluster cluster-name

ここで

  • pool-nameは、作成するノードプールの名前です。
  • cluster-nameは、ノードプールのクラスタの名前です。

Console

  1. Cloud Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

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

  3. 必要に応じてクラスタを構成します。

  4. ナビゲーション パネルの [ノードプール] で、構成するノードプールの [ノード] をクリックします。

  5. [プリエンプティブル ノードを有効にする] チェックボックスをオンにします。

  6. [作成] をクリックします。

次のステップ