スポット・インスタンス

スポット・インスタンスは、スタンダード・インスタンスを大幅に割引したものです。 中断可能な、あるいはステートレスなワークロードのために、利用可能なコンピュートリソースを使用するように設計されている。 スポット・インスタンスはいつでもプリエンプト(退去)させることができる。

Spotインスタンスでは、ワークロードの特性、パフォーマンスのニーズ、価格帯に合わせて最適な互換性のあるプロファイルを選択できます。 スポット・インスタンスは、フォールト・トレラントで中断可能なワークロードに理想的である。なぜなら、 IBM Cloud VPC、リソース需要に基づいてこれらのインスタンスがプリエンプトされるからである。

スポットインスタンスは、以下のようなワークロードに最適です。

  • 開発テストサーバー
  • データ分析
  • イメージレンダリング
  • コンテナー化
  • バッチ処理

スポット・インスタンスの利点

スポットインスタンスには以下のような利点がある。

  • コスト効率
  • スケーラブル - VPCのオートスケールにより、スポットインスタンスを追加または削除できます
  • スポットインスタンスは標準のインスタンスクォータを使用しない。 スポットインスタンスにはそれぞれのクォータがある(デフォルトは100)。
  • 最低ランタイムなし
  • サイズ変更可能(サイズを変更するには、インスタンスを停止する必要があります)

スポットインスタンスの制限

スポットインスタンスは以下の機能には対応していません。

  • バースト可能なインスタンス
  • 専用ホスト
  • 予約

スポットインスタンスの詳細

  • スポットインスタンスは GPUプロファイルと Flexプロファイルのみを サポートする。
  • オートスケールと インスタンスグループはスポットインスタンスをサポートします。
  • プレースメント・グループはサポートされているが、プレースメント・グループを使用すると容量エラーが発生する可能性があることに留意してほしい。

スポットインスタンスは、利用可能なキャパシティが保証されているわけではない。 容量が足りない場合は、別のゾーンや地域を試すか、後でもう一度試してみてください。

インスタンス・プロファイルには、"standard"、"spot"、またはその両方のavailability_classと呼ばれるプロパティがあります。 値の配列に "spot "があれば、プロファイルを使ってスポット・インスタンスを作成できる。

インスタンスを作成する際には、いくつかの新しいフィールドを設定する必要がある:

  • availability.class スポット "でなければならない
  • availability_policy.preemption は "stop "または "delete"(デフォルトは "stop")

APIリクエストのプロパティの例を以下に示す。

{
   "availability": {
       "class": "spot"
   },
   "availability_policy": {
       "preemption": "delete"
   },
   ...
}

優先使用

スポット・インスタンスの先取りとは、プラットフォームがスポット・インスタンスを立ち退かせる必要があると判断した場合である。 先取りが始まると、先取りポリシーが適用され、30秒のベストエフォート先取り猶予期間が始まる。 この猶予期間が終了すると、そのインスタンスは強制的にシャットダウンされる。

プリエンプション・ポリシーは、インスタンスがプリエンプトされたときのスポット・インスタンスの動作を決定する。 availability_policy.preemption プロパティは、サポートされているインスタンスに追加された場合、"stop "または "delete "の値を持つ。 このプロパティは、 availability.class = spot のスポット・インスタンスにのみ適用される。

  • 「stop" - 先取りが完了すると、インスタンスは停止状態になる。 インスタンスを再度起動するか、削除することができます。
  • 「delete" - 先取りが終わるとインスタンスは削除される。

先取り中に先取りポリシーに加えられた変更は、次の先取りまで適用されない。

先取りの通知は2つの方法で行われる。

  • スポット・インスタンスのオペレーティング・システム内でグレースフル・シャットダウン・コマンドが発行される。 このシャットダウンコマンドは、ゲスト内でプログラム的に応答することができる。
  • スポット・インスタンスが先取り用に選択されると、ユーザー向けのログが先取り処理の最初に送信される。 例" instance.00002 ":"スポットインスタンス {{.instanceID}} が先取り用に選択されている". 30秒後、スポットインスタンスがまだ停止していない場合、ゲスト内で強制シャットダウンが発行されます。 ロギングの詳細については、 VPCのロギングを 参照してください。

インスタンスグループによるスケールダウンにより削除されたスポットインスタンスは、プリエンプトされたとはみなされないため、プリエンプトポリシーは無視されます。

スポット・インスタンスがプリエンプトされると、グレースフル・シャットダウン・コマンドがスポット・インスタンスのオペレーティング・システムに送られる。 シャットダウンスクリプトを作成し、 systemd サービスファイルに追加することで、このシャットダウンリクエストをインターセプトし、シャットダウンスクリプトを実行することができる。 スクリプトの例は usr/local/bin/ibm-cloud-shutdown-script.sh にある。

#!/bin/bash
OUTPUT_FILE="/tmp/counter.out"
counter=0
while true; do
    echo "$counter" > "$OUTPUT_FILE"
    ((counter++))
    sleep 1
done

このスクリプトは、シャットダウンを実行するためのプレースホルダーである。 スクリプトを systemd サービスファイルから実行するには、次の例のようにサービスファイルの ExecStop フィールドにスクリプトのパスを追加する。

/etc/systemd/system/ibm-cloud-shutdown-script.service にある systemd サービスファイル:

[Unit]
Description=IBM Cloud Shutdown Script
Wants=network-online.target rsyslog.service
After=network-online.target rsyslog.service
[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=true
ExecStop=/usr/local/bin/ibm-cloud-shutdown-script.sh
TimeoutStopSec=0
KillMode=process
[Install]
WantedBy=multi-user.target

グレースフル・シャットダウン・コマンドとそれに続く強制停止コマンドの間の時間は30秒である。 したがって、30秒を過ぎてもシャットダウンスクリプトが実行されている場合、強制停止によって中断される。 この30秒の猶予時間はベストエフォートであり、状況によって異なる場合がある。

インスタンスグループを使用したスポットインスタンスの再作成

スポット・インスタンスがプリエンプトされると、それがインスタンス・グループのメンバーであれば、インスタンス・グループはプリエンプトされたスポット・インスタンスを置き換えるスポット・インスタンスを作成しようとします。 新しいスポット・インスタンスが作成され、インスタンス・グループ・サブネット配列で指定されているサブネットの1つにアタッチされる。

先取り後にスポット・インスタンスを自動的に再作成したい場合は、インスタンス・グループを使用してこれらのスポット・インスタンスを再作成できます。

  1. インスタンス availability.class ~ spot 、 availability_policy.preemption ~ delete を使って、ニーズに合った インスタンステンプレートを作成します

  2. 作成したインスタンス・テンプレートで インスタンス・グループを作成 します。

    スポット・インスタンスのキャパシティが見つかる可能性を高めるには(1つのゾーンでキャパシティが制約されている場合)、リージョン内のゾーンにまたがる複数のサブネットを指定して高可用性を実現します。 { :tip}

プリエンプトされたインスタンスを停止状態に保つには、 availability_policy.preemption_ の設定に stop を指定する必要がある。 インスタンス・グループによってスポット・インスタンスが作成された後、 PATCH /instance_groups/{instance_group_id}/memberships/{id} を送信し、 削除_インスタンス_オン_メンバーシップ_削除 プロパティに false を指定する必要があります。