调度负载至Arm节点

更新时间: 2023-08-08 10:41:12

为了避免只兼容x86架构的工作负载被意外调度到Arm节点,包括Arm架构的ECS节点以及Arm架构的虚拟节点,ACK集群默认会将所有工作负载调度到x86架构的节点。如果您要将工作负载部署到Arm节点上,请使用nodeSelector指定应用部署到Arm节点上。本文介绍如何调度ACK集群的负载至Arm节点。

索引

概述

为了在ACK集群中部署Arm工作负载,需要遵循以下步骤:

  1. 添加Arm架构的节点。

  2. 调度工作负载到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
  1. 添加或者修改参数enableLinuxArm64Nodetrue

  2. 设置vSwitchIds,保证当前集群使用的vSwitchIds中,至少有一个支持Arm实例的可用区的vSwitch。

    说明

    如果集群已有vSwitch的所处可用区均未支持Arm实例,您需要先创建指定可用区的vSwitch。创建成功后,将vSwitch的ID添加进vSwitchIds中。关于创建指定可用区的vSwitch,请参见创建和管理交换机

    展开查看YAML文件

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: eci-profile
      namespace: kube-system
    data:
      vpcId: "vpc-xxx"
      securityGroupId: "sg-xxx"
      vswitchIds: "vsw-111,vsw-222"
      # 设置virtual-node的架构,默认为false。
      enableLinuxArm64Node: "true"
      enableClusterIp: "true"
      enableHybridMode: "false"
      enablePrivateZone: "false"
      # 保证至少有一个支持Arm实例的可用区的vSwitch。
      vSwitchIds: vsw1-***************,vsw2-**************
      vpcId: vpc-******************

方式二:通过容器服务管理控制台

  1. 登录容器服务管理控制台,在左侧导航栏单击集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 配置项

  3. 选择命名空间kube-system,找到eci-profile单击编辑,将键值enableLinuxArm64Node修改为true

  4. 检查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节点的工作负载的简单示例如下。

展开查看YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
# 容忍virtual-node上的Taint,如果只想调度到ACK集群内的ECS节点上,则无需配置此容忍。
      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule
      nodeSelector:
        kubernetes.io/arch: arm64 # 指定Arm节点。
      containers:
      - name: nginx
        image: nginx

以上示例可以将工作负载部署到支持Arm架构的ECS节点或者虚拟节点(virtual-node)上,如仅需部署到ARM架构的ECS节点上,需要删除容忍,示例如下。

展开查看YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        kubernetes.io/arch: arm64 # 指定Arm节点。
      containers:
      - name: nginx
        image: nginx

场景二:多架构镜像调度

如果您的应用镜像为多架构镜像,需要配置跨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架构的节点上的工作负载的示例如下。

展开查看YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: arm-prefer
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
# 容忍virtual-node上的Taint,如果只想调度工作负载到ACK集群内的ECS节点上,则无需配置此容忍。
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule
# 容忍Arm架构的虚拟节点上的Taint。
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule
# 优先调度到Arm架构的节点上。
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: my-container
        image: nginx

如果您只想将工作负载调度至ACK集群中的Arm架构的ECS节点上,可以删除对virtual-node的容忍,从而避免调度到virtual-node上。示例如下。

展开查看YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: arm-prefer
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
# 容忍Arm架构的虚拟节点上的Taint。
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule
# 优先调度到Arm架构的节点上。
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: my-container
        image: nginx

将工作负载优先调度到x86架构上

通过配置节点亲和性可以将工作负载优先调度到x86架构的节点(包括:virtual-node)上。优先调度到x86架构的节点上的工作负载的示例如下。

展开查看YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: amd-prefer
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
# 容忍virtual-node上的Taint,如果只想调度工作负载到ACK集群内的ECS节点上,则无需配置此容忍。
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule
# 容忍Arm架构节点上的Taint。
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule
# 优先调度到x86架构的节点上。
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - amd64
      containers:
      - name: my-container
        image: nginx

如果您只想将工作负载调度至ACK集群中的x86架构的ECS节点上,可以删除对virtual-node的容忍,从而避免调度到virtual-node上。

展开查看YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: amd-prefer
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations
# 容忍Arm架构节点上的Taint。
      - key: kubernetes.io/arch
        operator: Equal
        value: arm64
        effect: NoSchedule
# 优先调度到x86架构的节点上。
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - amd64
      containers:
      - name: my-container
        image: nginx

常见问题

是否可以使用Arm架构类型的竞价(Spot)实例?

目前已经提供Arm架构的竞价实例。关于使用方式,请参见使用抢占式实例

在相应区域创建集群后,如何配置网络来创建出支持Arm可用区的虚拟节点?

在相应可用区创建ACK集群后,通过配置eci-profilevSwitchIds字段,选择支持Arm实例的可用区的vsw,从而保证创建出支持Arm架构的虚拟节点。

在ACK集群中使用Arm架构节点的限制?

目前,对于Arm架构,组件中心仅支持以下组件:

  • 核心组件

  • 日志和监控

  • 存储

  • 网络

应用市场的组件不支持Arm。

阿里云首页 容器服务 Kubernetes 版 ACK 相关技术圈