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

Elastic Container Instance:スポットインスタンスの作成

最終更新日:Jun 22, 2026

Elastic Container Instance (ECI) はスポットインスタンスをサポートしています。スポットインスタンスは、有効期間の短いジョブや、高いスケーラビリティとフォールトトレランスを持つ特定のステートレスアプリケーションに使用することで、インスタンスのコストを削減できます。このトピックでは、Kubernetes クラスターでスポット ECI Pod を作成する方法について説明します。

背景情報

プリエンプティブルインスタンスは、低コストの入札ベースのコンピューティングリソースです。Alibaba Cloud 上のアイドルリソースに入札して、コンテナを実行できます。入札価格が現在の市場価格を下回った場合、またはリソースインベントリが不足した場合、これらのリソースは回収されます。

プリエンプティブルインスタンスは、実行時間の短いジョブや、弾性的にスケーラブルな Web サービス、画像レンダリング、ビッグデータ分析、大規模な並列計算など、スケーラビリティとフォールトトレランスに優れたステートレスアプリケーションに適しています。アプリケーションが分散型、スケーラブル、かつフォールトトレラントであるほど、プリエンプティブルインスタンスを使用することでコストを節約し、スループットを向上させることができます。詳細については、「プリエンプティブルインスタンスとは」をご参照ください。

基本概念

プリエンプティブルインスタンスを作成する前に、次の概念を理解してください:

  • 課金方法

    プリエンプティブルインスタンスの市場価格は、需要と供給に応じて変動します。プリエンプティブルインスタンスを作成する際には、入札ポリシーを指定する必要があります。指定したインスタンスタイプに対して入札価格がリアルタイムの市場価格より高く、かつ在庫が十分な場合、インスタンスは正常に作成されます。作成後、インスタンスは保護期間中 (デフォルトで 1 時間)、購入時の市場価格で課金されます。保護期間が終了すると、インスタンスはリアルタイムの市場価格で課金されます。

    説明

    プリエンプティブルインスタンスは、従量課金インスタンスと比較して割引価格で提供されます。実際の価格は需要と供給に基づいて変動し、実際の使用時間に対して課金されます。詳細については、「プリエンプティブルインスタンスの課金」をご参照ください。

  • 回収メカニズム

    保護期間が終了すると、システムは 5 分ごとにインスタンスタイプの市場価格と在庫を自動的にチェックします。いずれかの時点で市場価格が入札価格を上回った場合、またはインスタンスタイプの在庫が不足した場合、システムはプリエンプティブルインスタンスをリリースします。

    説明
    • システムがリソースを回収する約 3 分前に、インスタンスがまもなくリリースされることを示すイベントが生成されます。

    • システムがリソースを回収すると、インスタンスの課金は停止します。インスタンス情報は保持され、ステータスは「期限切れ」に変わります。

注意事項

プリエンプティブルインスタンスを使用する際は、次の点にご注意ください:

  • 適切なインスタンスタイプを選択し、合理的な入札価格を設定します。

    ECS の OpenAPI オペレーションを呼び出して、過去 30 日間のプリエンプティブルインスタンスに関する情報をクエリすることで、インスタンスタイプの選択と入札価格の設定に役立てることができます。関連するオペレーションは次のとおりです:

    重要

    市場価格の変動を考慮し、ビジネスのコスト期待値に沿った十分な高さの入札価格を設定してください。これにより、プリエンプティブルインスタンスの作成成功率が高まり、価格変動によるリリースを防ぎ、コストを節約しながらビジネス要件を満たすことができます。

  • 重要なデータは、クラウドディスク (インスタンスとともにリリースするオプションを無効にする) や 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

はい

スポットインスタンスの入札戦略。有効な値は次のとおりです:

  • SpotWithPriceLimit:スポットインスタンスの時間単位の最高価格を設定します。この戦略を使用する場合は、k8s.aliyun.com/eci-spot-price-limit アノテーションを使用して価格上限も指定する必要があります。

  • SpotAsPriceGo:システムが現在の市場価格で自動的に入札します。

    重要

    SpotAsPriceGo ポリシーを使用し、選択したゾーンで指定されたインスタンスタイプのリソースが不足している場合、価格は標準の従量課金価格まで上昇する可能性があります。

k8s.aliyun.com/eci-spot-price-limit

"0.5"

いいえ

スポットインスタンスの時間単位の最高価格。小数点以下 3 桁まで指定できます。

このアノテーションは、k8s.aliyun.com/eci-spot-strategySpotWithPriceLimit に設定されている場合にのみ有効です。

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 を使用

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"  # カスタム価格上限付きの入札戦略を使用します。
        k8s.aliyun.com/eci-spot-price-limit: "0.25"            # 時間単位の最高価格を設定します。
    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 時間の保護期間が終了すると、市場価格が入札価格を上回るか、インスタンスタイプの在庫が不足した場合、スポットインスタンスは回収されます。

例 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"  # リアルタイムの市場価格に従う、システムの自動入札を使用します。
        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 とメモリを指定します。2 vCPU 以上のインスタンスがサポートされています。
            k8s.aliyun.com/eci-spot-strategy: "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 とメモリを指定します。2 vCPU 以上のインスタンスがサポートされています。
        k8s.aliyun.com/eci-spot-strategy: "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"  # カスタム価格上限付きの入札戦略を使用します。
        k8s.aliyun.com/eci-spot-price-limit: "0.05"            # 時間単位の最高価格を設定します。
        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 時間の保護期間が終了すると、市場価格が入札価格を上回るか、インスタンスタイプの在庫が不足した場合、スポットインスタンスは回収されます。

  • 作成時に、インスタンスタイプと価格上限の要件を満たす在庫がない場合、従量課金インスタンスが作成されます。作成後、システムはインスタンスを自動的に回収しません。

    インスタンス作成後、kubectl describe pod コマンドを実行して Pod のイベントを確認し、従量課金インスタンスにフォールバックしたかどうかを確認できます。SpotDegraded イベントは、インスタンスが従量課金インスタンスにフォールバックしたことを示します。

    Events:
      Type     Reason                  Age   From               Message
      ----     ------                  ---   ----               -------
      Warning  MissingClusterDNS       32m   virtual-kubelet    pod: "default/test4-dbrw6(3ef7c65d-3908-40e3-ab1f-39ff9562a36b)". virtual-kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to "Default" policy.
      Warning  SpotDegraded            32m   EciService         [eci.containergroup]Spot[SpotStrategy:SpotWithPriceLimit,SpotPriceLimit:0.001,SpotDuration:1] will be degraded because the specified instance is out of stock
      Normal   SuccessfulHitImageCache 32m   EciService         [eci.imagecache]Successfully hit image cache imc-2ze7udxttnd(xxx), eci will be scheduled with this image cache.
      Normal   Pulled                  32m   kubelet            Container image "registry-vpc.cn-beijing.aliyuncs.com/eci_open/perl:5" already present on machine
      Normal   Created                 32m   kubelet            Created container pi
      Normal   Started                 32m   kubelet            Started container pi

回収の詳細

スポットインスタンスは作成後、保護期間中は正常に実行されます。保護期間が終了すると、市場価格が入札価格を上回るか、リソースの在庫が不足した場合にスポットインスタンスは回収されます。このセクションでは、スポットインスタンスの回収に関連するイベントと 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 操作を実行するのと同様です。プロセスは次のとおりです:

  1. API リクエスト

    仮想ノードは SpotToBeReleased イベントを受信し、Eviction API を呼び出します。

  2. PDB チェック

    API サーバーは、ターゲット Pod に関連付けられた PodDisruptionBudget を検証します。

  3. エビクションの実行

    API サーバーがエビクションを許可した場合、Pod は次のように削除されます:

    1. API サーバー内の Pod リソースは削除タイムスタンプで更新され、その後 API サーバーは Pod を終了中と見なします。Pod リソースには、設定された猶予期間もマークされます。

    2. Pod が実行されているノード上の kubelet は、Pod リソースが終了対象としてマークされていることに気づき、ローカル Pod のグレースフルシャットダウンを開始します。

    3. kubelet が Pod をシャットダウンしている間、コントロールプレーンは Pod を Endpoint および EndpointSlice オブジェクトから削除します。その結果、コントローラーは Pod を有効なオブジェクトとは見なさなくなります。

    4. Pod の猶予期間が終了すると、kubelet はローカル Pod を強制的に終了させます。

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

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

  4. ワークロードの調整

    ターゲット Pod がコントローラー (ReplicaSet、StatefulSet、またはフォールトトレラントなジョブ、sparkApplication、Workflow など) によって管理されている場合、コントローラーは通常、エビクションされた Pod を置き換えるために新しい Pod を作成します。

説明

PodDisruptionBudget が誤って設定されている場合、または Eviction API が呼び出されたときに Ready 状態でない Pod が多数ある場合、エビクションプロセスがブロックされる可能性があります。エビクションがスポットインスタンスの有効期限が切れる前に完了しない場合、インスタンスは即座に回収されます。