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インスタンスの作成と起動に時間がかかるためです。 この場合、仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドをスケジュールすることを推奨します。 これにより、新しいノードを追加する必要がなくなり、リソースの無駄がなくなり、コンピューティングコストが削減されます。
シナリオ
エラスティックコンテナインスタンスを使用して、トラフィックの急増を処理し、コンピューティングコストを削減できます。 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管理クラスター
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページの [コアコンポーネント] セクションで、[ack-virtual-node] を選択し、[インストール] をクリックします。 次に、ページの指示に従ってインストールを完了します。
クラスターのデフォルトのvSwitchとセキュリティグループは、ack-virtual-nodeによってデプロイされるエラスティックコンテナインスタンスに使用されます。 これらの設定を変更する場合は、「関連する操作」をご参照ください。
ACK専用クラスター
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。 [ack-virtual-node] をクリックします。 ack-virtual-nodeページで、[デプロイ] をクリックします。
[デプロイ] パネルで、クラスターと名前空間を選択し、[次へ] をクリックします。
名前空間は自動的にkube-systemに設定されます。 リリース名は自動的にack-virtual-nodeに設定されます。
[パラメーター] ウィザードページで、最新のグラフバージョンを選択し、[パラメーター] セクションで仮想ノードパラメーターを設定し、[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サーバーのポート。
次のコマンドを実行して、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
ラベルを追加します。
次のコマンドを実行して、ポッド設定に
alibabacloud.com/eci=true
ラベルを追加します。kubectl run nginx --image nginx -l alibabacloud.com/eci=true
次のコマンドを実行して、クラスター内の仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドがスケジュールされているかどうかを確認します。
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
ラベルを追加します。
次のコマンドを実行して、
vk
という名前空間を作成します。kubectl create ns vk
次のコマンドを実行して、
alibabacloud.com/eci=true
ラベルをvk
名前空間に追加します。kubectl label名前空間v k alibabacloud.com/eci=true
次のコマンドを実行してvk名前空間にポッドを作成し、ポッドを仮想ノードにスケジュールします。
kubectl -n vk実行nginx -- image nginx
次のコマンドを実行して、クラスター内の仮想ノードとしてデプロイされているエラスティックコンテナインスタンスにポッドがスケジュールされているかどうかを確認します。
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管理クラスター
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページの [コアコンポーネント] セクションで、[ack-virtual-node] を選択し、[更新] をクリックします。 次に、ページの指示に従ってインストールを完了します。
ACK専用クラスター
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
Helmページで、ack-virtual-nodeを見つけ、[操作] 列の [更新] をクリックします。 [更新リリース] パネルで、[バージョン] ドロップダウンリストから最新バージョンを選択します。
「手順1: ack-virtual-nodeをクラスターにデプロイする」のパラメーターの説明に基づいて、必要なパラメーターを変更します。 オプションのパラメーターが含まれている場合は、手順1: ack-virtual-nodeをクラスターにデプロイするで、パラメーターの説明に基づいてパラメーターを変更します。 次に、[OK] をクリックします。
さらに、
virtualNode.image.tag
フィールドを変更して、仮想ノードのイメージバージョンを更新することもできます。
ACKクラスター内の仮想ノードの設定の変更
詳細については、「eci-profileの設定」をご参照ください。
ACKクラスター内の仮想ノードの削除
ack-virtual-nodeをアンインストールします。
ACKマネージドクラスター内のすべてのElastic Container Instanceベースのポッドを削除した後、[アドオン] ページでack-virtual-nodeをアンインストールします。
ACK専用クラスター内のすべてのElastic Container Instanceベースのポッドを削除した後、Helmページでack-virtual-nodeを削除します。
kubectl delete node <node name>
を実行して、不要な仮想ノードを削除します。説明ack-virtual-nodeをアンインストールしても、クラスター内の既存のelasticコンテナインスタンスは削除されません。