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 ベースの仮想ノードをクラスターに追加します。
-
eci-profile を変更します。
kubectl edit configmap eci-profile -n kube-systemeci-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**** -
クラスターで生成された 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"]
参考
ACK クラスター: ARM ベースのノードへのワークロードのスケジューリング
ACK Serverless クラスター: ARM ベースの仮想ノードへのワークロードのスケジューリング