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

:仮想ノードを介して Elastic Container Instance で実行するようにポッドをスケジュールする

最終更新日:Jul 02, 2025

Container Service for Kubernetes (ACK) クラスタを使用する場合、短時間で多数のポッドを迅速に起動する必要がある場合があります。 これらのポッド用に Elastic Compute Service (ECS) ノードをスケールアウトするには時間がかかりすぎる一方で、余分なアイドル状態の ECS インスタンスを予約しておくのはリソースの無駄になります。 より良い解決策は、ACK 仮想ノードを介して Elastic Container Instance で実行するようにポッドをスケジュールすることです。 この方法では、ECS インスタンスを購入または管理する必要はありません。 このトピックでは、ACK One 登録済みクラスターの Elastic Container Instance にポッドをスケジュールする方法について説明します。

しくみ

Elastic Container Instance は、コンテナ化のために Alibaba Cloud が提供するサーバーレスコンピューティングサービスであり、コンテナ用の運用管理不要の、隔離された、迅速にデプロイ可能なランタイム環境を提供します。 Elastic Container Instance を使用すると、ECS インスタンスを購入または管理することなく、コンテナ化されたアプリケーションに集中できます。 必要に応じて Elastic Container Instance を作成でき、リソースの使用量に対して秒単位で課金されます。

通常、クラスターには少なくとも 1 つのデータセンター ノード グループがあります。ポッドを作成すると、クラスターはノードで実行するようにポッドをスケジュールします。このスケジューリング モードは、安定したトラフィック量を受信するアプリケーションに適しています。ワークロードに突然または予測できない急上昇がある場合は、仮想ノードを使用してポッドを エラスティック コンテナー インスタンスに直接スケジュールすることをお勧めします。このソリューションは、ノードの作成時間を短縮し、アイドル状態のリソース コストを回避します。

image

前提条件

  • 登録済みクラスターが作成されていること、および Kubernetes バージョン 1.14 以降の自己管理型クラスターが登録済みクラスターに接続されていること。

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

ステップ 1: ack-virtual-node に RAM 権限を付与する

onectl を使用する

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

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

    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 ペアを指定する必要があります。 自己管理型 Kubernetes クラスターから Alibaba Cloud サービスにアクセスするには、AccessKey ペアが必要です。 AccessKey ペアを設定する前に、RAM ユーザーを作成し、Alibaba Cloud リソースにアクセスするための権限を RAM ユーザーに付与します。

  1. 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 ユーザーにポリシーをアタッチする

    AliyunECIFullAccessAliyunVPCReadOnlyAccessAliyunAccFullAccess などのシステムポリシー、またはカスタム権限ポリシーを追加することで、RAM ユーザーに権限を付与できます。

  4. AccessKey ペアの作成

    警告

    AccessKey のセキュリティを強化するために、ネットワークアクセス制御用に 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] をクリックします。 ack-virtual-node によってデプロイされる Elastic Container Instance には、クラスターのデフォルトの vSwitch とセキュリティグループが使用されます。 詳細については、「次のステップ」をご参照ください。

ステップ 3: Elastic Container Instance にポッドをスケジュールする

ack-virtual-node がクラスターにデプロイされると、クラスター内の仮想ノードとしてデプロイされている Elastic Container Instance にポッドをスケジュールできます。 次のいずれかの方法を使用して、登録済みクラスターの Elastic Container Instance にポッドをスケジュールできます。 ポッドをスケジュールする前に、仮想ノードが Ready 状態であることを確認してください。

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

    kubectl  get no |grep virtual-kubelet

    期待される出力:

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

    出力は、仮想ノードが Ready 状態であることを示しています。

  2. 次の 3 つの方法のいずれかを使用して、Elastic Container Instance にポッドをスケジュールできます。

    方法 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             # 指定された仮想 kubelet の nodeName
            containers:
            - name: nginx
              image: nginx:1.7.9 # 正確な <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>

次のステップ

Elastic Container Instance が接続されている vSwitch の構成を変更する

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

次のコマンドを実行して、Elastic Container Instance が接続されている 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****     # Elastic Container Instance ポッドが接続されている vSwitch。 複数の vSwitch ID はカンマ (,) で区切ります。
  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 Container Instance は削除されません。