Spot VM を使用して低コストでフォールト トレラントなワークロードを実行する


このページでは、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 でワークロードを自動的にスケジュールし、管理します。

制限事項

始める前に

始める前に、次の作業が完了していることを確認してください。

  • 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 を使用してノードプールが含まれる新しいクラスタを作成する手順は、次のとおりです。

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

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

  3. [クラスタを作成] ダイアログで、[GKE Standard] の横にある [構成] をクリックします。

  4. ナビゲーション メニューの [ノードプール] セクションで、構成するノードプールの名前をクリックし、[ノード] をクリックします。

  5. [Enable Spot VMs] チェックボックスをオンにします。

  6. 必要に応じてクラスタを構成し、[作成] をクリックします。

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 を使用して新しいノードプールを作成する手順は次のとおりです。

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [ノードプールを追加] をクリックします。

  4. ナビゲーション メニューで [ノード] をクリックします。

  5. [Enable Spot VMs] チェックボックスをオンにします。

  6. 必要に応じてノードプールを構成してから、[作成] をクリックします。

Spot VM でワークロードをスケジューリングする

GKE は、Spot VM を使用するノードに、cloud.google.com/gke-spot=truecloud.google.com/gke-provisioning=spot(GKE バージョン 1.25.5-gke.2500 以降を実行しているノードの場合)のラベルを追加します。Pod 仕様のこのラベルは、Pod 仕様の nodeSelector フィールドまたはノード アフィニティを使用してフィルタリングできます。

次の例では、2 つのノードプール(そのうちの 1 つは Spot VM を使用)を持つクラスタを作成します。次に、ステートレス nginx アプリケーションを Spot VM にデプロイし、nodeSelector を使用して GKE が Pod を配置する場所を制御します。

  1. 標準 VM を使用して、デフォルトのノードプールで新しいクラスタを作成します。

    gcloud container clusters create CLUSTER_NAME
    

    CLUSTER_NAME は、使用するクラスタの名前に置き換えます。

  2. クラスタの認証情報を取得します。

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Spot VM を使用してノードプールを作成します。

    gcloud container node-pools create POOL_NAME \
        --num-nodes=1 \
        --spot
    

    POOL_NAME は、新しいノードプールの名前に置き換えます。

  4. 次のマニフェストを 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 に指示が伝えられます。

  5. マニフェストをクラスタに適用します。

    kubectl apply -f pi-app.yaml
    
  6. 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 に指示できます。

  1. Spot VM を使用し、ノード taint が付与されているノードを含むノードプールを作成するには、ノードプールの作成時に --node-taints フラグを使用します。

    gcloud container node-pools create POOL_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule
        --spot
    
  2. Spot VM にスケジュールする Pod に、対応する toleration を追加するには、デプロイを変更して、次を Pod 仕様に追加します。

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

    GKE は、この toleration がある Pod のみを、ノード taint が追加された Spot VM にスケジューリングします。

次のステップ