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

Elastic Container Instance:ARM ベースの仮想ノードへの Pod のスケジューリング

最終更新日:Jun 22, 2026

Pod をスケジュールして Elastic Container Instance (ECI) として仮想ノードで実行する場合、ACK クラスターとサーバーレス Kubernetes (ACK Serverless) クラスターは、デフォルトで Pod を x86 ベースの仮想ノードにスケジュールします。お使いのアプリケーションが ARM アーキテクチャを使用している場合は、nodeSelector を追加して ARM ベースの仮想ノードを指定する必要があります。

前提条件

クラスターは、次の要件を満たしている必要があります。

  • クラスターがデプロイされているリージョンが ARM ベースのインスタンスをサポートしている。

    ECI は、ARM アーキテクチャ上で g8y、c8y、r8y の ECS インスタンスタイプファミリーをサポートしています。サポートされているリージョンの詳細については、「各リージョンで利用可能な ECS インスタンスタイプ」をご参照ください。

  • クラスターが Kubernetes 1.20 以降を実行している。

  • クラスター内の ACK Virtual Node コンポーネントのバージョンが ARM ベースのノードをサポートしている。

  • クラスター内の kube-scheduler コンポーネントのバージョンが ARM ベースのノードをサポートしている。

注意事項

指定した vCPU とメモリリソースではなく、プロビジョニングされた実際の ARM ベースの ECS インスタンスタイプに対して課金されます。

説明

ECI Pod を作成した後、kubectl describe pod <pod name> を実行し、k8s.aliyun.com/eci-instance-spec アノテーションを確認して、実際の ECS インスタンスタイプを特定してください。

ARM ベースの仮想ノードの追加

以下の手順に従って eci-profile を変更し、ARM ベースの仮想ノードをクラスターに追加します。

  1. eci-profile を変更します。

    kubectl edit configmap eci-profile -n kube-system

    eci-profile の `data` セクションで、`enableLinuxArm64Node` を `true` に設定します。設定されたゾーンの少なくとも 1 つが ARM ベースのインスタンスタイプをサポートしていることを確認してください。

    data:
      enableClusterIp: "true"
      enableHybridMode: "false"
      enableLinuxArm64Node: "true"    # ARM ベースのノードを有効化します。
      enableLogController: "false"
      enablePVCController: "false"
      enablePrivateZone: "false"
      enableReuseSSLKey: "false"
      featureGates: MetricsVpcNet=true,ProtectionFinalizers=false,WaitForFirstConsumer=false
      resourceGroupId: ""
      securityGroupId: sg-2zeg1fci0oq1hljo6h0a
      selectors: ""
      slsMachineGroup: ""
      vSwitchIds: vsw-2zewa5mb19wr45g63****,vsw-2zevanrscmoiaxryx****,vsw-2ze94pjtfuj9vaymf****   # 設定されたゾーンには、ARM ベースのインスタンスタイプをサポートするゾーンを含める必要があります。
      vpcId: vpc-2zeghwzptn5zii0w7****
  2. クラスターで生成された ARM ベースの仮想ノードを表示します。

    `enableLinuxArm64Node` を `true` に設定した後、`kubectl get node` コマンドを実行してノード情報を表示します。ARM ベースの仮想ノードが自動的にクラスターに追加されます。

    kubectl get node
    NAME                                      STATUS    ROLES    AGE    VERSION
    virtual-kubelet-cn-beijing-h              Ready     agent    169m   v1.24.6-aliyun.1
    virtual-kubelet-cn-beijing-i              Ready     agent    169m   v1.24.6-aliyun.1
    virtual-kubelet-cn-beijing-i-linux-arm64  Ready     agent    75s    v1.24.6-aliyun.1
    virtual-kubelet-cn-beijing-k              Ready     agent    169m   v1.24.6-aliyun.1

ARM ベースの仮想ノードへの Pod のスケジューリング

nodeSelector フィールドの設定

ACK クラスターおよび ACK Serverless クラスターの ARM ベースの仮想ノードには、kubernetes.io/arch: arm64 ラベルが付与されています。このラベルを `nodeSelector` で使用して、ECI Pod を ARM ベースの仮想ノードにスケジュールできます。

nodeSelector:
  kubernetes.io/arch: arm64 

Pod の YAML ファイルのサンプル:

  • Pod には仕様が指定されていません。

    ECS インスタンスタイプを指定しない場合、システムはデフォルトで ecs.c8y.large (2 vCPU、4 GiB メモリの ARM ベースのインスタンスタイプ) を使用します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # Pod を仮想ノードにスケジュールします。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # ARM アーキテクチャベースのイメージを使用します。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # ARM ベースのノードを指定します。
  • vCPU とメモリの仕様が指定されています。

    vCPU とメモリリソースを指定すると、システムは ECI がサポートするインスタンスタイプから、一致する ARM ベースの ECS インスタンスタイプを自動的に選択します。

    説明

    vCPU とメモリは、コンテナの `limits` または `requests` フィールドを定義する (`limits` の使用を推奨) か、k8s.aliyun.com/eci-use-specs アノテーションを追加することで指定できます。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # Pod を仮想ノードにスケジュールします。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # ARM アーキテクチャベースのイメージを使用します。
            command: ["sleep"]
            args: ["999999"]
            resources:
              limits:
                cpu: "1000m"      # 1 vCPU を指定します。
                memory: "4096Mi"   # nginx コンテナに 4 GiB のメモリを指定します。
          nodeSelector:
            kubernetes.io/arch: arm64  # ARM ベースのノードを指定します。
  • ARM ベースの ECS インスタンスタイプを指定する場合

    仕様に特別な要件がある場合は、k8s.aliyun.com/eci-use-specs アノテーションを使用して特定の Arm 仕様を指定できます。ECI がサポートする Arm 仕様の詳細については、「Pod を作成するための Arm 仕様の指定」をご参照ください。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-use-specs: "ecs.c8y.large,ecs.g8y.large"   # サポートされている ARM ベースの ECS インスタンスタイプを指定します。最大 5 つのタイプを指定できます。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # ARM アーキテクチャベースのイメージを使用します。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # Pod を ARM ベースのノードにスケジュールします。

Toleration と nodeAffinity を使用したマルチアーキテクチャイメージのスケジューリング設定

マルチアーキテクチャイメージを使用し、x86 と ARM の両方のアーキテクチャにまたがって Pod をスケジュールする必要がある場合は、Toleration と `nodeAffinity` を使用して、ARM ベースまたは x86 ベースの仮想ノードへのスケジューリングプリファレンスを設定できます。

重要

以下の YAML ファイルに基づいて `nodeAffinity` を使用してノードアフィニティを設定する前に、クラスターで仮想ノードベースの Pod スケジューリング機能が有効になっていることを確認してください。詳細については、「ACK クラスターの仮想ノードベースの Pod スケジューリングポリシーの有効化」をご参照ください。

Pod の YAML ファイルのサンプル:

  • ARM ベースのノードを優先する場合

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # Pod を仮想ノードにスケジュールします。
        spec:
          tolerations:                 # ARM ベースのノードの Taint を許容します。
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
          affinity:                 
            nodeAffinity:     
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                preference:
                  matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                    - arm64       # ARM ベースのノードを優先します。
          containers:
          - name: nginx
            image: nginx                          # マルチアーキテクチャイメージを使用します。
            command: ["sleep"]
            args: ["999999"]
  • x86 ベースの仮想ノードに優先的にスケジュールする場合

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # Pod を仮想ノードにスケジュールします。
        spec:
          tolerations:                 # ARM ベースのノードの Taint を許容します。
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
          affinity:                 
            nodeAffinity:     
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                preference:
                  matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                    - amd64         # x86 ベースのノードを優先します。
          containers:
          - name: nginx
            image: nginx                          # マルチアーキテクチャイメージを使用します。
            command: ["sleep"]
            args: ["999999"]

参考