Elastic Container Instance はプリエンティブル インスタンスをサポートしています。スケーラビリティとフォールトトレランスが高く、短期間のジョブであるステートレス アプリケーションをプリエンティブル インスタンスで実行して、インスタンスの使用コストを削減できます。このトピックでは、Kubernetes クラスタでプリエンティブル Elastic Container Instance ベースの Pod を作成する方法について説明します。
背景情報
プリエンティブル エラスティック コンテナ インスタンスは費用対効果が高いです。未使用の Alibaba Cloud リソースを入札して、プリエンティブル インスタンスを作成できます。市場価格がプリエンティブル インスタンスの入札価格を超えた場合、またはインベントリ リソースが不足している場合、インスタンスによって消費されたリソースは回収され、インスタンスは解放されます。
プリエンティブル インスタンスは、スケーラブルな Web サイト サービス、画像レンダリング、ビッグデータ分析、大規模並列コンピューティングなど、スケーラビリティとフォールトトレランスが高く、短期間のジョブであるステートレス アプリケーションを実行するために使用できます。プリエンティブル インスタンスは、幅広い分散、高いスケーラビリティ、高いフォールトトレランスを必要とするアプリケーションに適しています。プリエンティブル インスタンスは、これらのアプリケーションのコストを削減し、スループットを向上させるのに役立ちます。詳細については、プリエンティブル インスタンス を参照してください。
基本概念
プリエンティブル インスタンスを作成する前に、以下の項目に注意してください。
課金
プリエンティブル インスタンスの市場価格は、インスタンス仕様の需給に応じて変動します。プリエンティブル インスタンスを作成する場合は、インスタンスの入札ポリシーを指定する必要があります。入札価格がリアルタイムの市場価格よりも高く、インスタンス仕様のリソース インベントリが十分な場合、プリエンティブル インスタンスが作成されます。プリエンティブル インスタンスが作成されると、保護期間に入り、その期間中は購入時の市場価格に基づいてインスタンスに課金されます。デフォルトでは、保護期間は 1 時間です。保護期間が過ぎると、インスタンスはリアルタイムの市場価格に基づいて課金されます。
説明プリエンティブル インスタンスは、従量課金制インスタンスと比較して低価格で課金されます。プリエンティブル インスタンスの価格は、インスタンス仕様の需給に応じて変動します。プリエンティブル インスタンスは、実際の使用時間に基づいて課金されます。詳細については、プリエンティブル インスタンス トピックの「課金方法」セクションを参照してください。
回収メカニズム
プリエンティブル インスタンスの保護期間が過ぎると、システムは 5 分ごとにインスタンス仕様の市場価格とリソース インベントリをチェックします。リアルタイムの市場価格が入札価格を超えた場合、またはリソース インベントリが不足している場合、プリエンティブル インスタンスは解放されます。
説明プリエンティブル インスタンスのリソースが回収される約 3 分前に、解放準備完了 (SpotToBeReleased) イベントが生成されます。
プリエンティブル インスタンスのリソースが回収されると、インスタンスに関する情報は保持され、インスタンスの課金は停止し、インスタンスのステータスは「期限切れ」に変わります。
注意事項
プリエンティブル インスタンスを使用する前に、以下の項目に注意してください。
適切なインスタンス仕様を選択し、適切な入札を行います。
Elastic Compute Service (ECS) の以下の API オペレーションを呼び出して、過去 30 日間のプリエンティブル インスタンスに関する情報をクエリできます。その後、適切なインスタンス仕様を選択し、入札を行うことができます。
DescribeSpotPriceHistory: プリエンティブル インスタンスの履歴価格をクエリします。
DescribeSpotAdvice: プリエンティブル インスタンスの平均解放率や平均割引率などの情報をクエリします。
重要入札を行う際は、市場価格の変動と、許容できる価格帯を考慮してください。適切な入札は通常、平均市場価格よりも高いですが、それでもビジネス要件の範囲内です。このようにして、プリエンティブル インスタンスの作成リクエストを受け入れて処理することができ、作成されたインスタンスは市場価格の変化によって解放されません。
プリエンティブル インスタンスが解放された場合に影響を受けないストレージ メディアに重要なデータを保存することをお勧めします。たとえば、関連付けられているインスタンスとともに解放されない独立したディスクを使用するか、ファイルストレージ NAS ファイルシステムなどの外部ストレージ リソースを使用できます。
作成方法
ECS インスタンス タイプ、または vCPU の数とメモリサイズを指定して、プリエンティブル インスタンスを作成できます。
ECS インスタンス タイプを指定する
プリエンティブル インスタンスは、指定された ECS インスタンス タイプのリアルタイムの割引従量課金価格で課金されます。
インスタンスの vCPU の数とメモリサイズを指定する
この方法は、ECS インスタンス タイプを指定する方法と同じ効果があります。システムは、vCPU の数、メモリサイズ、価格の要件を満たす ECS インスタンス タイプを自動的に選択します。作成されたプリエンティブル インスタンスは、エラスティック コンテナ インスタンスで使用される vCPU とメモリ リソースの従量課金価格ではなく、使用される ECS インスタンス タイプのリアルタイムの割引市場価格で課金されます。
この方法で作成できるのは、2 つ以上の vCPU を提供するインスタンスのみです。次の表に、サポートされている vCPU とメモリの仕様を示します。指定した仕様が Elastic Container Instance でサポートされていない場合、システムは自動的にサポートされている上位の仕様を使用します。
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" | いいえ | プリエンティブル インスタンスの 1 時間あたりの最大価格を指定します。この値は、小数点以下 3 桁まで正確にすることができます。 このアノテーションは、k8s.aliyun.com/eci-spot-strategy が SpotWithPriceLimit に設定されている場合にのみ有効です。 |
k8s.aliyun.com/eci-spot-duration | "0" | いいえ | プリエンティブル インスタンスの保護期間を指定します。単位: 時間。デフォルト値: 1。値 0 は保護期間がないことを示します。 |
k8s.aliyun.com/eci-spot-fallback | "true" | いいえ | プリエンティブル インスタンスの仕様要件を満たすインベントリ リソースが不足している場合に、従量課金制インスタンスを自動的に作成してインスタンスが作成されるようにするかどうかを指定します。デフォルト値: false。 |
アノテーションは Pod のメタデータに追加する必要があります。たとえば、ジョブを作成する場合は、spec.template.metadata セクションにアノテーションを追加する必要があります。
Elastic Container Instance の機能を使用するには、Elastic Container Instance ベースの Pod を作成するときにのみアノテーションを追加できます。Pod を更新するときにアノテーションを追加または変更しても、これらのアノテーションは有効になりません。
例 1: ECS インスタンス タイプを指定し、SpotWithPriceLimit 入札ポリシーを使用する
例 2: vCPU の数とメモリサイズを指定し、SpotAsPriceGo 入札ポリシーを使用する
例 3: 保護期間を設定しない
例 4: インスタンス仕様の要件を満たすインベントリ リソースが不足している場合に、従量課金制インスタンスを自動的に作成する
プリエンティブル インスタンスの解放
プリエンティブル インスタンスが作成されると、保護期間中は正常に実行できます。保護期間が過ぎると、市場価格が入札価格よりも高い場合、またはインベントリ リソースが不足している場合、プリエンティブル インスタンスは解放されます。以下の操作を実行することで、プリエンティブル インスタンスの解放ステータスを理解できます。
SpotToBeReleased イベント
プリエンティブル インスタンスが解放される約 3 分前に、SpotToBeReleased イベントが生成されます。
重要Elastic Container Instance は、Kubernetes イベントのリストにイベントを送信します。3 分間の間に、プリエンティブル インスタンスの解放によってビジネスに影響が出ないように対策を講じることができます。詳細については、グレースフル終了 を参照してください。
kubectl describeコマンドを実行して、プリエンティブル インスタンスの詳細を表示します。SpotToBeReleased イベントは、コマンド出力の「イベント」セクションに表示されます。例:Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning SpotToBeReleased 3m32s kubelet, eci Spot ECI will be released in 3 minuteskukubectl get eventsコマンドを実行して、イベント情報を表示します。SpotToBeReleased イベントは、コマンド出力に表示されます。例:LAST SEEN TYPE REASON OBJECT MESSAGE 3m39s Warning SpotToBeReleased pod/pi-frmr8 Spot ECI will be released in 3 minutes
解放された後のプリエンティブル インスタンスのステータス
プリエンティブル インスタンスが解放された後も、インスタンス情報は保持されます。インスタンスのステータスは「失敗」に変更され、失敗の原因は BidFailed になります。
kubectl get podコマンドを実行して、インスタンス情報を表示します。コマンド出力に表示されるインスタンス ステータスは BidFailed に変わります。例:NAME READY STATUS RESTARTS AGE pi-frmr8 1/1 BidFailed 0 3h5mkubectl describeコマンドを実行して、プリエンティブル インスタンスの詳細を表示します。次に、コマンド出力のインスタンス ステータスの詳細を表示します。例:Status: Failed Reason: BidFailed Message: The pod is spot instance, and have been released at 2020-04-08T12:36Z
グレースフル終了
プリエンティブル インスタンスが解放される約 3 分前に、SpotToBeReleased イベントが生成されます。同時に、Pod 条件の ContainerInstanceExpired パラメータが true に設定されます。プリエンティブル インスタンスの回収によるサービスの中断を回避するために、通知メカニズムを使用してプリエンティブル インスタンスをグレースフルに終了し、Pod をローテーションできます。
仮想ノードを使用すると、プリエンティブル インスタンスのグレースフル終了を構成できます。k8s.aliyun.com/eci-spot-release-strategy: api-evict アノテーションをプリエンティブル Elastic Container Instance ベースの Pod のメタデータに追加できます。このようにして、仮想ノードが SpotToBeReleased イベントに関する通知を受信すると、仮想ノードは Eviction API を呼び出してプリエンティブル インスタンスをエビクトします。
Pod 条件を使用してプリエンティブル インスタンスの中断に関する通知を有効にし、Eviction API を使用してプリエンティブル インスタンスをエビクトするには、ack-virtual-node を 2.11.0 以降に更新する必要があります。詳細については、ACK 仮想ノード を参照してください。
Eviction API は、PodDisruptionBudget (PDB) で指定された構成と、Pod に構成された terminationGracePeriodSeconds パラメータに従って呼び出されます。API を呼び出して Pod の Eviction オブジェクトを作成することは、Pod の制御ポリシーで定義されている DELETE 操作を実行することと似ています。グレースフル終了の手順:
API 呼び出しを行う
仮想ノードが SpotToBeReleased イベントに関する通知を受信すると、ノードは Eviction API を呼び出します。
PDB を確認する
API サーバーは、エビクトされる Pod に構成されている PDB を確認します。
プリエンティブル インスタンスをエビクトする
API サーバーがエビクション リクエストを検証した後、Pod は以下の手順でエビクトされます。
Pod は削除タイムスタンプを更新するため、API サーバーは終了する Pod を認識できます。Pod には、構成した猶予期間もスタンプされます。
Pod が実行されている仮想ノードの kubelet は Pod を認識し、Pod のグレースフル終了を開始します。
kubelet が Pod を終了すると、クラスタの制御プレーンは Pod を関連する Endpoints と Endpointslices から切り離します。この場合、Pod コントローラは Pod を有効として認識しなくなります。
猶予期間が終了すると、kubelet は Pod を強制終了します。
kubelet は API サーバーに Pod を削除するように通知します。
API サーバーは Pod を削除します。
ワークロードを調整する
Pod が、ReplicaSet や StatefulSet などのコントローラ、またはフォールトトレランス設定が構成されている Job、SparkApplication、ワークフローによって管理されている場合、コントローラは元の Pod がエビクトされた後に新しい Pod を自動的に作成します。
Pod で使用されている PDB が正しく構成されていない場合、またはノードが Eviction API を呼び出したときに多数の Pod が Ready 状態ではない場合、エビクション プロセスは停止します。プリエンティブル インスタンスの期限が切れるまでにエビクション プロセスが完了しない場合、インスタンスは直接解放されます。
