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

Container Service for Kubernetes:仮想ノードとしてデプロイされたelasticコンテナインスタンスにポッドをスケジュールする

最終更新日:Oct 29, 2024

Container Service for Kubernetes (ACK) クラスターを使用する場合、短時間で多数のポッドを起動する必要があります。 ポッドのElastic Compute Service (ECS) インスタンスを作成する場合、作成プロセスに時間がかかります。 ECSインスタンスの予約を選択した場合、ポッドの作成前と終了後にインスタンスはアイドル状態になり、リソースが無駄になります。 この問題に対処するには、仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドをスケジュールすることを推奨します。 これにより、ECSインスタンスを購入または管理する必要がなくなります。 このトピックでは、ACKマネージドクラスターまたはACK専用クラスターに仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドをスケジュールする方法について説明します。

ACKクラスターでのエラスティックコンテナインスタンスの実行方法

Elastic Container Instanceは、コンテナー化のためにAlibaba Cloudによって提供されるサーバーレスコンピューティングサービスです。 elasticコンテナインスタンスを使用すると、コンテナのO&Mフリーおよび分離されたランタイム環境を効率的に設定できます。 Elasticコンテナインスタンスを使用すると、Elastic Compute Service (ECS) インスタンスを購入または管理することなく、コンテナ化されたアプリケーションに集中できます。 これにより、インフラストラクチャのメンテナンスが不要になります。 オンデマンドでelasticコンテナインスタンスを作成できます。 リソースの使用量は1秒ごとに課金されます。

ほとんどの場合、ACKクラスタは、少なくとも1つのノードプールを有する。 ポッドを作成すると、ACKはポッドをノードプール内のECSインスタンスにスケジュールします。 このスケジューリングモードは、安定したトラフィック量を受信するアプリケーションに適しています。 ただし、ACKがECSインスタンスをスケールアウトできる場合でも、このスケジューリングモードではトラフィックスパイクを処理できません。 これは、ECSインスタンスの作成と起動に時間がかかるためです。 この場合、仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドをスケジュールすることを推奨します。 これにより、新しいノードを追加する必要がなくなり、リソースの無駄がなくなり、コンピューティングコストが削減されます。

image

シナリオ

エラスティックコンテナインスタンスを使用して、トラフィックの急増を処理し、コンピューティングコストを削減できます。 Elasticコンテナインスタンスは、次のシナリオに適しています。

  • オンライン教育やeコマースなど、トラフィックの変動に対処するために柔軟なスケーリングが必要なオンラインビジネス。 エラスティックコンテナインスタンスを使用して、トラフィックスパイクを効率的に処理できます。 さらに、elasticコンテナインスタンスは、リソースプールのメンテナンスを最適化できます。 これにより、コンピューティングコストを削減できます。

  • オンデマンドで実行されるコンピューティングタスク。 elasticコンテナインスタンスを使用して、このようなタスクを実行できます。 この方法では、タスクが実行されていないときにノードを保持する必要がなく、コンピューティングタスクによって実際に使用されるコンピューティングリソースに対してのみ課金されます。 次のタイプのコンピューティングタスクが含まれます。

    • データ処理タスクはSparkまたはPrestoを使用して実行されます。

    • JenkinsとGitLab Runnerを使用して構築された継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプライン。

    • AIコンピューティングシナリオとCronJobsのジョブ。

前提条件

  • ACKマネージドクラスターまたはACK専用クラスターが作成され、クラスターのKubernetesバージョンが1.16以降であること。 ACKクラスターの作成方法の詳細については、「ACK管理クラスターの作成」または「ACK専用クラスターの作成」をご参照ください。 ACKクラスターの更新方法の詳細については、「ACKクラスターの更新」をご参照ください。

  • Elastic Container Instanceが有効化され、クラスターがデプロイされているリージョンがElastic Container Instanceによってサポートされます。

    Elastic Container Instanceコンソールにログインして、サービスを有効化し、サービスでサポートされているリージョンとゾーンを表示します。

  • kubectlクライアントがクラスターに接続されています。 詳細については、「Cloud Shellでのkubectlの使用によるACKクラスターの管理」をご参照ください。

手順1: ack-virtual-nodeをクラスターにデプロイする

ACK管理クラスターでは、ack-virtual-nodeは、ACK専用クラスターとは異なる方法でインストールおよび管理されます。

  • ACK管理クラスターでは、ackコンソールの [アドオン] ページからACK-virtual-nodeをデプロイする必要があります。 既定では、ack-virtual-nodeはデプロイ後にクラスターによって管理されます。

  • ACK専用クラスターでは、ackコンソールのMarketplaceページからACK-virtual-nodeをデプロイする必要があります。 ack-virtual-nodeがインストールされると、ack-virtual-node-controllerという名前のデプロイがkube-system名前空間に作成されます。 デプロイは、クラスター内のワーカーノードで実行されます。

ACK管理クラスター

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

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

  3. [アドオン] ページの [コアコンポーネント] セクションで、[ack-virtual-node] を選択し、[インストール] をクリックします。 次に、ページの指示に従ってインストールを完了します。

    クラスターのデフォルトのvSwitchとセキュリティグループは、ack-virtual-nodeによってデプロイされるエラスティックコンテナインスタンスに使用されます。 これらの設定を変更する場合は、「関連する操作」をご参照ください。

ACK専用クラスター

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[Marketplace] > [Marketplace] を選択します。

  2. [マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。 [ack-virtual-node] をクリックします。 ack-virtual-nodeページで、[デプロイ] をクリックします。

  3. [デプロイ] パネルで、クラスターと名前空間を選択し、[次へ] をクリックします。

    名前空間は自動的にkube-systemに設定されます。 リリース名は自動的にack-virtual-nodeに設定されます。

  4. [パラメーター] ウィザードページで、最新のグラフバージョンを選択し、[パラメーター] セクションで仮想ノードパラメーターを設定し、[OK] をクリックします。

    パラメーター

    必須

    説明

    値の取得方法

    ALIYUN_CLUSTERID

    必須

    クラスター ID

    [クラスターの詳細] ページに移動します。 [基本情報] タブをクリックして、クラスターIDを表示します。

    ALIYUN_RESOURCEGROUP_ID

    任意

    リソースグループID。

    このパラメーターを指定しない場合、デフォルトのリソースグループが使用されます。 リソースグループを指定するには、リソース管理コンソールにログインして、使用するリソースグループのIDを取得します。

    ECI_REGION

    必須

    リージョン ID です。

    [クラスターの詳細] ページに移動します。 [基本情報] タブをクリックします。 [基本情報] セクションでは、クラスターがデプロイされているリージョンを確認できます。

    説明

    リージョン名と対応するリージョンIDの詳細については、「リージョンとゾーン」をご参照ください。

    ECI_VPC

    任意

    VPC ID

    [クラスターの詳細] ページに移動します。 [基本情報] タブをクリックして、クラスターがデプロイされているVPCのIDを表示します。

    ECI_VSWITCH

    必須

    vSwitch ID。

    ポッドにIPアドレスを割り当てるために使用するvSwitchを指定できます。 vsw-xxx1、vsw-xxx2の形式で複数のIDを指定できます。 クラスター内のノードプールで使用されるvSwitchを指定することを推奨します。

    [ノードプール] ページで、ノードプールのIDをクリックします。 [概要] タブをクリックします。 [ノード構成] セクションでは、ノードプール内のノードで使用されているvSwitchのIDを表示できます。

    説明

    指定したvSwitchが、Elastic Container Instanceでサポートされているゾーンにデプロイされていることを確認します。

    ECI_SECURITY_GROUP

    必須

    セキュリティグループ ID です。

    [クラスターの詳細] ページに移動します。 [基本情報] タブをクリックして、クラスターで使用されているセキュリティグループのIDを表示します。

    ECI_ACCESS_KEY

    必須

    使用するRAM (Resource Access Management) ユーザーのAccessKey ID。

    詳細については、「AccessKeyペアの取得」をご参照ください。

    RAMコンソールのRAMユーザーにAliyunECIFullAccessポリシーをアタッチする必要があります。 詳細については、「RAMユーザーへの権限付与」をご参照ください。

    ECI_SECRET_KEY

    必須

    使用するRAMユーザーのAccessKey ID。

    詳細については、「AccessKeyペアの取得」をご参照ください。

    RAMコンソールのRAMユーザーにAliyunECIFullAccessポリシーをアタッチする必要があります。 詳細については、「RAMユーザーへの権限付与」をご参照ください。

    KUBERNETES_APISERVER_HOST

    必須

    クラスターのKubernetes APIサーバーのIPアドレス。

    クラスターのKubernetes APIサーバーの内部エンドポイントのIPアドレスとポート。 [クラスターの詳細] ページに移動し、[基本情報] タブをクリックして、クラスターのKubernetes APIサーバーの内部エンドポイントを表示します。

    KUBERNETES_APISERVER_PORT

    必須

    クラスターのKubernetes APIサーバーのポート。

  5. 次のコマンドを実行して、ack-virtual-nodeがデプロイされているかどうかを確認します。

    kubectl -n kube-system get deploy ack-virtual-node-controller

    期待される出力:

    の名前は日付まで利用可能な年齢を準備しています
    ack-virtual-node-controller 1/1 1 1 1 2m3 1s 

手順2: ポッドをelasticコンテナインスタンスにスケジュールする

ack-virtual-nodeがクラスターにデプロイされた後、クラスターに仮想ノードとしてデプロイされたエラスティックコンテナインスタンスにポッドをスケジュールできます。 次のいずれかの方法を使用して、ポッドをACK管理クラスターまたはACK専用クラスターのエラスティックコンテナインスタンスにスケジュールできます。

ACK Proクラスターを使用している場合、エラスティックコンテナインスタンスのみにポッドをスケジュールするようにクラスターを設定したり、ポッドスケジューリング用のECSインスタンスに優先順位を付けたり、ECSインスタンスのみにポッドをスケジュールするようにクラスターを設定したりできます。 詳細については、「Elastic Container Instanceベースのスケーリングの設定」をご参照ください。

ポッドラベルを追加してポッドをエラスティックコンテナインスタンスにスケジュールする

ポッドをエラスティックコンテナインスタンスにスケジュールするには、次の手順を実行してポッド設定にalibabacloud.com/eci=trueラベルを追加します。

  1. 次のコマンドを実行して、ポッド設定にalibabacloud.com/eci=trueラベルを追加します。

    kubectl run nginx --image nginx -l alibabacloud.com/eci=true
  2. 次のコマンドを実行して、クラスター内の仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドがスケジュールされているかどうかを確認します。

    kubectl get pod -o wide|grep virtual-kubelet

    期待される出力:

    nginx-7fc9f746b6-r4xgx     1/1     Running   0          34s   192.XX.XX.108   virtual-kubelet-cn-hangzhou-k        <none>           <none>

名前空間ラベルを追加してポッドをエラスティックコンテナインスタンスにスケジュールする

ポッドをエラスティックコンテナインスタンスにスケジュールするには、次の手順を実行して、ポッドをデプロイする名前空間にalibabacloud.com/eci=trueラベルを追加します。

  1. 次のコマンドを実行して、vkという名前空間を作成します。

    kubectl create ns vk
  2. 次のコマンドを実行して、alibabacloud.com/eci=trueラベルをvk名前空間に追加します。

    kubectl label名前空間v k alibabacloud.com/eci=true
  3. 次のコマンドを実行してvk名前空間にポッドを作成し、ポッドを仮想ノードにスケジュールします。

    kubectl -n vk実行nginx -- image nginx
  4. 次のコマンドを実行して、クラスター内の仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドがスケジュールされているかどうかを確認します。

    kubectl -n vk get pod -o wide | grep virtual-kubelet

    期待される出力:

    nginx-6f489b847d-vgj4d 1/1実行中0 1m 192.XX. XX.108 virtual-kubelet-cn-hangzhou-k <none> <none>

関連する API 操作

仮想ノードの高度な機能を使用する場合は、ack-virtual-nodeを更新するか、仮想ノードの設定を変更します。 仮想ノードを使用する必要がなくなった場合は、ack-virtual-nodeをアンインストールできます。

ack-仮想ノードの更新

更新には約1分かかります。 更新中は、新しいポッドを作成できません。 既存のポッドは影響を受けません。

ACK管理クラスター

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

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

  3. [アドオン] ページの [コアコンポーネント] セクションで、[ack-virtual-node] を選択し、[更新] をクリックします。 次に、ページの指示に従ってインストールを完了します。

ACK専用クラスター

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

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

  3. Helmページで、ack-virtual-nodeを見つけ、[操作] 列の [更新] をクリックします。 [更新リリース] パネルで、[バージョン] ドロップダウンリストから最新バージョンを選択します。

  4. 「手順1: ack-virtual-nodeをクラスターにデプロイする」のパラメーターの説明に基づいて、必要なパラメーターを変更します。 オプションのパラメーターが含まれている場合は、手順1: ack-virtual-nodeをクラスターにデプロイするで、パラメーターの説明に基づいてパラメーターを変更します。 次に、[OK] をクリックします。

    さらに、virtualNode.image.tagフィールドを変更して、仮想ノードのイメージバージョンを更新することもできます。

ACKクラスター内の仮想ノードの設定の変更

詳細については、「eci-profileの設定」をご参照ください。

ACKクラスター内の仮想ノードの削除

  1. ack-virtual-nodeをアンインストールします。

    • ACKマネージドクラスター内のすべてのElastic Container Instanceベースのポッドを削除した後、[アドオン] ページでack-virtual-nodeをアンインストールします。

    • ACK専用クラスター内のすべてのElastic Container Instanceベースのポッドを削除した後、Helmページでack-virtual-nodeを削除します。

  2. kubectl delete node <node name> を実行して、不要な仮想ノードを削除します。

    説明

    ack-virtual-nodeをアンインストールしても、クラスター内の既存のelasticコンテナインスタンスは削除されません。