Elastic Container Instance (ECI) はスポットインスタンスをサポートしています。スポットインスタンスは、有効期間の短いジョブや、高いスケーラビリティとフォールトトレランスを持つ特定のステートレスアプリケーションに使用することで、インスタンスのコストを削減できます。このトピックでは、Kubernetes クラスターでスポット ECI Pod を作成する方法について説明します。
背景情報
プリエンプティブルインスタンスは、低コストの入札ベースのコンピューティングリソースです。Alibaba Cloud 上のアイドルリソースに入札して、コンテナを実行できます。入札価格が現在の市場価格を下回った場合、またはリソースインベントリが不足した場合、これらのリソースは回収されます。
プリエンプティブルインスタンスは、実行時間の短いジョブや、弾性的にスケーラブルな Web サービス、画像レンダリング、ビッグデータ分析、大規模な並列計算など、スケーラビリティとフォールトトレランスに優れたステートレスアプリケーションに適しています。アプリケーションが分散型、スケーラブル、かつフォールトトレラントであるほど、プリエンプティブルインスタンスを使用することでコストを節約し、スループットを向上させることができます。詳細については、「プリエンプティブルインスタンスとは」をご参照ください。
基本概念
プリエンプティブルインスタンスを作成する前に、次の概念を理解してください:
-
課金方法
プリエンプティブルインスタンスの市場価格は、需要と供給に応じて変動します。プリエンプティブルインスタンスを作成する際には、入札ポリシーを指定する必要があります。指定したインスタンスタイプに対して入札価格がリアルタイムの市場価格より高く、かつ在庫が十分な場合、インスタンスは正常に作成されます。作成後、インスタンスは保護期間中 (デフォルトで 1 時間)、購入時の市場価格で課金されます。保護期間が終了すると、インスタンスはリアルタイムの市場価格で課金されます。
説明プリエンプティブルインスタンスは、従量課金インスタンスと比較して割引価格で提供されます。実際の価格は需要と供給に基づいて変動し、実際の使用時間に対して課金されます。詳細については、「プリエンプティブルインスタンスの課金」をご参照ください。
-
回収メカニズム
保護期間が終了すると、システムは 5 分ごとにインスタンスタイプの市場価格と在庫を自動的にチェックします。いずれかの時点で市場価格が入札価格を上回った場合、またはインスタンスタイプの在庫が不足した場合、システムはプリエンプティブルインスタンスをリリースします。
説明-
システムがリソースを回収する約 3 分前に、インスタンスがまもなくリリースされることを示すイベントが生成されます。
-
システムがリソースを回収すると、インスタンスの課金は停止します。インスタンス情報は保持され、ステータスは「期限切れ」に変わります。
-
注意事項
プリエンプティブルインスタンスを使用する際は、次の点にご注意ください:
-
適切なインスタンスタイプを選択し、合理的な入札価格を設定します。
ECS の OpenAPI オペレーションを呼び出して、過去 30 日間のプリエンプティブルインスタンスに関する情報をクエリすることで、インスタンスタイプの選択と入札価格の設定に役立てることができます。関連するオペレーションは次のとおりです:
-
DescribeSpotPriceHistory:過去のインスタンス価格をクエリします。
-
DescribeSpotAdvice:インスタンスの平均リリース率や平均割引率などの情報をクエリします。
重要市場価格の変動を考慮し、ビジネスのコスト期待値に沿った十分な高さの入札価格を設定してください。これにより、プリエンプティブルインスタンスの作成成功率が高まり、価格変動によるリリースを防ぎ、コストを節約しながらビジネス要件を満たすことができます。
-
-
重要なデータは、クラウドディスク (インスタンスとともにリリースするオプションを無効にする) や NAS など、プリエンプティブルインスタンスのリリースに影響されないストレージメディアに保存してください。
作成方法
プリエンプティブルな ECI は、ECS インスタンスタイプを指定するか、vCPU とメモリを指定することで作成できます:
-
ECS インスタンスタイプの指定
課金は、指定されたインスタンスタイプの従量課金市場価格とリアルタイムの割引に基づいて行われます。
-
vCPU とメモリの指定
この方法は、ECS インスタンスタイプを指定するのと同じ効果があります。システムは、リソースと価格の要件を満たす ECS インスタンスタイプを自動的にマッチングします。課金は、このマッチングされたインスタンスタイプの市場価格に基づいて行われます。つまり、割引は対応する vCPU とメモリの従量課金価格ではなく、マッチングされた ECS インスタンスタイプの市場価格に適用されます。
この方法は、2 vCPU 以上の仕様のみをサポートします。以下の表は、サポートされている vCPU とメモリの仕様をリストしています。サポートされていない仕様を指定した場合、システムは自動的に次にサポートされている仕様に切り上げます。
vCPU
メモリ (GiB)
2
2, 4, 8, 16
4
4, 8, 16, 32
8
8, 16, 32, 64
12
12, 24, 48, 96
16
16, 32, 64, 128
24
24, 48, 96, 192
32
32, 64, 128, 256
52
96, 192, 384
64
128, 256, 512
構成
Pod のメタデータにアノテーションを追加することで、スポットインスタンスを作成できます。次の表に、関連するアノテーションを示します。
|
アノテーション |
値の例 |
必須 |
説明 |
|
k8s.aliyun.com/eci-spot-strategy |
SpotAsPriceGo |
はい |
スポットインスタンスの入札戦略。有効な値は次のとおりです:
|
|
k8s.aliyun.com/eci-spot-price-limit |
"0.5" |
いいえ |
スポットインスタンスの時間単位の最高価格。小数点以下 3 桁まで指定できます。 このアノテーションは、 |
|
k8s.aliyun.com/eci-spot-duration |
"0" |
いいえ |
スポットインスタンスの保護期間 (時間単位)。デフォルト値は 1 です。値 0 は保護期間がないことを意味します。 |
|
k8s.aliyun.com/eci-spot-fallback |
"true" |
いいえ |
在庫不足によりスポットインスタンスを作成できない場合に、従量課金インスタンスを作成するかどうかを指定します。デフォルト値は false です。 |
-
アノテーションは Pod のメタデータの下に追加します。たとえば、ジョブを作成する場合、アノテーションは
spec>template>metadataの下に追加します。 ECI 関連のアノテーションは Pod の作成時にのみ適用されます。既存の Pod にこれらのアノテーションを追加または変更しても効果はありません。
例 1:ECS インスタンスタイプを指定し、SpotWithPriceLimit を使用
例 2:vCPU とメモリを指定し、SpotAsPriceGo を使用
例 3:保護期間を設定しない
例 4:従量課金インスタンスへのフォールバック
回収の詳細
スポットインスタンスは作成後、保護期間中は正常に実行されます。保護期間が終了すると、市場価格が入札価格を上回るか、リソースの在庫が不足した場合にスポットインスタンスは回収されます。このセクションでは、スポットインスタンスの回収に関連するイベントと Pod のステータスについて説明します。
-
リリース前イベント
スポットインスタンスが回収される約 3 分前に、
SpotToBeReleasedイベントが生成されます。重要ECI は、スポットインスタンスがリリースされることを Kubernetes イベントを通じて通知します。この時間内に、インスタンスの回収による業務の中断を防ぐためのアクションを実行できます。詳細については、「グレースフルターミネーション」をご参照ください。
-
kubectl describeコマンドを実行して Pod の詳細情報を表示します。出力のEventsセクションでリリース前イベントを確認できます。以下に例を示します:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning SpotToBeReleased 3m32s kubelet, eci Spot ECI will be released in 3 minutes -
kubectl get eventsコマンドを実行してイベント情報を表示します。出力でリリース前イベントを確認できます。以下に例を示します:LAST SEEN TYPE REASON OBJECT MESSAGE 3m39s Warning SpotToBeReleased pod/pi-frmr8 Spot ECI will be released in 3 minutes
-
-
回収後の Pod ステータス
スポットインスタンスが回収された後、その情報は保持されますが、ステータスは
Failedに変わり、理由はBidFailedとなります。-
kubectl get podコマンドを実行して Pod 情報を表示します。出力で Pod のステータスが変更されていることを確認できます。以下に例を示します:NAME READY STATUS RESTARTS AGE pi-frmr8 1/1 BidFailed 0 3h5m -
kubectl describeコマンドを実行して Pod の詳細情報を表示します。出力で Pod のステータス情報を確認できます。以下に例を示します:Status: Failed Reason: BidFailed Message: The pod is spot instance, and have been released at 2020-04-08T12:36Z
-
グレースフルターミネーション
スポットインスタンスが回収される約 3 分前に、SpotToBeReleased イベントが生成され、Pod の conditions にある ContainerInstanceExpired フィールドが true に設定されます。これらの通知メカニズムを使用してグレースフルターミネーションと Pod のローテーションを実装し、スポットインスタンスの回収による業務の中断を最小限に抑えます。
仮想ノードは、ECI スポットインスタンスのグレースフルターミネーションをサポートしています。ECI Pod に k8s.aliyun.com/eci-spot-release-strategy: api-evict アノテーションを追加できます。仮想ノードが SpotToBeReleased イベントを受信すると、Eviction API を呼び出してスポットインスタンスをエビクションします。
Pod の conditions を通じた中断通知と Eviction API を通じたエビクションをサポートするには、ACK Virtual Node を v2.11.0 以降にアップグレードする必要があります。詳細については、「ACK Virtual Node」をご参照ください。
API によって開始されるエビクションは、PodDisruptionBudget (PDB) と terminationGracePeriodSeconds の設定を尊重します。API を使用して Eviction オブジェクトを作成することは、Pod に対してポリシー制御された DELETE 操作を実行するのと同様です。プロセスは次のとおりです:
-
API リクエスト
仮想ノードは
SpotToBeReleasedイベントを受信し、Eviction API を呼び出します。 -
PDB チェック
API サーバーは、ターゲット Pod に関連付けられた PodDisruptionBudget を検証します。
-
エビクションの実行
API サーバーがエビクションを許可した場合、Pod は次のように削除されます:
-
API サーバー内の Pod リソースは削除タイムスタンプで更新され、その後 API サーバーは Pod を終了中と見なします。Pod リソースには、設定された猶予期間もマークされます。
-
Pod が実行されているノード上の kubelet は、Pod リソースが終了対象としてマークされていることに気づき、ローカル Pod のグレースフルシャットダウンを開始します。
-
kubelet が Pod をシャットダウンしている間、コントロールプレーンは Pod を Endpoint および EndpointSlice オブジェクトから削除します。その結果、コントローラーは Pod を有効なオブジェクトとは見なさなくなります。
-
Pod の猶予期間が終了すると、kubelet はローカル Pod を強制的に終了させます。
-
kubelet は API サーバーに Pod リソースを削除するよう通知します。
-
API サーバーは Pod リソースを削除します。
-
-
ワークロードの調整
ターゲット Pod がコントローラー (ReplicaSet、StatefulSet、またはフォールトトレラントなジョブ、sparkApplication、Workflow など) によって管理されている場合、コントローラーは通常、エビクションされた Pod を置き換えるために新しい Pod を作成します。
PodDisruptionBudget が誤って設定されている場合、または Eviction API が呼び出されたときに Ready 状態でない Pod が多数ある場合、エビクションプロセスがブロックされる可能性があります。エビクションがスポットインスタンスの有効期限が切れる前に完了しない場合、インスタンスは即座に回収されます。