调度负载至Arm节点
为了避免只兼容x86架构的工作负载被意外调度到Arm节点,包括Arm架构的ECS节点以及Arm架构的虚拟节点,ACK集群默认会将所有工作负载调度到x86架构的节点。如果您要将工作负载部署到Arm节点上,请使用nodeSelector
指定应用部署到Arm节点上。本文介绍如何调度ACK集群的负载至Arm节点。
索引
概述
为了在ACK集群中部署Arm工作负载,需要遵循以下步骤:
添加Arm架构的节点。
调度工作负载到Arm节点上。
在ACK集群中,可以通过添加Arm架构的节点池或者虚拟节点来使用Arm架构的实例。
为了避免只兼容x86架构的工作负载被意外调度到Arm节点,包括Arm架构的ECS节点以及Arm架构的虚拟节点,ACK集群默认会将所有工作负载调度到x86架构的节点。如果您要将工作负载部署到Arm节点上,请使用nodeSelector
指定应用部署到Arm节点上。关于nodeSelector
的详细信息,请参见指定应用运行在Arm节点上。
前提条件
关于集群:
已创建集群,且集群版本为1.20及以上。详细信息,请参见创建ASK集群。
目前Arm实例仅在以下地域可用区开放,请保证集群在以下地域。
华东1(杭州):可用区J、K
华东2(上海):可用区M、N
华北2(北京):可用区I、L、H
华南1(深圳):可用区F
已安装ack-virtual-node组件,且组件版本为v2.9.0及以上。详细信息,请参见ack-virtual-node。
已安装kube-scheduler组件,且满足以下版本要求。安装kube-scheduler组件,请参见kube-scheduler。
ACK集群版本
kube-scheduler最低版本要求
1.24
1.24-ack-4.1
1.22
1.22-ack-4.1
1.20
1.20-ack-10.2
注意事项
创建的Arm架构类型的ECI Pod,按照实际生成的ECS规格进行计费,不按照vCPU和内存计费。
ECI Pod创建成功后,您可以执行kubectl describe pod
命令查看其YAML详情。通过k8s.aliyun.com/eci-instance-spec
字段确认ECI Pod实际使用的ECS规格,ECI会按照该ECS规格进行计费。
关于Arm架构的ECS规格的详细信息,请参见:
步骤一:添加Arm架构的节点
方式一:添加Arm架构的节点池
对于ACK集群,可以通过配置Arm节点池来将应用部署到Arm节点上。具体操作,请参见步骤一:创建Arm集群和节点池。
方式二:添加Arm架构的虚拟节点
在ACK集群中使用Arm架构的虚拟节点功能,目前仅支持白名单开放,如需使用,请提交工单。
在ACK中部署Arm工作负载之前,需要先创建Arm架构的虚拟节点(virtual-node)。ACK中通过配置ECI Profile,创建出支持Arm架构类型的virtual-node。您可以通过以下两种方式编辑eci-profile配置文件。关于ECI Profile的详细信息,请参见配置ECI Profile。
方式一:通过kubectl edit命令
执行如下命令,编辑Configmap。
kubectl edit configmap eci-profile -n kube-system
添加或者修改参数
enableLinuxArm64Node
为true
。设置
vSwitchIds
,保证当前集群使用的vSwitchIds
中,至少有一个支持Arm实例的可用区的vSwitch。说明如果集群已有vSwitch的所处可用区均未支持Arm实例,您需要先创建指定可用区的vSwitch。创建成功后,将vSwitch的ID添加进
vSwitchIds
中。关于创建指定可用区的vSwitch,请参见创建和管理交换机。
方式二:通过容器服务管理控制台
登录容器服务管理控制台,在左侧导航栏单击集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。选择命名空间为kube-system,找到eci-profile单击编辑,将键值
enableLinuxArm64Node
修改为true
。检查
vSwitchIds
,保证当前集群使用的vSwitchIds
中,至少有一个支持Arm实例的可用区的vSwitch。然后单击确定。修改完成后,等待大概30s即创建出名为
virtual-kubelet-<zoneId>-linux-arm64
的虚拟节点。说明如果集群已有vSwitch的所处可用区均未支持Arm实例,您需要先创建指定可用区的vSwitch。创建成功后,将vSwitch的ID添加进
vSwitchIds
中。关于创建指定可用区的vSwitch,请参见创建和管理交换机。
步骤二:调度工作负载到Arm节点上
场景一:使用节点选择器调度Arm工作负载
通过使用nodeSelector将Pod调度到Arm架构的ECS节点和虚拟节点,需要将以下内容添加到Arm工作负载的描述文件中。
nodeSelector:
kubernetes.io/arch: arm64 # 指定Arm节点。
节点选择器指定此工作负载仅调度到具有Arm64标签的节点,ACK集群中的Arm架构的节点都具有此标签。部署到支持Arm架构的ECS节点的工作负载的简单示例如下。
以上示例可以将工作负载部署到支持Arm架构的ECS节点或者虚拟节点(virtual-node)上,如仅需部署到ARM架构的ECS节点上,需要删除容忍,示例如下。
场景二:多架构镜像调度
如果您的应用镜像为多架构镜像,需要配置跨x86和Arm架构的节点调度。通过配置以下节点亲和性达到将工作负载优先调度到Arm架构的节点或者优先调度到x86架构节点的效果。
将工作负载优先调度到Arm架构上
如果您的应用镜像为多架构镜像,需要配置跨x86和Arm架构的节点调度,通过配置以下节点亲和性将工作负载优先调度到Arm架构的节点上(包括virtual-node)。
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
优先调度到Arm架构的节点上的工作负载的示例如下。
如果您只想将工作负载调度至ACK集群中的Arm架构的ECS节点上,可以删除对virtual-node的容忍,从而避免调度到virtual-node上。示例如下。
将工作负载优先调度到x86架构上
通过配置节点亲和性可以将工作负载优先调度到x86架构的节点(包括:virtual-node)上。优先调度到x86架构的节点上的工作负载的示例如下。
如果您只想将工作负载调度至ACK集群中的x86架构的ECS节点上,可以删除对virtual-node的容忍,从而避免调度到virtual-node上。
常见问题
是否可以使用Arm架构类型的竞价(Spot)实例?
目前已经提供Arm架构的竞价实例。关于使用方式,请参见使用抢占式实例。
在相应区域创建集群后,如何配置网络来创建出支持Arm可用区的虚拟节点?
在相应可用区创建ACK集群后,通过配置eci-profile中vSwitchIds
字段,选择支持Arm实例的可用区的vsw,从而保证创建出支持Arm架构的虚拟节点。
在ACK集群中使用Arm架构节点的限制?
目前,对于Arm架构,组件中心仅支持以下组件:
核心组件
日志和监控
存储
网络
应用市场的组件不支持Arm。