多数の Pod を迅速に作成する必要がある場合、ECS インスタンスのスケーリングでは速度が不十分なことがあり、予備のインスタンスを予約するとリソースの無駄になります。Container Service for Kubernetes (ACK) の仮想ノードを使用すると、ECS インスタンスをプロビジョニングまたは管理することなく、Pod を Elastic Container Instance (ECI) にスケジューリングできます。このトピックでは、ACK マネージドクラスターで Pod を ECI 上で実行するようにスケジューリングする方法について説明します。
注意事項
kube-scheduler v6.11.0 以降の場合、ラベルを追加して 1,000 を超える ECI Pod を同時に作成するときは、最新バージョンにアップグレードし、SchedulerBatchMoveEvents=true フィーチャーゲートを有効にしてください。
利用シーン
ECI で Pod を実行することは、トラフィックスパイクへの対応やコンピューティングコストの削減に最適です。典型的な利用シーンは次のとおりです。
トラフィックパターンが変動するオンラインサービス
ECI Pod を使用すると、トラフィックスパイクへの迅速な対応、固定リソースプールのメンテナンス削減、コンピューティングコストの低減が可能になります。
短期間またはバッチ処理のコンピューティングタスク
コンピューティングタスクを ECI Pod として実行する場合、専用のノードを維持する必要がなく、タスク実行中に使用したコンピューティングリソースに対してのみ料金が発生します。このアプローチにより、Spark や AI ジョブなどのワークロードのコストを削減できます。
前提条件
ご利用の ACK クラスターは Kubernetes 1.16 以降を実行しており、ECI をサポートするリージョンにある必要があります。
クラスターのリージョンがサポートされているかを確認するには、「ECI がサポートするリージョンとゾーン」をご参照ください。その後、Elastic Container Instance コンソールにログインして、ECI サービスを有効化します。
操作手順
ステップ 1: ack-virtual-node コンポーネントのデプロイ
以下の手順では、ACK マネージドクラスターを例として使用します。ACK 専用クラスターの場合、Marketplace ページから ack-virtual-node コンポーネントをデプロイする必要があります。詳細については、「ack-virtual-node コンポーネントのデプロイ」をご参照ください。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[コンポーネントとアドオン] をクリックします。
[アドオン] ページで、[コアコンポーネント] タブをクリックし、[ACK Virtual Node] を見つけて、[インストール] をクリックします。画面の指示に従ってインストールを完了します。
インストール中、クラスターのデフォルト vSwitch とセキュリティグループが、初期の ECI 構成パラメーターとして使用されます。パラメーターを変更するには、「eci-profile の設定」によって更新できます。
ステップ 2: Pod の ECI へのスケジューリング
以下の例では、Pod または Namespace にラベルを追加することで、Pod を仮想ノードにスケジューリングして ECI で実行する方法を示します。その他のスケジューリング方法については、「Pod の仮想ノードへのスケジューリング」をご参照ください。
Pod
個別の Pod を ECI で実行するには、Pod に alibabacloud.com/eci: "true" ラベルを追加します。これにより、Pod は x86 アーキテクチャの仮想ノードにスケジューリングされ、ECI Pod として実行されます。
次の YAML ファイルから Deployment を作成します。
kubectl create -f eci-pod.yaml以下に `eci-pod.yaml` ファイルの例を示します。
説明以下の YAML では、
k8s.aliyun.com/eci-use-specsアノテーションが ECI Pod のコンピューティング仕様を指定します。ECI Pod の仕様設定の詳細については、「ECI Pod のコンピューティング仕様の指定」をご参照ください。apiVersion: apps/v1 kind: Deployment metadata: name: test labels: app: test spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: name: test labels: app: nginx alibabacloud.com/eci: "true" # このラベルを追加して Pod を ECI にスケジューリングします。 annotations: k8s.aliyun.com/eci-use-specs: "2-4Gi" # ECI Pod に 2 vCPU と 4 GiB のメモリを指定します。 spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80Pod が仮想ノードで実行されていることを確認します。
kubectl get pod -o wide -l app=nginx期待される出力では、
NODE列に示されているように、Pod が仮想ノードにスケジューリングされていることがわかります。NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-86f7fbc94f-g5m22 1/1 Running 0 38s 10.16.XX.XX virtual-kubelet-cn-hangzhou-j <none> <none> test-86f7fbc94f-r4wcn 1/1 Running 0 38s 10.16.XX.XX virtual-kubelet-cn-hangzhou-j <none> <none>ECI Pod の詳細を表示します。
kubectl get pod <pod-name> -o yamlYAML 出力で、
k8s.aliyun.com/eci-instance-idアノテーションに対応する ECI インスタンス ID を見つけ、k8s.aliyun.com/eci-instance-specアノテーションで課金に使用される ECI Pod のコンピューティング仕様を確認します。
Namespace
特定のカテゴリの Pod を ECI で実行したい場合は、Namespace を作成し、それに alibabacloud.com/eci: "true" ラベルを追加できます。この Namespace で作成されたすべての Pod は、x86 アーキテクチャの仮想ノードにスケジューリングされ、ECI Pod として実行されます。
vkという名前の Namespace を作成し、必要なラベルを追加します。kubectl create ns vk kubectl label namespace vk alibabacloud.com/eci=true次の YAML を使用して、
vkNamespace に Deployment を作成します。kubectl create -f eci-namespace.yaml以下に `eci-namespace.yaml` ファイルの例を示します。
説明以下の YAML では、
k8s.aliyun.com/eci-use-specsアノテーションが ECI Pod のコンピューティング仕様を指定します。ECI Pod の仕様設定の詳細については、「ECI Pod のコンピューティング仕様の指定」をご参照ください。apiVersion: apps/v1 kind: Deployment metadata: name: test namespace: vk # ラベル付けされた Namespace を指定して Pod を ECI にスケジューリングします。 labels: app: test spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: name: test labels: app: nginx annotations: k8s.aliyun.com/eci-use-specs: "2-4Gi" # ECI Pod に 2 vCPU と 4 GiB のメモリを指定します。 spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80Pod が仮想ノードで実行されていることを確認します。
kubectl get pod -o wide -l app=nginx -n vk期待される出力では、
NODE列に示されているように、Pod が仮想ノードにスケジューリングされていることがわかります。NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-8f54bcfb5-86pvc 1/1 Running 0 14s 10.16.XX.XX virtual-kubelet-cn-hangzhou-j <none> <none> test-8f54bcfb5-skvkg 1/1 Running 0 14s 10.16.XX.XX virtual-kubelet-cn-hangzhou-j <none> <none>ECI Pod の詳細を表示します。
kubectl get pod <pod-name> -o yaml -n vkYAML 出力で、
k8s.aliyun.com/eci-instance-idアノテーションに対応する ECI インスタンス ID を見つけ、k8s.aliyun.com/eci-instance-specアノテーションで課金に使用される ECI Pod のコンピューティング仕様を確認します。