スポットインスタンスは、従量課金インスタンスよりも低コストのオンデマンドインスタンスの一種です。ノードプール内のスポットインスタンスと従量課金インスタンスの比率を指定して、リソースコストを削減できます。このトピックでは、スポットインスタンスベースのノードプール、その使用シナリオ、インスタンスタイプの設定方法、インスタンス比率の指定方法、インスタンスの有効期限切れステータスの確認方法、およびスポットインスタンスの安全停止方法について説明します。
はじめに
スポット インスタンスは、従量課金方式を使用します。これらのインスタンスは使用後に料金を支払います。料金は市場価格と課金期間に基づいて計算されます。スポットインスタンスベースのノードプールは、スポットインスタンスと従量課金インスタンスの両方で構成され、指定した比率になります。
スポットインスタンスは、リソースの可用性などの要因に基づいて価格が動的に変動する従量課金インスタンスです。価格は通常の従量課金インスタンスよりも最大 90% 安くなります。市場価格は、インスタンスタイプの需給の変化に基づいて変動します。スポットインスタンスを作成するときは、指定したインスタンスタイプに入札するための入札モードを選択する必要があります。入札価格が市場価格を超え、十分な在庫がある場合、スポットインスタンスが作成されます。
作成後、通常の従量課金インスタンスと同様にスポットインスタンスを使用できます。クラウドディスクやパブリック IP アドレスなどの他のクラウドリソースと組み合わせて使用することもできます。デフォルトの保護期間は 1 時間です。この期間が終了すると、システムは 5 分ごとにスポット価格とリソース在庫を確認します。スポット価格が入札価格を超えるか、在庫が不足すると、スポットインスタンスは解放されます。
シナリオ
スポットインスタンスベースのノードプール
スポットインスタンスは予期せず回収される可能性があるため、これらのノードプールはフォールトトレランスの高いステートレス アプリケーションに適しています。バッチ処理、機械学習トレーニングジョブ、キューイングされたトランザクション処理アプリケーション、REST API を使用するアプリケーション、Apache Spark ジョブなどのビッグデータコンピューティングの ETL(抽出、変換、ロード)ワークロードに関連するワークロードに使用できます。
スポットインスタンスベースのノードプールにデプロイされたワークロードがノードリソースの可用性がないことを許容できることを確認する必要があります。許容できない場合は、代わりに従量課金インスタンスまたはサブスクリプションインスタンスを使用してノードプールにデプロイすることをお勧めします。ノードリソースの可用性がないことを許容できないワークロードには、次のものがあります。
監視ツールや O&M ツールなどのクラスタ管理ツール。
データベースサービスなどのステートフルワークロードまたはアプリケーション。
Auto Scaling を使用したスポットインスタンスベースのノードプール
ワークロードが特定のパターンで変動するユーザートラフィックを処理する場合は、スポットインスタンスベースのノードプールで Auto Scaling を有効にすることをお勧めします。
Auto Scaling を有効にすると、システムはノードプールがより多くのポッドをホストするためにスケールアウトする必要があるかどうかを自動的にチェックし、しきい値に達するとスケールインします。Auto Scaling を使用したノードプールは、Auto Scaling を使用しないノードプールよりも高速にスケールアウトでき、アイドルリソースはより迅速に解放されます。高速スケールアウトにより、スポットインスタンスが回収されたときに十分なノードリソースが確保され、アイドルリソースの自動解放によりコストを削減できます。
スポットインスタンスのインスタンスタイプを選択する
リソースの可用性、コスト、パフォーマンスのバランスを取りながら、ビジネス要件に基づいてインスタンスタイプを選択することをお勧めします。Elastic Compute Service(ECS)は、さまざまなワークロード要件を満たすためのさまざまなインスタンスタイプを提供します。スポットインスタンスベースのノードプールを使用する場合は、インスタンスが回収されたときのワークロードへの影響を最小限に抑えるインスタンスタイプの組み合わせを選択します。
インスタンスタイプを選択するには、次のいずれかの方法を使用できます。
コンソールのおすすめを使用する
Container Service for Kubernetes(ACK)コンソールは、インスタンスタイプに関する推奨事項を提供します。ノードプールを作成または変更すると、選択したリージョンで使用可能なインスタンスタイプが表示されます。インスタンスタイプを選択すると、コンソールは自動的に推奨事項を提供し、ノードプールのスケーラビリティを表示し、各スポットインスタンスの価格帯を表示します。この情報に基づいて選択内容を調整し、価格制限を指定できます。
ノードプールの作成または変更方法の詳細については、「ノードプールの作成と管理」をご参照ください。

spot-instance-advisor コマンドラインツールを使用する
ACK は、スポットインスタンスの過去の価格と現在の価格をクエリするために使用できるオープンソースのコマンドラインツール spot-instance-advisor を提供します。spot-instance-advisor は API 操作を呼び出して、リージョン内のインスタンスタイプの過去の価格を取得します。取得した統計に基づいて 1 時間あたりの vCPU 単価を計算し、1 時間あたりの vCPU 単価が最も低いインスタンスタイプをリストします。また、このツールは、各インスタンスタイプの 1 時間あたりの vCPU 単価のエントロピーも計算します。エントロピー値が高いほど、価格変動が頻繁に発生することを示します。1 時間あたりの vCPU 単価のエントロピー値が低いインスタンスタイプを選択することをお勧めします。
spot-instance-advisor をダウンロードします。詳細については、「spot-instance-advisor」をご参照ください。
spot-instance-advisor は、次のパラメータをサポートしています。
Usage of ./spot-instance-advisor:
-accessKeyId string
クラウドアカウントの accessKeyId // クラウドアカウントの accessKeyId
-accessKeySecret string
クラウドアカウントの accessKeySecret // クラウドアカウントの accessKeySecret
-cutoff int
スポットインスタンス価格の割引(デフォルトは 2)// スポットインスタンス価格の割引(デフォルトは2)
-family string
必要なスポットインスタンスファミリ(例:ecs.n1、ecs.n2)// 必要なスポットインスタンスファミリ(例:ecs.n1、ecs.n2)
-limit int
スポットインスタンスの制限(デフォルトは 20)// スポットインスタンスの制限(デフォルトは20)
-maxcpu int
スポットインスタンスの最大コア数(デフォルトは 32)// スポットインスタンスの最大コア数(デフォルトは32)
-maxmem int
スポットインスタンスの最大メモリ(デフォルトは 64)// スポットインスタンスの最大メモリ(デフォルトは64)
-mincpu int
スポットインスタンスの最小コア数(デフォルトは 1)// スポットインスタンスの最小コア数(デフォルトは1)
-minmem int
スポットインスタンスの最小メモリ(デフォルトは 2)// スポットインスタンスの最小メモリ(デフォルトは2)
-region string
スポットインスタンスのリージョン(デフォルトは "cn-hangzhou")// スポットインスタンスのリージョン(デフォルトは "cn-hangzhou")
-resolution int
価格履歴分析のウィンドウ(デフォルトは 7)// 価格履歴分析のウィンドウ(デフォルトは7)次のコマンドを実行して、現在のリージョンにあるインスタンスタイプの価格をクエリします。
accessKeyId、accessKeySecret、およびregionパラメータが必要です。パラメータを実際の値に設定します。
./spot-instance-advisor --accessKeyId=<id> --accessKeySecret=<secret> --region=<cn-zhangjiakou>スポットインスタンスと従量課金インスタンスの比率を設定する
ノードプール内のスポットインスタンスと従量課金インスタンスの比率を設定すると、安定性のために十分な従量課金インスタンスを維持しながら、コストを削減できます。
クラスタのバージョンは 1.9 以降である必要があります。クラスタをアップグレードする必要がある場合は、「ACK クラスタの Kubernetes バージョンの更新」をご参照ください。
クラスタに十分なノードクォータがあることを確認してください。ノードクォータとクォータ増加の申請方法の詳細については、「制限」をご参照ください。
既存のノードを追加する場合は、VPC 内の ECS インスタンスが Elastic IP Address(EIP)に関連付けられているか、VPC に NAT ゲートウェイが設定されていることを確認してください。ノードはインターネットにアクセスできる必要があります。そうでない場合は、追加できません。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ノードプール] ページで、[ノードプールの作成] をクリックし、プロンプトに従ってノードプールを設定します。
次の表では、主要なパラメータのみについて説明します。詳細については、「ノードプールの作成と管理」をご参照ください。
パラメータ
説明
VSwitch
高可用性を実現するために、異なるゾーンにある複数の vSwitch を選択することをお勧めします。
課金方法
スポットインスタンスを選択します。
以下の詳細オプションを展開し、次のパラメータを設定します。

スケーリングポリシー
優先度: ECS インスタンスは、クラスタに指定されている vSwitch の優先順位に基づいてスケーリングされます。vSwitch の優先順位は上から下に向かって低くなります。優先順位が最も高い vSwitch が存在するゾーンに ECS インスタンスを作成できない場合、Auto Scaling は優先順位が次に高い vSwitch が存在するゾーンに ECS インスタンスを作成します。
コスト最適化: ECS インスタンスは、vCPU 単価の昇順に基づいて作成されます。
ノードプールの [課金方法] が [プリエンティブルインスタンス] に設定されている場合、プリエンティブルインスタンスが優先的に作成されます。[従量課金インスタンスの割合(%)] も設定できます。在庫不足などの理由でプリエンティブルインスタンスを作成できない場合は、要件を満たすために従量課金インスタンスが自動的に使用されます。
バランスの取れた分散: バランスの取れた分散ポリシーは、複数の vSwitch を指定した場合にのみ有効になります。このポリシーにより、ECS インスタンスがスケーリンググループのゾーン(vSwitch)に均等に分散されます。在庫不足などの理由で ECS インスタンスがゾーン全体に均等に分散されていない場合は、リバランス操作を実行できます。
スポットインスタンスが不足している場合は従量課金インスタンスを使用する
このチェックボックスをオンにすると、価格や在庫などの理由でプリエンティブルインスタンスを作成できない場合、ACK は ECS インスタンスの要件を満たすために従量課金インスタンスの作成を自動的に試みます。
補足スポットインスタンスを有効にする
このチェックボックスをオンにすると、ACK はプリエンティブルインスタンスが回収されようとしているというシステムメッセージ(インスタンスが回収される 5 分前)を受信したときに、補償のために新しいインスタンスのスケールアウトを試みます。
補償が成功した場合、ACK は古いノードをドレインし、クラスタから削除します。補償が失敗した場合、ACK は古いノードをドレインしません。プリエンティブルインスタンスのアクティブな解放により、サービス例外が発生する可能性があります。補償が失敗した後、在庫が復元されたか、価格条件が満たされると、ACK はインスタンスを自動的に購入して、予想されるノード数を維持します。詳細については、「ノードプールでプリエンティブルインスタンスを使用するためのベストプラクティス」をご参照ください。
補償の成功率を向上させるために、[従量課金インスタンスで補完する] も有効にすることをお勧めします。
設定が完了したら、ノードプールリストで [アクション] をクリックし、[詳細] を選択できます。次に、[概要] タブをクリックします。[ノードの設定] セクションで、従量課金インスタンスの割合を表示できます。
スポットインスタンスの有効期限が切れそうかどうかを確認する
スポットインスタンスの予期しない有効期限切れと解放を回避するために、ACK は ack-node-problem-detector(NPD) コンポーネントを提供して、スポットインスタンスが解放されそうになったときに通知します。
NPD コンポーネントをインストールするには、「手順 1: ack-node-problem-detector コンポーネントをインストールする」をご参照ください。
ACK クラスタでは、ECS インスタンスはサービスをホストするノードとして機能します。ECS インスタンスを作成するときに課金方法としてスポットインスタンスまたはサブスクリプションを指定すると、インスタンスは有効期限に達すると自動的に解放されます。事前にポッドのエビクション、ノードのドレイン、またはノードの交換を行わないと、インスタンスで実行されているサービスが中断される可能性があります。マスターノードインスタンスが解放されると、クラスタレベルの問題が発生する可能性があります。このような問題を防ぐために、ACK は NPD コンポーネントを使用して InstanceExpired ステータスを監視し、解放されようとしているインスタンスを識別します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、変更するクラスタの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ノード] ページで、確認するノードを見つけて、ノード名をクリックするか、[アクション] 列で を選択します。
ノードの詳細ページで、InstanceExpired 条件のステータスを確認します。
[ステータス] セクションで、InstanceExpired 条件のステータスを確認します。

次の表に、InstanceExpired 条件の状態を示します。
InstanceExpired の状態
説明
True
[InstanceExpired] 条件が True 状態であり、[コンテンツ] が [InstanceToBeTerminated] である場合、スポットインスタンスの有効期限が切れようとしており、解放されようとしていることを示します。
False
[InstanceExpired] 条件が False 状態であり、[コンテンツ] が [InstanceNotToBeTerminated] である場合、スポットインスタンスの有効期限が切れようとしていないことを示します。
不明
この状態は、プラグインでエラーが発生したことを示します。チケットを送信する して解決策を求めてください。
InstanceExpired 条件が [True] 状態の場合、次の図に示すように、[イベント] セクションでイベントが生成されます。

InstanceExpired 条件が True 状態の場合、スポットインスタンスの有効期限が切れようとしており、解放されようとしていることを示します。このノードで実行されているアプリケーションの中断を防ぐために、他のノードにスケジュールします。詳細については、「アプリケーションポッドを指定されたノードにスケジュールする」をご参照ください。
スポットインスタンスの安全停止
スポットインスタンスの安全停止には、監視と通知、回収前のインスタンスの補完、解放されるノードでのカスタム操作が含まれます。
監視と通知
ACK は、ノード問題検出器(NPD)を使用してスポットインスタンスのステータスを監視し、有効期限が切れそうになると通知を送信します。
スポットインスタンスの有効期限が切れそうでない場合、[InstanceExpired] の値は [False] です。

スポットインスタンスの有効期限が切れそうな場合、[InstanceExpired] の値は [True] です。この場合、ACK はクラスタイベントを生成して、スポットインスタンスの有効期限が切れそうになっていることを通知します。

補足プリエンプティブルインスタンスを有効にする
スポットインスタンスの有効期限が切れて解放されると、そこにデプロイされたサービスは一時停止されます。ACK は、この状況に迅速に対応するのに役立つ方法を提供します。Auto Scaling を設定し、インスタンスのステータスを監視し、インスタンスの有効期限が切れそうになると通知を受信できます。ただし、これらの方法はインスタンスが回収された後に実装され、新しいインスタンスが追加されるまで使用可能なリソースは増加しません。この問題に対処するために、ACK はスポットインスタンスが回収される前に補完し、既存のインスタンスの有効期限が切れる前に新しいインスタンスを作成できます。
補足スポットインスタンスを有効にすると、ACK は有効期限が切れそうなインスタンスを自動的にチェックします。検出されると、ACK はスケールアウトアクティビティをトリガーして、新しい補足インスタンスを追加します。補足インスタンスが実行を開始すると、有効期限が切れるインスタンスの解放プロセスが開始されます。ステータスはスケジュール不可に設定され、その後ドレインされて削除されます。これにより、ワークロードは他のノードにスムーズに移行し、サービスの中断を回避できます。
在庫不足などの理由で補完が失敗した場合、ACK は古いノードをドレインしません。スポットインスタンスのアクティブな解放により、サービス例外が発生する可能性があります。補完が失敗した後、在庫が復元されたか、価格条件が満たされると、ACK はインスタンスを自動的に購入して、予想されるノード数を維持します。
補完の成功率を向上させるために、[補足従量課金インスタンスを有効にする] も有効にすることをお勧めします。
補完によって回収プロセスが中断されることはありません。補足プリエンプティブルインスタンスを有効にする を有効にするかどうかに関係なく、スポットインスタンスは通知から 5 分後に回収されます。

解放されるノードでのカスタム操作
ノードを安全にシャットダウンするときに、DNS レコードからノード情報を削除するなど、追加の操作を実行する必要がある場合があります。解放されるノードでカスタム操作を実行するには、ノードステータスの [InstanceExpired] フィールドを監視するか、[InstanceToBeTerminated] イベントのリスナーを設定することをお勧めします。スポットインスタンスの有効期限が切れそうになっているか、解放されそうになっているという通知を受信したら、安全にシャットダウンしてからカスタム操作を実行できます。インスタンスの有効期限切れステータスの確認の詳細については、「スポットインスタンスの有効期限が切れそうかどうかを確認する」をご参照ください。