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

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

最終更新日:Dec 28, 2024

デフォルトでは、コンテナサービス Kubernetes 版 (ACK) クラスタと ACK Serverless クラスタのポッドは、仮想ノード上でエラスティックコンテナインスタンスとして実行するようにスケジュールされると、x86 ベースの仮想ノード上で実行するようにスケジュールされます。アプリケーションが ARM アーキテクチャにデプロイされている場合は、nodeSelector フィールドを追加して、仮想ノード上でポッドを実行するようにスケジュールするときに使用する仮想ノードを指定する必要があります。このトピックでは、ARM ベースの仮想ノードにポッドをスケジュールする方法について説明します。

前提条件

クラスタは次の要件を満たしています。

  • クラスタが存在するリージョンで、ARM ベースのエラスティックコンテナインスタンスがサポートされています。

    Elastic Compute Service (ECS) の g8y、c8y、および r8y ARM ベースインスタンスファミリを使用して、エラスティックコンテナインスタンスを作成できます。ARM ベースのエラスティックコンテナインスタンスを作成できるリージョンについては、各リージョンで使用可能な ECS インスタンスタイプを参照してください。

  • クラスタは Kubernetes 1.20 以後で実行されています。

  • クラスタ内の ACK 仮想ノード コンポーネントのバージョンは、ARM ベースのノードをサポートしています。

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

注意事項

ARM ベースの仮想ノードでポッドを実行するようにスケジュールすると、使用された vCPU とメモリ仕様ではなく、実際の ARM 仕様に基づいて対応するエラスティックコンテナインスタンスの料金が請求されます。

説明

エラスティックコンテナインスタンスベースのポッドを作成した後、kubectl describe pod <ポッド名> コマンドを実行してポッドの詳細を表示し、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****   # vSwitch ID。少なくとも 1 つの vSwitch が、ARM ベースのエラスティックコンテナインスタンスを作成できるゾーンにデプロイされています。
      vpcId: vpc-2zeghwzptn5zii0w7****
  2. クラスタで生成された ARM ベースの仮想ノードを表示します。

    kubectl get node コマンドを実行して、ノードに関する情報を表示します。ARM ベースの仮想ノードがクラスタに自動的に生成されます。

    ARM节点

ARM ベースの仮想ノードにポッドをスケジュールする

nodeSelector フィールドを設定する

ACK クラスタと ACK Serverless クラスタでは、すべての ARM ベースの仮想ノードに kubernetes.io/arch: arm64 ラベルが付いています。エラスティックコンテナインスタンスベースのポッドを作成するときに、nodeSelector フィールドを使用して ARM ベースの仮想ノードを指定し、そのノードでポッドを実行するようにスケジュールできます。

nodeSelector:
  kubernetes.io/arch: arm64 

ポッドの YAML ファイルのサンプル:

  • ポッドに仕様が指定されていません。

    ポッドに仕様を指定しない場合、システムは自動的に 2 つの vCPU と 4 GiB のメモリを持つ ARM ベースの ECS インスタンスタイプ (ecs.c8y.large) を使用します。

    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"    # ポッドを仮想ノードにスケジュールします。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # ARM ベースのイメージを使用します。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # ARM ベースの仮想ノードを指定します。
  • vCPU とメモリ仕様が指定されています。

    vCPU とメモリ仕様を指定すると、システムはエラスティックコンテナインスタンスでサポートされている ECS インスタンスタイプから、vCPU とメモリ仕様を満たす ARM ベースの ECS インスタンスタイプを自動的に選択します。

    説明

    コンテナの limits または requests パラメータを使用して、vCPU とメモリ仕様を指定できます。limits パラメータを使用することをお勧めします。k8s.aliyun.com/eci-use-specs アノテーションを追加して、vCPU とメモリ仕様を指定することもできます。

    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"    # ポッドを仮想ノードにスケジュールします。
        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 インスタンスタイプが指定されています。

    ECS インスタンスタイプに特定の要件がある場合は、k8s.aliyun.com/eci-use-specs アノテーションを追加して、ARM ベースの ECS インスタンスタイプを指定できます。エラスティックコンテナインスタンスの作成に使用できる ARM ベースの ECS インスタンスタイプについては、ARM ベースの ECS インスタンスタイプを指定してポッドを作成するを参照してください。

    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 つの ECS インスタンスタイプを指定できます。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # ARM ベースのイメージを使用します。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # ポッドを ARM ベースのノードにスケジュールします。

tolerations と nodeaffinity を設定してマルチアーキテクチャイメージをスケジュールする

アプリケーションイメージがマルチアーキテクチャイメージで、x86 と ARM アーキテクチャにまたがるポッドスケジューリングを設定する場合、tolerations と nodeAffinity を設定して、ARM ベースまたは x86 ベースの仮想ノードに優先的にポッドをスケジュールできます。

重要

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

ポッドの 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"    # ポッドを仮想ノードにスケジュールします。
        spec:
          tolerations:                 # ARM アーキテクチャを許容するノードのテイント。
          - 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: arm64v8/centos:7.9.2009   # マルチアーキテクチャイメージを使用します。
            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"    # ポッドを仮想ノードにスケジュールします。
        spec:
          tolerations:                 # ARM アーキテクチャを許容するノードのテイント。
          - 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: arm64v8/centos:7.9.2009   # マルチアーキテクチャイメージを使用します。
            command: ["sleep"]
            args: ["999999"]

参考文献