このページでは、Google Kubernetes Engine(GKE)クラスタとノードプールで Spot VM を使用して、フォールト トレラント、ステートレス、またはバッチのワークロードを低コストで実行する方法について説明します。
概要
Spot VM はデフォルトの標準 VM よりも低料金で、可用性を保証しない Compute Engine 仮想マシン(VM)です。Spot VM は、標準の Compute Engine VM と同じマシンタイプとオプションを提供します。Compute Engine は、システム イベント(標準の VM にリソースが必要なときなど)に応じていつでも Spot VM を再利用できます。
GKE での Spot VM の詳細については、Spot VM をご覧ください。
Spot VM は、ステートレス ワークロード、バッチ ワークロード、フォールト トレラント ワークロードを実行するためにプリエンプティブル VM を使用するニーズに応えるものです。プリエンプティブル VM が 24 時間で期限切れになるのに対し、Spot VM に有効期限はありません。Spot VM は、Compute Engine で標準の VM を実行するためにリソースが必要になると終了されます。
Spot VM はまた、Spot Pod により GKE Autopilot クラスタでもサポートされています。Autopilot は Spot Pod を使用して、Spot VM でワークロードを自動的にスケジュールし、管理します。
制限事項
- kubelet グレースフル ノード シャットダウン機能は、GKE バージョン 1.20 以降を実行しているクラスタでのみ有効になります。1.20 よりも前のバージョンの GKE では、Kubernetes on GCP Node Termination Event Handler を使用して、Spot VM がプリエンプトされたときに Pod を正常に終了できます。
- Spot VM では、Windows Server ノードプールはサポートされていません。
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
Spot VM を使用してクラスタを作成する
Google Cloud CLI または Google Cloud コンソールで Spot VM を使用して新しいクラスタを作成できます。
gcloud
標準 VM ではなく、デフォルトのノードプールの Spot VM を使用する新しいクラスタを作成します。
gcloud container clusters create CLUSTER_NAME \
--spot
CLUSTER_NAME
は、使用するクラスタの名前に置き換えます。
コンソール
Spot VM を使用してノードプールが含まれる新しいクラスタを作成する手順は、次のとおりです。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
[add_box 作成] をクリックします。
[クラスタを作成] ダイアログで、[GKE Standard] の横にある [構成] をクリックします。
ナビゲーション メニューの [ノードプール] セクションで、構成するノードプールの名前をクリックし、[ノード] をクリックします。
[Enable Spot VMs] チェックボックスをオンにします。
必要に応じてクラスタを構成し、[作成] をクリックします。
Spot VM を使用してノードプールを作成する
gcloud CLI または Google Cloud コンソールで、Spot VM を使用して新しいノードプールを作成できます。注: Spot VM は、新しいノードプールでのみ有効にできます。既存のノードプールで Spot VM を有効または無効にすることはできません。
gcloud
Spot VM を使用して新しいノードプールを作成します。
gcloud container node-pools create POOL_NAME \
--cluster=CLUSTER_NAME \
--spot
POOL_NAME
は、新しいノードプールの名前に置き換えます。
コンソール
Spot VM を使用して新しいノードプールを作成する手順は次のとおりです。
Google Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[
ノードプールを追加] をクリックします。ナビゲーション メニューで [ノード] をクリックします。
[Enable Spot VMs] チェックボックスをオンにします。
必要に応じてノードプールを構成してから、[作成] をクリックします。
Spot VM でワークロードをスケジューリングする
GKE は、Spot VM を使用するノードに、cloud.google.com/gke-spot=true
と cloud.google.com/gke-provisioning=spot
(GKE バージョン 1.25.5-gke.2500 以降を実行しているノードの場合)のラベルを追加します。Pod 仕様のこのラベルは、Pod 仕様の nodeSelector
フィールドまたはノード アフィニティを使用してフィルタリングできます。
次の例では、2 つのノードプール(そのうちの 1 つは Spot VM を使用)を持つクラスタを作成します。次に、ステートレス nginx
アプリケーションを Spot VM にデプロイし、nodeSelector
を使用して GKE が Pod を配置する場所を制御します。
標準 VM を使用して、デフォルトのノードプールで新しいクラスタを作成します。
gcloud container clusters create CLUSTER_NAME
CLUSTER_NAME
は、使用するクラスタの名前に置き換えます。クラスタの認証情報を取得します。
gcloud container clusters get-credentials CLUSTER_NAME
Spot VM を使用してノードプールを作成します。
gcloud container node-pools create POOL_NAME \ --num-nodes=1 \ --spot
POOL_NAME
は、新しいノードプールの名前に置き換えます。次のマニフェストを
pi-app.yaml
という名前のファイルとして保存します。apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: metadata: labels: app: pi spec: nodeSelector: cloud.google.com/gke-spot: "true" terminationGracePeriodSeconds: 25 containers: - name: pi image: perl:5.34.0 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never backoffLimit: 4
このマニフェストでは、
nodeSelector
フィールドによって、Spot VM を使用するノードでのみ Pod をスケジューリングするように GKE に指示が伝えられます。マニフェストをクラスタに適用します。
kubectl apply -f pi-app.yaml
Pod を記述します。
kubectl describe pod pi
出力は次のようになります。
Name: pi-kjbr9 Namespace: default Priority: 0 Node: gke-cluster-2-spot-pool-fb434072-44ct ... Labels: app=pi job-name=pi Status: Succeeded ... Controlled By: Job/pi Containers: ... Conditions: Type Status Initialized True Ready False ContainersReady False PodScheduled True Volumes: ... Node-Selectors: cloud.google.com/gke-spot=true Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m3s default-scheduler Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct Normal Pulling 4m2s kubelet Pulling image "perl:5.34.0" Normal Pulled 3m43s kubelet Successfully pulled image "perl:5.34.0" in 18.481761978s Normal Created 3m43s kubelet Created container pi Normal Started 3m43s kubelet Started container pi
Node
フィールドは、GKE が Spot VM を使用するノードでのみ Pod をスケジューリングすることを示しています。
Spot VM に taint と toleration を使用する
ベスト プラクティスとして、DNS などのシステム ワークロードを配置できる Spot VM が含まれていないノードプールを少なくとも 1 つ含むクラスタを作成します。ノード taint と、対応する toleration を使用して、特定のワークロードを Spot VM に配置しないように GKE に指示できます。
Spot VM を使用し、ノード taint が付与されているノードを含むノードプールを作成するには、ノードプールの作成時に
--node-taints
フラグを使用します。gcloud container node-pools create POOL_NAME \ --node-taints=cloud.google.com/gke-spot="true":NoSchedule --spot
Spot VM にスケジュールする Pod に、対応する toleration を追加するには、デプロイを変更して、次を Pod 仕様に追加します。
tolerations: - key: cloud.google.com/gke-spot operator: Equal value: "true" effect: NoSchedule
GKE は、この toleration がある Pod のみを、ノード taint が追加された Spot VM にスケジューリングします。
次のステップ
- オンデマンド ノードをフォールバックとして Spot VM 上で GKE アプリケーションを実行する方法を確認する。
- GKE の Spot VM について確認する。
- GKE で Spot VM を使用してバッチ ワークロードをデプロイするチュートリアルを実施する。