デフォルトでは、コンテナサービス 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 ベースの仮想ノードをクラスタに追加できます。
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**** # vSwitch ID。少なくとも 1 つの vSwitch が、ARM ベースのエラスティックコンテナインスタンスを作成できるゾーンにデプロイされています。 vpcId: vpc-2zeghwzptn5zii0w7****クラスタで生成された ARM ベースの仮想ノードを表示します。
kubectl get nodeコマンドを実行して、ノードに関する情報を表示します。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"]
参考文献
ACK クラスタ:ARM ベースのノードにワークロードをスケジュールする
ACK Serverless クラスタ:ARM ベースの仮想ノードにワークロードをスケジュールする