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

Container Service for Kubernetes:プリエンプティブルインスタンスベースのノードプールのベストプラクティス

最終更新日:Dec 10, 2024

プリエンプティブルインスタンスはオンデマンドインスタンスの一種であり、従量課金インスタンスと比較して割引されます。 ノードプール内のプリエンプティブルインスタンスと従量課金インスタンスの比率を指定できます。 これは、ノードプールのリソースコストを削減するのに役立ちます。 このトピックでは、プリエンプティブルインスタンスベースのノードプールと使用シナリオについて説明します。 このトピックでは、プリエンプティブルインスタンスベースのノードプールのインスタンスタイプの設定方法、ノードプール内のプリエンプティブルインスタンスと従量課金インスタンスの比率の指定方法、プリエンプティブルインスタンスの有効期限が近づいているかどうか、プリエンプティブルインスタンスのシャットダウン方法についても説明します。

背景情報

プリエンプティブルインスタンスは、従量課金方式を使用します。 プリエンプティブルインスタンスの支払いは使用後です。 請求額は、市場価格と請求期間に基づいて計算されます。 詳細は、「プリエンプティブルインスタンス」をご参照ください。

はじめに

プリエンプティブルインスタンスベースのノードプールは、プリエンプティブルインスタンスと従量課金インスタンスで構成されます。 プリエンプティブインスタンスベースのノードプールで、プリエンプティブインスタンスと従量課金インスタンスの比率を指定する必要があります。

プリエンプティブルインスタンスは、リソースストックなどの要因に基づいて価格が動的に変動する従量課金インスタンスです。 したがって、プリエンプティブルインスタンスの価格は、従量課金インスタンスの価格よりも最大90% 低くなる可能性があります。 プリエンプティブルインスタンスの市場価格は、インスタンスタイプの需要と供給の変化に基づいて変動します。 プリエンプティブルインスタンスを作成するときは、指定されたインスタンスタイプに入札する入札モードを選択する必要があります。 入札価格が市場価格より高く、インスタンスタイプの在庫が十分である場合、プリエンプティブルインスタンスが作成されます。

プリエンプティブルインスタンスが作成された後、従量課金インスタンスを使用するのと同じ方法でプリエンプティブルインスタンスを使用できます。 プリエンプティブルインスタンスは、クラウドディスクやelastic IPアドレス (EIP) などの他のクラウドリソースと一緒に使用することもできます。 プリエンプティブルインスタンスのデフォルトの保護期間は1時間です。 保護期間が終了すると、システムは5分ごとにインスタンスタイプの市場価格とリソースストックをチェックします。 市場価格が入札価格よりも高い場合、またはインスタンスタイプの在庫が不足している場合、プリエンプティブルインスタンスがリリースされます。

シナリオ

  • プリエンプティブルインスタンスベースのノードプール

    プリエンプティブルインスタンスベースのノードプール内のプリエンプティブルインスタンスが予期せず再要求される可能性があります。 したがって、プリエンプティブルインスタンスベースのノードプールは、耐障害性の高いステートレスアプリケーションに適しています。 プリエンプティブルインスタンスベースのノードプールは、バッチ処理を使用するワークロード、機械学習トレーニングジョブ、キューに入れられたトランザクション処理アプリケーション、REST APIを使用するアプリケーション、およびApache Sparkジョブなどのビッグデータコンピューティングの抽出、変換、ロード (ETL) ワークロードに使用できます。

    プリエンプティブルインスタンスベースのノードプールにワークロードをデプロイする場合は、ワークロードがノードリソースが利用できないことに対して耐性があることを確認する必要があります。 ワークロードがノードリソースの利用不能に耐えられない場合は、従量課金インスタンスまたはサブスクリプションインスタンスで構成されるノードプールにワークロードをデプロイすることを推奨します。 ノードリソースが利用できないことを許容しないワークロードには、次のタイプがありますが、これらに限定されません。

    • モニタリングツールやO&Mツールなどのクラスター管理ツール。

    • データベースサービスなどの状態のワークロードまたはアプリケーション。

  • 自動スケーリングが有効になっているプリエンプティブルインスタンスベースのノードプール

    ワークロードがプリエンプティブルインスタンスベースのノードプールにデプロイされ、特定のパターンで変動するユーザートラフィックを処理する場合は、ワークロードがデプロイされているプリエンプティブルインスタンスベースのノードプールの自動スケーリングを有効にすることをお勧めします。

    自動スケーリングを有効にすると、自動スケーリングコンポーネントは、より多くのポッドをホストするためにノードプールをスケールアウトする必要があるかどうかを自動的にチェックし、スケールインしきい値に達するとノードプールを自動的にスケールインします。 自動スケーリングが有効になっているプリエンプティブルインスタンスベースのノードプールは、自動スケーリングが無効になっているプリエンプティブルインスタンスベースのノードプールよりも高速にスケールアウトできます。 プリエンプティブルインスタンスベースのノードプールの自動スケーリングを有効にすると、アイドルリソースはより迅速にリリースされます。 スケールアウトの高速化により、プリエンプティブルインスタンスの再利用時に十分なノードリソースを確保できます。 アイドルリソースの自動解放は、リソースコストの削減に役立ちます。

プリエンプティブルインスタンスのインスタンスタイプの選択

ビジネス要件に基づいてインスタンスタイプを選択し、インスタンスリソースストック、リソースコスト、インスタンスパフォーマンスのバランスを取ることを推奨します。 Elastic Compute Service (ECS) は、さまざまなワークロードの要件を満たすために、さまざまなインスタンスタイプを提供します。 プリエンプティブルインスタンスベースのノードプールを使用する場合、プリエンプティブルインスタンスが再利用されたときにワークロードに与える影響が最小限であるインスタンスタイプの組み合わせを選択する必要があります。

次のいずれかの方法を使用して、インスタンスタイプを選択できます。

  • ACKコンソールの使用

    Container Service for Kubernetes (ACK) コンソールでインスタンスタイプを選択すると、選択したインスタンスタイプに関する提案が自動的にページに表示されます。 ACKコンソールでノードプールを作成または変更すると、選択したリージョンで使用可能なインスタンスタイプがページに表示されます。 ビジネス要件に基づいてインスタンスタイプを選択できます。 インスタンスタイプを選択すると、ACKコンソールは選択したインスタンスタイプに関する提案を自動的に提供し、ノードプールのスケーラビリティと各プリエンプティブルインスタンスの価格範囲を表示します。 インスタンスタイプを変更し、情報に基づいて料金の上限を指定できます。 ノードプールを作成または変更する方法の詳細については、「手順」をご参照ください。 Preemptible instance.png

  • spot-instance-advisorコマンドラインツールの使用

    spot-instance-advisorは、ACKが提供するオープンソースのコマンドラインツールです。 spot-instance-advisorを使用して、プリエンプティブルインスタンスの過去の価格と現在の価格を照会できます。 spot-instance-advisorはAPI操作を呼び出して、リージョン内のインスタンスタイプの過去の価格を取得します。 spot-instance-advisorは、取得した統計に基づいて1時間あたりのvCPU単価を計算し、1時間あたりのvCPU単価が最も低いインスタンスタイプをリストします。 spot-instance-advisorは、各インスタンスタイプの1時間あたりのvCPU単価のエントロピーも計算します。 エントロピーの値が高いほど、価格の頻繁な変動を示します。 1時間あたりのvCPU単価のエントロピー値が低いインスタンスタイプを選択することを推奨します。

    説明

    spot-instance-advisorをダウンロードします。 詳細については、「spot-instance-advisor」をご参照ください。

    spot-instance-advisorは、次のパラメーターをサポートしています。

    の使用法。/spot-instance-advisor:
      -accessKeyId文字列
            クラウドアカウントのaccessKeyId
      -accessKeySecret文字列
            クラウドアカウントのaccessKeySecret
      -カットオフint
            スポットインスタンス価格の割引 (デフォルト2)
      -ファミリー文字列
            必要なスポットインスタンスファミリー (ecs.n1、ecs.n2など)
      -intの制限
            スポットインスタンスの制限 (デフォルト20)
      -maxcpu int
            スポットインスタンスの最大コア (デフォルト32)
      -maxmem int
            スポットインスタンスの最大メモリ (デフォルト64)
      -mincpu int
            スポットインスタンスの最小コア (デフォルト1)
      -minmem int
            スポットインスタンスの最小メモリ (デフォルト2)
      -region文字列
            スポットインスタンスのリージョン (デフォルトは「cn-hangzhou」)
      -解像度int
            価格履歴分析のウィンドウ (デフォルト7) 

    次のコマンドを実行して、現在のリージョンのインスタンスタイプの料金を照会します。

    . /spot-instance-advisor -- accessKeyId=<id> -- accessKeySecret=<secret> -- region=<cn-zhangjiakou>
    説明

    accessKeyIdaccessKeySecret、およびregionパラメーターが必要です。 パラメータを実際の値に設定します。

    期待される出力:

    619種類のinstanceTypesでキャッシュを初期化する
    98種類のinstanceTypesのフィルタ93。
    93種類のInstanceTypes価格を正常に取得します。
    199種類のinstanceTypesの比較に成功
          InstanceTypeId ZoneId価格 (コア) 割引率
            ecs.c6.large cn-zhangjiakou-c 0.0135 1.0 0.0
            ecs.c6.large cn-zhangjiakou-a 0.0135 1.0 0.0
          ecs.c6.2xlarge cn-zhangjiakou-a 0.0136 1.0 0.0
          ecs.c6.2xlarge cn-zhangjiakou-c 0.0136 1.0 0.0
          ecs.c6.3xlarge cn-zhangjiakou-a 0.0137 1.0 0.0
          ecs.c6.3xlarge cn-zhangjiakou-c 0.0137 1.0 0.0
           ecs.c6.xlarge cn-zhangjiakou-c 0.0138 1.0 0.0
           ecs.c6.xlarge cn-zhangjiakou-a 0.0138 1.0 0.0
         ecs.hfc6.xlarge cn-zhangjiakou-a 0.0158 1.0 0.0
          ecs.hfc6.large cn-zhangjiakou-a 0.0160 1.0 0.0
          ecs.hfc6.large cn-zhangjiakou-c 0.0160 1.0 0.0
          ecs.g6.3xlarge cn-zhangjiakou-a 0.0175 1.0 0.0
          ecs.g6.3xlarge cn-zhangjiakou-c 0.0175 1.0 0.0
            ecs.g6.large cn-zhangjiakou-a 0.0175 1.0 0.0
           ecs.g6.xlarge cn-zhangjiakou-a 0.0175 1.0 0.0
          ecs.g6.2xlarge cn-zhangjiakou-a 0.0175 1.0 1.0
          ecs.g6.2xlarge cn-zhangjiakou-c 0.0175 1.0 3.0
            ecs.g6.large cn-zhangjiakou-c 0.0175 1.0 30.8
           ecs.g6.xlarge cn-zhangjiakou-c 0.0175 1.0 9.7
          ecs.hfg6.large cn-zhangjiakou-c 0.0195 1.0 0.2 

    出力のトップランクのインスタンスタイプでは、1時間あたりのvCPU単価と価格エントロピーの値が低くなります。 ratio列の値は、価格エントロピーの値を示します。 トップランクのインスタンスタイプ以外のインスタンスタイプは、90% 割引を提供しますが、価格エントロピーの値が高くなります。 インスタンスタイプを選択するときは、価格が低く、価格エントロピーの値が低いトップランクのインスタンスタイプを選択することを推奨します。

プリエンプティブルインスタンスと従量課金インスタンスの比率を設定する

ノードプール内のプリエンプティブルインスタンスと従量課金インスタンスの比率を設定できます。 これにより、ノードプールに十分な従量課金インスタンスが含まれている場合に、プリエンプティブルインスタンスの数を制御することでコストを削減できます。

重要

最初にACKクラスターを作成する必要があります。Kubernetesバージョンのクラスターは1.9以降です。 クラスターのKubernetesバージョンが1.9以前の場合は、クラスターのKubernetesバージョンを更新する必要があります。 詳細は、「ACKクラスターのKubernetesバージョンの更新」をご参照ください。

  • クラスターに十分なノードクォータがあることを確認してください。 ノードクォータを増やしたい場合は、アプリケーションを送信します。 詳細については、「制限事項」をご参照ください。

  • 既存のElastic Compute Service (ECS) インスタンスをノードプールに追加する場合、ECSインスタンスがelastic IPアドレス (EIP) に関連付けられているか、ECSインスタンスが存在する仮想プライベートクラウド (VPC) に対してNATゲートウェイが設定されていることを確認します。 ECS インスタンスがインターネットにアクセスできることを確認します。 それ以外の場合、ECSインスタンスをクラスターに追加できません。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  3. [ノードプール] ページの右上隅にある [ノードプールの作成] をクリックします。

  4. [ノードプールの作成] ダイアログボックスで、vSwitchに複数のvSwitchを選択し、[課金方法][プリエンプティブルインスタンス] を選択します。

    他のノードプールパラメーターの詳細については、「手順」をご参照ください。

  5. [詳細オプションの表示] をクリックします。 [スケーリングポリシー][コスト最適化] を選択し、ビジネス要件に基づいて、[従量課金インスタンスの割合] および [従量課金インスタンスの追加の有効化] パラメーターを設定します。

    Scaling policy.png

    パラメーター

    説明

    スケーリングポリシー

    • 優先度: 指定したvSwitchの優先度に基づいてノードプールをスケーリングします。 Auto ScalingがvSwitchのゾーンで最も優先度の高いECSインスタンスの作成に失敗した場合、Auto ScalingはvSwitchのゾーンでより優先度の低いECSインスタンスの作成を試みます。

    • コスト最適化: vCPU単価の昇順に基づいてECSインスタンスを作成します。 システムは、好ましくは、複数のインスタンスタイプが指定される場合にプリエンプティブルインスタンスを作成する。 プリエンプティブルインスタンスの在庫切れなどの理由でAuto Scalingがプリエンプティブルインスタンスの作成に失敗した場合、Auto Scalingは従量課金ECSインスタンスの作成を試みます。 スケーリングポリシーをコスト最適化に設定すると、次のパラメーターを設定できます。

      • 従量課金インスタンスの割合: ノードプール内の従量課金インスタンスの割合を指定します。 有効値: 0~100。

      • 補足プリエンプティブルインスタンスの有効化: この機能を有効にすると、システムが既存のプリエンプティブルインスタンスを再利用する5分前に、同じ数のプリエンプティブルインスタンスが自動的に作成されます。 プリエンプティブルインスタンスを再利用する5分前に、システムはAuto Scalingに通知を送信します。

      • 追加の従量課金インスタンスの有効化: この機能を有効にすると、Auto Scalingは、単価が高すぎる、またはプリエンプティブルインスタンスが在庫切れなどの理由でプリエンプティブルインスタンスの作成に失敗した場合、スケーリング要件を満たす従量課金ECSインスタンスの作成を試みます。

    • 分散分散: スケーリンググループに指定されているvSwitchのゾーン全体にECSインスタンスを均等に分散します。 ECSリソースの在庫切れなどの理由により、ゾーン間でのECSインスタンスの分散のバランスが取れていない場合、このポリシーを選択して、ゾーン間でECSインスタンスを均等に分散できます。

      説明

      このポリシーは、VPCで複数のvSwitchを指定した場合にのみ有効になります。

    説明

    [注文の確認] をクリックした後、次の項目に注意してください。

    • スケーリングポリシーの値は変更できません。

    • スケーリングポリシー[コスト最適化] を選択した場合、[従量課金インスタンスの割合] および [従量課金インスタンスの有効化] の値を変更できます。

  6. [注文の確認] をクリックします。

ノードプールを作成したら、[ノードプール] ページでノードプールを見つけ、[操作] 列の [詳細] をクリックします。 次に、[概要] タブをクリックします。 [ノード設定] では、ノードプール内のpat-as-you-goインスタンスの割合を表示できます。

プリエンプティブルインスタンスの有効期限が近づいているかどうかを確認する

プリエンプティブルインスタンスの予期しない有効期限とリリースを回避するために、ACKは、プリエンプティブルインスタンスがリリースされようとしているときに通知を送信するためのack-node-problem-detectorコンポーネントを提供します。

説明

最初にACKクラスターを作成し、最新バージョンのack-node-problem-detectorをクラスターにインストールする必要があります。 詳細は、「ACK管理クラスターの作成」をご参照ください。

  • 新しいクラスターを作成する場合は、[ノード問題検出器のインストール] と [イベントセンターの作成] が選択されていることを確認します。

  • 既存のクラスターを使用する場合は、ack-node-problem-detectorの最新バージョンがインストールされていることを確認してください。 詳細は、「システムコンポーネントの管理」をご参照ください。

ACKクラスターでは、ECSインスタンスはクラスター内のサービスをホストするノードとして使用されます。 クラスターにECSインスタンスを作成するときに課金方法としてプリエンプティブルインスタンスまたはサブスクリプションを指定した場合、インスタンスは指定された有効期限に自動的にリリースされます。 インスタンスが自動的にリリースされるときに、ポッドの削除、ノードのドレイン、またはノードの置き換えが事前に完了していない場合、インスタンスで実行されるサービスが中断される可能性があります。 マスターノードのインスタンスがリリースされると、クラスターレベルの例外が発生する可能性があります。 プリエンプティブルインスタンスの自動リリースによるこのような問題を防ぐために、ACKは、プリエンプティブルインスタンスがリリースされようとしているときに、ack-node-problem-detectorを使用して通知を送信します。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[ノード] > [ノード] を選択します。

  3. [ノード] ページで、確認するノードを見つけてノード名をクリックするか、[操作] 列の [詳細] > [詳細] を選択します。

  4. ノードの詳細ページで、InstanceExpired条件のステータスを確認します。

    [ステータス] セクションで、InstanceExpired条件のステータスを確認します。 Whether the instance is about to expire

    InstanceExpired条件の状態を次の表に示します。

    InstanceExpiredの状態

    説明

    InstanceExpired条件がTrue状態で、contentInstanceToBeTerminatedの場合、プリエンプティブインスタンスの有効期限が切れてリリースされることを示します。

    InstanceExpired条件がFalse状態で、contentInstanceNotToBeTerminatedの場合、プリエンプティブインスタンスの有効期限が切れていないことを示します。

    不明

    この状態は、ack-node-problem-detectorでエラーが発生したことを示します。 チケットを起票ソリューションの

    InstanceExpired状態がTrueの場合、次の図に示すように、[イベント] セクションにイベントが生成されます。 Instance expiry event

InstanceExpired状態がTrueの場合、プリエンプティブルインスタンスの有効期限が切れてリリースされることを示します。 このノードで実行されるアプリケーションが中断されないようにするには、アプリケーションを他のノードにスケジュールします。 詳細については、「特定のノードへのポッドのスケジュール」をご参照ください。

プリエンプティブルインスタンスの優雅なシャットダウン

プリエンプティブルインスタンスのグレースフルシャットダウンには、モニタリングと通知、プリエンプティブルインスタンスが再要求される前のプリエンプティブルインスタンスの補足、リリースされるノードでのカスタム操作などのプロセスが含まれます。

  • モニタリングと通知

    ACKは、Node Problem Detector (NPD) を使用してプリエンプティブルインスタンスのステータスを監視し、プリエンプティブルインスタンスの有効期限が近づいたときに通知を送信します。

    • プリエンプティブルインスタンスの有効期限が切れていない場合、InstanceExpiredの値はFalseです。 Status of preemptible instances.png

    • プリエンプティブルインスタンスの有効期限が近づいている場合、InstanceExpiredの値はTrueです。 この場合、ACKはクラスターイベントを生成し、プリエンプティブルインスタンスの有効期限が近づいていることを通知します。 Release preemptible instances.png

  • プリエンプティブルインスタンスが再利用される前のプリエンプティブルインスタンスの補足

    プリエンプティブルインスタンスの有効期限が切れてリリースされると、インスタンスにデプロイされているサービスは一時停止されます。 ACKには、プリエンプティブルインスタンスの有効期限とリリースに早期に対応するためのさまざまな方法が用意されています。 プリエンプティブルインスタンスの自動スケーリングの設定、プリエンプティブルインスタンスのステータスの監視、プリエンプティブルインスタンスの有効期限が近づいたときに通知を送信するようにシステムを設定できます。 ただし、これらのメソッドは、プリエンプティブルインスタンスが再要求された後に実装されます。 クラスターで使用可能なリソースは、新しいインスタンスがクラスターに追加されるまで増加しません。 この問題を解決するために、ACKはプリエンプティブルインスタンスを再利用する前に補足します。 この機能により、ACKは既存のプリエンプティブインスタンスが期限切れになる前に新しいプリエンプティブインスタンスを作成できます。

    この機能を有効にすると、プリエンプティブルインスタンスの有効期限が近づいているかどうかがACKによって自動的にチェックされます。 プリエンプティブルインスタンスの有効期限が近づいている場合、ACKは自動的にスケールアウトアクティビティをトリガーして新しいプリエンプティブルインスタンスを追加します。 新しく作成されたインスタンスは、補足インスタンスと呼ばれます。 補足インスタンスの実行が開始されると、プリエンプティブルインスタンスのリリースプロセスが開始されます。 プリエンプティブルインスタンスのステータスがunschedulableに設定されています。 次に、プリエンプティブルインスタンスがドレインされ、削除されます。 これにより、プリエンプティブルインスタンスのワークロードがクラスター内の他のノードにスムーズに移行され、サービスの中断が回避されます。

    説明

    プリエンプティブルインスタンスの補完は、期限切れになりそうなプリエンプティブルインスタンスの再利用を中断しません。 プリエンプティブルインスタンスは、補足インスタンスが作成されているかどうかに関係なく、インスタンスの有効期限が近づいていることをACKが通知してから5分後に再利用されます。

    Supplementation of preemptible instances.png

  • リリースするノードのカスタム操作

    ノードを正常にシャットダウンした場合、DNSレコードからノード情報を削除するなど、ノードに対して他の操作を実行する必要がある場合があります。 リリースするノードでカスタム操作を実行するには、ノードステータスのInstanceExpiredフィールドの値を監視するか、InstanceToBeTerminatedイベントをリッスンするようにリスナーを設定することをお勧めします。 プリエンプティブルインスタンスの有効期限が近づいている、またはリリースされるという通知を受け取った場合は、インスタンスに対してグレースフルシャットダウンを実行してから、インスタンスに対してカスタム操作を実行できます。 プリエンプティブルインスタンスの有効期限が近づいているかどうかを確認する方法の詳細については、「プリエンプティブルインスタンスの有効期限が近づいているかどうかの確認」をご参照ください。