バッチジョブや耐障害性のあるワークロードをオンデマンドインスタンスで継続的に実行すると、コストが高くなる可能性があります。プリエンプティブルインスタンスを使用すると、これらのワークロードを Elastic Container Instance (ECI) ベースの Pod 上で大幅に低いコストで実行できます。ジョブが完了する前に Pod が解放された場合でも、Kubernetes ジョブコントローラーによって自動的に新しい Pod が作成され、置き換えられます。
適切なワークロード
中断を許容できるワークロードには、プリエンプティブルインスタンスを使用してください。
| 適切 | 不適切 |
|---|---|
| バッチジョブおよびワンオフタスク | ステートフルアプリケーション |
| スケーラブルな Web サービスなどのステートレスで耐障害性のあるアプリケーション | タスクの途中で中断を処理できない長時間実行サービス |
| 再起動が許容される短期的な計算タスク | 起動またはシャットダウン時間が 5 分間のリリース前ウィンドウを超えるワークロード |
仕組み
プリエンプティブルインスタンスを作成する際、入札ポリシーを指定します。指定した入札価格がリアルタイムの市場価格を上回り、かつそのインスタンスタイプのリソース在庫が十分な場合にインスタンスが作成されます。
保護期間: 作成後、インスタンスは 1 時間の保護期間 (デフォルト) 実行され、購入時の市場価格で課金されます。
保護期間後: システムは 5 分ごとに市場価格と在庫を確認します。市場価格が指定した入札価格を上回るか、在庫がなくなると、インスタンスは解放されます。解放される約 5 分前に SpotToBeReleased イベントが Kubernetes イベントリストに送信されます。この時間枠を利用して、インバウンドトラフィックを停止したり、ワークロードをチェックポイントしたりしてください。
ジョブの継続性: ジョブが完了する前に Pod が解放された場合、Kubernetes ジョブコントローラーは自動的に新しい Pod を作成してジョブを続行します。元の Pod は BidFailed ステータスで保持されます。
制限事項
デフォルトでは、保護期間は 1 時間です。
保護期間終了後、インスタンスの可用性は市場価格とリソース在庫に依存するため、稼働時間の保証はありません。
SpotToBeReleasedイベントは、解放の約 5 分前に到着します。ワークロードのクリーンなシャットダウンに 5 分以上かかる場合、プリエンプティブルインスタンスは適していない可能性があります。
前提条件
開始する前に、以下を確認してください。
ACK Serverless クラスター
クラスターに接続するように設定された
kubectl
プリエンプティブルインスタンスでのジョブの実行
ステップ 1: ジョブマニフェストの作成
次の内容で spot_job.yaml という名前のファイルを作成します。
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
annotations:
k8s.aliyun.com/eci-use-specs: ecs.c5.large,2-4Gi # 複数のインスタンスタイプを指定すると、作成成功率が向上します
k8s.aliyun.com/eci-spot-strategy: SpotAsPriceGo # リアルタイムの市場価格を入札価格として使用します
spec:
containers:
- name: pi
image: registry-vpc.cn-beijing.aliyuncs.com/ostest/perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Neverk8s.aliyun.com/eci-spot-strategy アノテーションは入札ポリシーを設定します。
| 値 | 説明 |
|---|---|
SpotAsPriceGo | 購入時の市場価格を自動的に入札価格として使用します。 |
SpotWithPriceLimit | 設定した 1 時間あたりの最大価格を使用します。価格を指定するには、k8s.aliyun.com/eci-spot-price-limit アノテーションを追加します。 |
k8s.aliyun.com/eci-use-specs アノテーションは、複数のインスタンスタイプをリストします。複数のタイプを指定することで、あるタイプの在庫が少ない場合でもプリエンプティブルインスタンスが作成される可能性が高まります。
ステップ 2: ジョブの作成
kubectl create -f spot_job.yamlステップ 3: Pod ステータスの監視
kubectl get podPod は次のステータスを遷移します。
実行中 — ジョブが進行中です。
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 Running 0 35s完了 — ジョブが正常に終了しました。
NAME READY STATUS RESTARTS AGE
pi-frmr8 0/1 Completed 0 2hBidFailed — ジョブが完了する前に Pod が解放されました。ジョブコントローラーは、続行するためにすでに新しい Pod (pi-kp5zx) を作成しています。
NAME READY STATUS RESTARTS AGE
pi-frmr8 1/1 BidFailed 0 4h53m
pi-kp5zx 1/1 Running 0 3h45mSpotToBeReleased イベントは、Pod が BidFailed 状態に入る約 5 分前に発行されます。このイベントを表示するには、kubectl get events を実行します。プリエンプティブルインスタンスのリリースイベントの処理に関する詳細については、「プリエンプティブルインスタンスのリリース」をご参照ください。
次のステップ
プリエンプティブルなエラスティックコンテナインスタンスを作成する — 高度な入札ポリシーおよびインスタンスタイプ選択戦略を設定します。