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

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

最終更新日:Jan 06, 2025

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

仕組み

Elastic Container Instance

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

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

image

前提条件

  • 登録済みクラスターが作成され、Kubernetesバージョンが1.14以降の自己管理クラスターが登録済みクラスターに接続されます。 詳細については、「登録済みクラスターの作成」をご参照ください。

  • Elastic Container Instanceが有効化されています。

  • クラスターがデプロイされているリージョンは、Elastic Container Instanceによってサポートされています。 サポートされているリージョンとゾーンを表示するには、Elastic Container Instanceコンソールにログインします。 サポートされているリージョンとゾーンの詳細については、「リージョンとゾーン」をご参照ください。

ステップ1: ack-virtual-nodeへのRAM権限の付与

onectlの使用

  1. オンプレミスマシンにonectlをインストールします。 詳細については、「onectlを使用した登録済みクラスターの管理」をご参照ください。

  2. 次のコマンドを実行して、ack-virtual-nodeにRAM (Resource Access Management) 権限を付与します。

    onectl ram-user grant --addon ack-virtual-node

    期待される出力:

    Ram policy ack-one-registered-cluster-policy-ack-virtual-node granted to ram user ack-one-user-ce313528c3 successfully.

コンソールの使用

登録済みクラスターにコンポーネントをインストールする前に、自己管理KubernetesクラスターでAccessKeyペアを指定する必要があります。 AccessKeyペアは、セルフマネージドKubernetesクラスターからAlibaba Cloudサービスにアクセスする場合に必要です。 AccessKeyペアを設定する前に、RAMユーザーを作成し、RAMユーザーにAlibaba Cloudリソースへのアクセス権限を付与します。

  1. RAMユーザーを作成します。 詳細については、「RAMユーザーの作成」をご参照ください。

  2. オプション: カスタムポリシーを作成します。 詳細については、「カスタムポリシーの作成」をご参照ください。

    サンプルコードを表示する

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "vpc:DescribeVSwitches",
                    "vpc:DescribeVpcs"
                ],
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "eci:CreateContainerGroup",
                    "eci:DeleteContainerGroup",
                    "eci:DescribeContainerGroups",
                    "eci:DescribeContainerGroupStatus",
                    "eci:DescribeContainerGroupEvents",
                    "eci:DescribeContainerLog",
                    "eci:UpdateContainerGroup",
                    "eci:UpdateContainerGroupByTemplate",
                    "eci:CreateContainerGroupFromTemplate",
                    "eci:RestartContainerGroup",
                    "eci:ExportContainerGroupTemplate",
                    "eci:DescribeContainerGroupMetric",
                    "eci:DescribeMultiContainerGroupMetric",
                    "eci:ExecContainerCommand",
                    "eci:CreateImageCache",
                    "eci:DescribeImageCaches",
                    "eci:DeleteImageCache",
                    "eci:DescribeContainerGroupMetaInfos",
                    "eci:UpdateImageCache",
                    "eci:RestartContainer",
                    "eci:RestartContainers"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            },
            {
                "Action": [
                    "acc:DescribeZones",
                    "acc:CreateInstance",
                    "acc:UpdateInstance",
                    "acc:DeleteInstance",
                    "acc:RestartInstance",
                    "acc:DescribeInstances",
                    "acc:DescribeInstanceStatus",
                    "acc:DescribeInstanceEvents",
                    "acc:DescribeInstanceDetail",
                    "acc:DescribeMultiInstanceMetric",
                    "acc:DescribeContainerLog",
                    "acc:ResizeInstanceVolume",
                    "acc:CreateCustomResource",
                    "acc:UpdateCustomResource",
                    "acc:DeleteCustomResource",
                    "acc:DescribeCustomResources",
                    "acc:DescribeCustomResourceDetail"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }
  3. RAMユーザーにポリシーをアタッチします。 詳細については、「RAMユーザーの作成とRAMユーザーへの権限付与」をご参照ください。

    カスタムポリシーを作成するか、AliyunECIFullAccessポリシーを選択して、RAMユーザーに権限を付与できます。

  4. RAMユーザーのAccessKeyペアを作成します。 詳細については、「AccessKeyペアの取得」をご参照ください。

  5. という名前のシークレットを作成するためのAccessKeyペアalibaba-addon-secret登録済みクラスターで

    ack-virtual-nodeをインストールすると、システムは自動的にAccessKeyペアを使用してクラウドリソースにアクセスします。

    kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'
    説明

    <your access key id><your access key secret> を、前の手順で取得したAccessKeyペアに置き換えます。

手順2: ack-virtual-nodeのインストール

onectlの使用

次のコマンドを実行して、ack-virtual-nodeをインストールします。

onectl addon install ack-virtual-node

期待される出力:

Addon ack-virtual-node, version **** installed.

コンソールの使用

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

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

  3. をクリックし、その他タブで、ack-virtual-nodeを見つけて、インストール.

    [メモ] ダイアログボックスで、[OK] をクリックします。 クラスターのデフォルトのvSwitchとセキュリティグループは、ack-virtual-nodeによってデプロイされるエラスティックコンテナインスタンスに使用されます。 詳細については、「What to do next」をご参照ください。

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

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

  1. 次のコマンドを実行して、仮想ノードのステータスを照会します。

    kubectl  get no |grep virtual-kubelet

    期待される出力:

    virtual-kubelet-cn-hangzhou-b   Ready    agent                  18d   v1.20.11-aliyun.1

    出力は、仮想ノードがレディ状態にあることを示す。

  2. 次の3つの方法のいずれかを使用して、ポッドをエラスティックコンテナインスタンスにスケジュールできます。

    方法1: ポッドにラベルを追加する (クラスターのバージョンが1.16以降)

    作成するポッドにalibabacloud.com/eci=trueラベルを追加します。 次に、Elastic Container Instanceベースのポッドが作成され、仮想ノードにスケジュールされます。 例:

    1. 次のコマンドを実行して、ポッドにラベルを追加します。

    2. kubectl run nginx --image nginx -l alibabacloud.com/eci=true
    3. 次のコマンドを実行してポッドを照会します。

    4. kubectl get pod -o wide|grep virtual-kubelet
    5. 期待される出力:

    6. nginx-7fc9f746b6-r4xgx     0/1     ContainerCreating   0          20s   192.168.XX.XX   virtual-kubelet        <none>           <none>

    方法2: 名前空間にラベルを追加する

    ポッドが属する名前空間にalibabacloud.com/eci=trueラベルを追加します。 次に、Elastic Container Instanceベースのポッドが作成され、仮想ノードにスケジュールされます。 例:

    1. 次のコマンドを実行して、仮想ノードを作成します。

    2. kubectl create ns vk
    3. 次のコマンドを実行して、ポッドが属する名前空間にラベルを追加します。

    4. kubectl label namespace vk alibabacloud.com/eci=true
    5. 次のコマンドを実行して、ポッドを仮想ノードにスケジュールします。

    6. kubectl -n vk run nginx --image nginx
    7. 次のコマンドを実行してポッドを照会します。

    8. kubectl -n vk get pod -o wide|grep virtual-kubelet
    9. 期待される出力:

    10. nginx-6f489b847d-vgj4d      1/1     Running             0          1m   192.168.XX.XX   virtual-kubelet        <none>           <none>

    方法3: ノード名の指定

    指定したポッドのみを仮想ノードにスケジュールします。 nodeName: virtual-kubelet-cn-shanghai-kラベルをポッドに追加します。 次に、Elastic Container Instanceベースのポッドが作成され、仮想ノードにスケジュールされます。 例:

    1. nginx-deployment.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: nginx-deployment-basic
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            nodeName: virtual-kubelet-cn-shanghai-k             # nodeName of the specified virtual kubelet
            containers:
            - name: nginx
              image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
              ports:
              - containerPort: 80
              resources:
                limits:
                  cpu: "500m"
    2. 次のコマンドを実行して、アプリケーションをデプロイします。

      kubectl apply -f nginx-deployment.yaml
    3. 次のコマンドを実行してポッドを照会します。

      kubectl  get pod -o wide|grep virtual-kubelet
    4. 期待される出力:

      nginx-6f489b847d-XXX      1/1     Running             0          1m   192.168.XX.XX   virtual-kubelet        <none>           <none>
      nginx-6f489b847d-XXX      1/1     Running             0          1m   192.168.XX.XX   virtual-kubelet        <none>           <none>

次のステップ

エラスティックコンテナインスタンスが接続されているvSwitchの設定の変更

ECI_VSWITCH環境変数を変更して、仮想ノードにスケジュールされているポッドのvSwitchを変更できます。 高可用性を確保するために、異なるゾーンにデプロイされる複数のvSwitchを構成することを推奨します。 現在のゾーンのエラスティックコンテナインスタンスが在庫切れの場合、仮想ノードコントローラは別のゾーンにポッドを作成します。

次のコマンドを実行して、エラスティックコンテナインスタンスが接続されているvSwitchの設定を変更します。

kubectl edit configmap eci-profile -n kube-system

設定例:

data:
  enableClusterIp: "true"
  enableHybridMode: "false"
  enablePrivateZone: "false"
  securityGroupId: sg-2zeeyaaxlkq9sppl****
  selectors: ""
  vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****     # the vSwitch to which an elastic container instance pod is connected. Separate multiple vSwitch IDs with commas (,).
  vpcId: vpc-2zeghwzptn5zii0w7****

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

仮想ノードの削除

  1. 登録済みクラスターからack-virtual-nodeをアンインストールします。

    onectlの使用

    次のコマンドを実行して、ack-virtual-nodeをアンインストールします。

    onectl addon uninstall ack-virtual-node

    期待される出力:

    Addon ack-virtual-node uninstalled.

    コンソールの使用

    ACKコンソールの [アドオン] ページに移動し、ack-virtual-nodeをアンインストールします。

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

    説明

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