すべてのプロダクト
Search
ドキュメントセンター

Elastic Container Instance:プリエンティブル エラスティック コンテナ インスタンスの作成

最終更新日:Dec 28, 2024

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

はい

プリエンティブル インスタンスの入札ポリシーを指定します。有効な値:

  • SpotWithPriceLimit: インスタンスは、1 時間あたりの最大価格が設定されたプリエンティブル インスタンスとして作成されます。この入札ポリシーを使用する場合は、k8s.aliyun.com/eci-spot-price-limit アノテーションを追加して、1 時間あたりの最大価格を指定する必要があります。

  • SpotAsPriceGo: インスタンスは、購入時の市場価格が自動的に入札価格として使用されるプリエンティブル インスタンスとして作成されます。

    重要

    SpotStrategy を SpotAsPriceGo に設定し、指定されたゾーン内の指定されたインスタンス仕様のリソースが不足している場合、インスタンスの 1 時間あたりの最大価格に指定する値は、インスタンスの従量課金価格に近似している必要があります。これにより、インスタンス作成の成功率を向上させることができます。

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 入札ポリシーを使用する

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      labels:
        app: perl
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs : "ecs.c6.large"           # ECS インスタンス タイプを指定します。
        k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit"  # 入札ポリシーとして SpotWithPriceLimit を指定します。
        k8s.aliyun.com/eci-spot-price-limit: "0.25"            # プリエンティブル インスタンスの 1 時間あたりの最大価格を指定します。
    spec:
      containers:
      - name: pi
        image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

上記の YAML コードは、ecs.c6.large インスタンス タイプに基づいてプリエンティブル インスタンスを作成できます。

  • インスタンス タイプと 1 時間あたりの最大価格の要件を満たすインベントリ リソースが不足している場合、インスタンスを作成できません。

  • インスタンスが作成されると、1 時間インスタンスを使用することが保証されます。1 時間の保護期間が経過した後、市場価格が入札価格よりも高い場合、またはインスタンス仕様を満たすインベントリ リソースが不足している場合、プリエンティブル インスタンスは解放されます。

例 2: vCPU の数とメモリサイズを指定し、SpotAsPriceGo 入札ポリシーを使用する

  • pod.spec.resources を使用して vCPU の数とメモリサイズを指定する

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test
    spec:
      template:
        metadata:
          labels:
            app: perl
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"  # 入札ポリシーとして SpotAsPriceGo を指定します。インスタンスは、購入時の市場価格が自動的に入札価格として使用されるプリエンティブル インスタンスとして作成されます。
        spec:
          containers:
          - name: pi
            image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
            resources:
              limits:              # pi コンテナに 2 vCPU と 4 GiB のメモリを指定します。
                cpu: 2000m
                memory: 4096Mi
          restartPolicy: Never
  • アノテーションを使用して vCPU の数とメモリサイズを指定する

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test
    spec:
      template:
        metadata:
          labels:
            app: perl
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-use-specs : "2-4Gi"             # vCPU の数とメモリサイズを指定します。vCPU の数は 2 以上である必要があります。
            k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"  # 入札ポリシーとして SpotAsPriceGo を指定します。インスタンスは、購入時の市場価格が自動的に入札価格として使用されるプリエンティブル インスタンスとして作成されます。
        spec:
          containers:
          - name: pi
            image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never

上記の YAML コードは、2 vCPU と 4 GiB のメモリを持つプリエンティブル インスタンスを作成できます。

  • インスタンス仕様の要件を満たすインベントリ リソースが不足している場合、インスタンスを作成できません。

  • インスタンスが作成されると、1 時間インスタンスを使用することが保証されます。1 時間の保護期間が経過した後、市場価格が入札価格よりも高い場合、またはインスタンス仕様を満たすインベントリ リソースが不足している場合、プリエンティブル インスタンスは解放されます。

例 3: 保護期間を設定しない

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      labels:
        app: perl
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs : "2-4Gi"             # vCPU の数とメモリサイズを指定します。vCPU の数は 2 以上である必要があります。
        k8s.aliyun.com/eci-spot-strategy: "SpotAsPriceGo"  # 入札ポリシーとして SpotAsPriceGo を指定します。インスタンスは、購入時の市場価格が自動的に入札価格として使用されるプリエンティブル インスタンスとして作成されます。
        k8s.aliyun.com/eci-spot-duration: "0"              # 保護期間を設定しません。
    spec:
      containers:
      - name: pi
        image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

上記の YAML コードは、2 vCPU と 4 GiB のメモリを持つプリエンティブル インスタンスを作成できます。

  • インスタンス仕様の要件を満たすインベントリ リソースが不足している場合、インスタンスを作成できません。

  • インスタンスが作成されても、インスタンスを使用できる保証はありません。市場価格が入札価格よりも高い場合、またはインスタンス仕様を満たすインベントリ リソースが不足している場合、プリエンティブル インスタンスは解放されます。

例 4: インスタンス仕様の要件を満たすインベントリ リソースが不足している場合に、従量課金制インスタンスを自動的に作成する

apiVersion: batch/v1
kind: Job
metadata:
  name: test
spec:
  template:
    metadata:
      labels:
        app: perl
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-use-specs : "ecs.c6.large"           # ECS インスタンス タイプを指定します。
        k8s.aliyun.com/eci-spot-strategy: "SpotWithPriceLimit"  # 入札ポリシーとして SpotWithPriceLimit を指定します。
        k8s.aliyun.com/eci-spot-price-limit: "0.05"            # プリエンティブル インスタンスの 1 時間あたりの最大価格を指定します。
        k8s.aliyun.com/eci-spot-fallback: "true"                # プリエンティブル インスタンス仕様の要件を満たすインベントリ リソースが不足している場合に、従量課金制インスタンスを自動的に作成します。
    spec:
      containers:
      - name: pi
        image: registry.cn-shanghai.aliyuncs.com/eci_open/perl:5
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

上記の YAML コードは、ecs.c6.large インスタンス タイプに基づいてプリエンティブル インスタンスを作成できます。

  • インスタンス タイプと 1 時間あたりの最大価格の要件を満たすインベントリ リソースが十分な場合、プリエンティブル インスタンスが作成されます。インスタンスが作成されると、1 時間インスタンスを使用することが保証されます。1 時間の保護期間が経過した後、市場価格が入札価格よりも高い場合、またはインスタンス仕様を満たすインベントリ リソースが不足している場合、プリエンティブル インスタンスは解放されます。

  • インスタンス タイプと 1 時間あたりの最大価格の要件を満たすインベントリ リソースが不足している場合、従量課金制インスタンスが作成されます。インスタンスが作成されると、システムはインスタンスを自動的に解放しません。

    インスタンスが作成された後、kubectl describe pod コマンドを実行して、対応する Pod のイベントを表示し、インスタンスが従量課金制インスタンスであるかどうかを確認できます。SpotDegraded イベントが表示された場合、インスタンスは従量課金制インスタンスです。

    spot转按量事件..png

プリエンティブル インスタンスの解放

プリエンティブル インスタンスが作成されると、保護期間中は正常に実行できます。保護期間が過ぎると、市場価格が入札価格よりも高い場合、またはインベントリ リソースが不足している場合、プリエンティブル インスタンスは解放されます。以下の操作を実行することで、プリエンティブル インスタンスの解放ステータスを理解できます。

  • 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 minutes
    • kukubectl 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          3h5m
    • kubectl 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 操作を実行することと似ています。グレースフル終了の手順:

  1. API 呼び出しを行う

    仮想ノードが SpotToBeReleased イベントに関する通知を受信すると、ノードは Eviction API を呼び出します。

  2. PDB を確認する

    API サーバーは、エビクトされる Pod に構成されている PDB を確認します。

  3. プリエンティブル インスタンスをエビクトする

    API サーバーがエビクション リクエストを検証した後、Pod は以下の手順でエビクトされます。

    1. Pod は削除タイムスタンプを更新するため、API サーバーは終了する Pod を認識できます。Pod には、構成した猶予期間もスタンプされます。

    2. Pod が実行されている仮想ノードの kubelet は Pod を認識し、Pod のグレースフル終了を開始します。

    3. kubelet が Pod を終了すると、クラスタの制御プレーンは Pod を関連する Endpoints と Endpointslices から切り離します。この場合、Pod コントローラは Pod を有効として認識しなくなります。

    4. 猶予期間が終了すると、kubelet は Pod を強制終了します。

    5. kubelet は API サーバーに Pod を削除するように通知します。

    6. API サーバーは Pod を削除します。

  4. ワークロードを調整する

    Pod が、ReplicaSet や StatefulSet などのコントローラ、またはフォールトトレランス設定が構成されている Job、SparkApplication、ワークフローによって管理されている場合、コントローラは元の Pod がエビクトされた後に新しい Pod を自動的に作成します。

説明

Pod で使用されている PDB が正しく構成されていない場合、またはノードが Eviction API を呼び出したときに多数の Pod が Ready 状態ではない場合、エビクション プロセスは停止します。プリエンティブル インスタンスの期限が切れるまでにエビクション プロセスが完了しない場合、インスタンスは直接解放されます。