将Pod调度到虚拟节点以ECI运行时,ACK集群和ACK Serverless集群均默认将Pod调度到x86架构的虚拟节点上。如果您的应用采用Arm架构,需要您额外添加nodeSelector来指定Arm架构的虚拟节点。本文介绍如何将Pod调度到Arm架构的虚拟节点。
前提条件
请确认集群满足以下要求:
集群所属地域支持Arm实例。
目前ECI支持的Arm架构规格族为g8y、c8y和r8y,支持的地域请参见ECS实例规格可购买地域总览。
集群版本为1.20及以上。
集群中的ACK Virtual Node组件版本支持Arm节点。
集群中的kube-scheduler组件版本支持Arm节点。
注意事项
将Pod调度到Arm架构的虚拟节点上时,对应的ECI实例按照实际生成的Arm规格进行计费,不按vCPU和内存计费。
ECI Pod创建成功后,您可以通过kubectl describe pod <pod name>
命令查看Pod详情,通过k8s.aliyun.com/eci-instance-spec
字段确认Pod实际使用的ECS规格。
添加Arm架构的虚拟节点
您可以通过以下步骤修改eci-profile,在集群中添加Arm架构的虚拟节点。
修改eci-profile。
kubectl edit configmap eci-profile -n kube-system
在eci-profile的data中将enableLinuxArm64Node配置为true,同时确保配置的可用区中至少有一个可用区开放了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****
查看生成的节点。
配置enableLinuxArm64Node为true后,通过
kubectl get node
命令查看节点信息时,您可以看到集群已自动生成Arm节点。
将Pod调度到Arm架构的虚拟节点
通过nodeSelector调度
在ACK集群和ACK Serverless集群中,Arm架构的节点均带有kubernetes.io/arch: arm64
的标签,创建ECI Pod时,可以通过nodeSelector来指定Arm架构的节点,将Pod调度到Arm架构的虚拟节点上运行。
nodeSelector:
kubernetes.io/arch: arm64
YAML示例如下:
不指定规格
没有指定任何规格时,系统默认采用2 vCPU和4 GiB内存的Arm规格,即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和内存规格时,系统会从ECI支持的ECS Arm规格中自动选择一个符合vCPU和内存条件的Arm规格。
说明指定vCPU和内存规格时,可以直接定义Containers的limits或requests来指定(建议使用limits),也可以添加
k8s.aliyun.com/eci-use-specs
的Annotation来指定。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" # 指vCPU为1 vCPU。 memory: "4096Mi" # 指定nginx容器的内存为4 GiB。 nodeSelector: kubernetes.io/arch: arm64 # 指定Arm架构的节点。
指定ECS Arm规格
如果您对规格有特殊需求,可以通过
k8s.aliyun.com/eci-use-specs
的Annotation来指定具体的Arm规格。关于ECI支持的Arm规格,请参见指定Arm规格创建Pod。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" # 指定支持的ECS Arm规格,单次最多5个。 spec: containers: - name: nginx image: arm64v8/centos:7.9.2009 # 使用基于Arm架构的镜像。 command: ["sleep"] args: ["999999"] nodeSelector: kubernetes.io/arch: arm64 # 调度到Arm节点。
多架构镜像调度
如果您的应用镜像为多架构镜像,需要配置跨x86和Arm架构的节点调度,您可以通过tolerations和nodeAffinity实现将Pod优先调度到Arm架构或者x86架构的虚拟节点。
参考以下YAML使用nodeAffinity配置节点亲和性时,请确保集群已开启虚拟节点调度功能。具体操作,请参见开启集群虚拟节点调度策略。
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架构的节点的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: 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架构节点的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: arm64v8/centos:7.9.2009 # 使用多架构镜像。 command: ["sleep"] args: ["999999"]
相关文档
ACK集群:调度至Arm节点
ACK Serverless集群:调度至Arm虚拟节点