赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 弹性容器实例 ECI
  4. 操作指南
  5. 调度
  6. 调度至Arm虚拟节点

调度至Arm虚拟节点

  • 调度
  • 发布于 2025-04-15
  • 0 次阅读
文档编辑
文档编辑

ACK Serverless集群默认会将所有工作负载调度到x86架构的虚拟节点。如果您的集群中既有Arm虚拟节点,又有非Arm虚拟节点(例如x86虚拟节点),为了确保只兼容Arm架构的工作负载调度到Arm虚拟节点,或多架构镜像优先调度到Arm虚拟节点,您可以基于Kubernetes原生调度配置来实现。

前提条件

  • 集群:

    已创建ACK Serverless集群,且集群版本为1.20及以上,请参见创建集群、手动升级集群。

    说明

    Arm实例开放的地域及可用区是存在限制,请保证集群在已开放地域。查询Arm实例开放的地域及可用区,请参见ECS实例规格可购买地域总览。

  • 组件:已安装ack-virtual-node组件,且组件版本为2.9.0及以上。详细信息,请参见ACK Virtual Node。

注意事项

如果您的集群版本为1.24之前,在使用nodeSelector或者nodeAffinity指定应用调度至Arm节点时,您需要同时声明污点容忍kubernetes.io/arch=arm64:NoSchedule的tolerations。如果您的集群版本为1.24及之后,调度器能够自动识别Arm节点的污点kubernetes.io/arch=arm64:NoSchedule,无需您额外声明tolerations。

相关计费

关于Arm架构的ECS规格及其定价的详细信息,请参见:

  • 实例规格族

  • ECS实例规格定价

  • ECS实例规格可购买地域总览

步骤一:添加Arm架构的虚拟节点

在集群中部署Arm工作负载之前,需要先创建Arm架构的虚拟节点(Virtual Node)。您可以通过配置ECI Profile创建支持Arm架构类型的虚拟节点。您可以通过以下两种方式编辑eci-profile配置文件。关于ECI Profile的详细信息,请参见配置eci-profile。

控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表。

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

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

    image.png

    说明

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

kubectl

前提条件

获取集群KubeConfig并通过kubectl工具连接集群。

操作步骤

执行如下命令,编辑ConfigMap。

kubectl edit configmap eci-profile -n kube-system
  1. 添加或修改参数enableLinuxArm64Node为true。

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

    说明

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

步骤二:指定工作负载调度到Arm虚拟节点

指定Arm架构的工作负载调度到Arm虚拟节点

如果您的集群中既有Arm节点也有非Arm节点,且您的应用只支持Arm架构,您可以指定应用运行在Arm节点上,以免应用Pod被调度到非Arm节点上导致启动失败。所有Arm节点上默认带有Labelkubernetes.io/arch=arm64,您可以通过两种方式nodeSelector和nodeAffinity指定应用部署到Arm节点上。

nodeSelector

您可以在Pod上增加如下约束,使用nodeSelector将Pod调度到Arm架构的virtual-node上。nodeSelector将指定此工作负载仅调度到具有arm64标签的节点,ACK Serverless集群中的Arm架构的virtual-node都具有此标签。

nodeSelector:
  kubernetes.io/arch: arm64 # 指定Arm节点。

您可以使用以下示例代码将一个无状态应用部署到Arm虚拟节点。

展开查看YAML文件

说明

下方YAML中添加了对kubernetes.io/arch=arm64:NoSchedule的容忍。如果您的集群为1.24及以上版本的ACK托管集群Pro版,ACK调度器会自动识别此污点,无需您额外声明容忍。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        kubernetes.io/arch: arm64 # 指定Arm节点。
      tolerations:
      # 容忍虚拟节点的Taint。
        - key: virtual-kubelet.io/provider
          operator: Exists
          effect: NoSchedule
      # 容忍Arm架构的虚拟节点上的Taint。
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule
      containers:
      - name: nginx
        image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0

nodeAffinity

前提条件

已开启集群虚拟节点调度策略,且集群版本、组件版本符合要求。

操作示例

您可以在Pod上增加如下约束,使用节点亲和性声明指定应用部署到Arm节点上。此约束指定Pod只能被调度到带有Label kubernetes.io/arm=arm64的节点上。

当Pod Spec上带有此约束时,调度器自动容忍节点上的污点kubernetes.io/arch=arm64:NoSchedule。

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/arch
          operator: In
          values:
          - arm64

您可以使用以下示例代码将一个无状态应用部署到Arm虚拟节点。

展开查看YAML文件

说明

下方YAML中添加了对kubernetes.io/arch=arm64:NoSchedule的容忍。如果您的集群为1.24及以上版本的ACK托管集群Pro版,ACK调度器会自动识别此污点,无需您额外声明容忍。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      tolerations:
       # 容忍虚拟节点的Taint。
        - key: virtual-kubelet.io/provider
          operator: Exists
          effect: NoSchedule
       # 容忍Arm架构的虚拟节点上的Taint。
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule         
      containers:
      - name: nginx
        image: nginx

指定多架构镜像调度到Arm虚拟节点

前提条件

已开启集群虚拟节点调度策略,且集群版本、组件版本符合要求。

操作示例

ACK Serverless集群默认会将所有工作负载调度到x86架构的虚拟节点,并在x86节点资源不足时保持等待x86节点资源。如果您的应用镜像为多架构镜像,例如同时支持x86和Arm架构,您需要配置跨x86和Arm架构的节点调度。

例如,您可以通过配置节点亲和性,使工作负载优先调度到Arm架构或x86架构的虚拟节点上,并在目标类型的虚拟节点资源不足时尝试调度至其他架构类型的虚拟节点。

      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64

优先调度到Arm架构

声明优先将工作负载调度到Arm虚拟节点的示例如下。

展开查看YAML文件

说明

下方YAML中添加了对kubernetes.io/arch=arm64:NoSchedule的容忍。如果您的集群为1.24及以上版本的ACK托管集群Pro版,ACK调度器会自动识别此污点,无需您额外声明容忍。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: arm-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
      # 容忍虚拟节点的Taint。
      - key: virtual-kubelet.io/provider
        operator: Exists
        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

优先调度到x86架构

声明优先将工作负载调度到x86虚拟节点的示例如下。

展开查看YAML文件

说明

下方YAML中添加了对kubernetes.io/arch=arm64:NoSchedule的容忍。如果您的集群为1.24及以上版本的ACK托管集群Pro版,ACK调度器会自动识别此污点,无需您额外声明容忍。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: amd-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
      # 容忍虚拟节点的Taint。
      - key: virtual-kubelet.io/provider
        operator: Exists
        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

常见问题

为什么配置nodeAffinity优先将Pod调度到Arm架构的节点,却调度到x86架构的ECS节点上?

集群调度器默认优先调度到ECS节点,ECS节点资源不足时调度到虚拟节点。在不修改调度器计分插件权重的情况下,如集群中存在资源充足的x86 ECS节点,即使通过nodeAffinity配置了优先调度到Arm架构的节点,Pod也可能会被调度到x86架构的ECS节点上。因此,通过本文中的nodeAffinity配置,只能保证不同架构(Arm/x86)虚拟节点的优先级,而无法保证虚拟节点和ECS节点的优先级。

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

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

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

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

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

目前,Arm架构不支持应用市场的组件;组件中心仅支持以下模块的组件:

  • 核心组件

  • 日志和监控

  • 存储

  • 网络

相关文档

  • 您可以使用阿里云容器镜像服务企业版(ACR EE)构建多架构容器镜像。具体操作,请参见构建多架构容器镜像。

  • 如果您需要创建并管理普通的Arm ECS节点,请参见调度至Arm节点。

  • 如果您有大数据任务需求且不想关心底层集群资源的运维工作,您可以使用Arm虚拟节点运行Spark作业。

相关文章

调度概述 2025-04-15 17:15

在ACK Serverless集群中,默认情况下无需配置调度,Pod会自动调度到Linux、x86架构的虚拟节点上。如果需要调度到其他架构或操作系统的虚拟节点,或者有可用区亲和或打散部署等需求,可参考本文选择合适的调度方式。 在

调度至Arm虚拟节点 2025-04-15 17:15

ACK Serverless集群默认会将所有工作负载调度到x86架构的虚拟节点。如果您的集群中既有Arm虚拟节点,又有非Arm虚拟节点(例如x86虚拟节点),为了确保只兼容Arm架构的工作负载调度到Arm虚拟节点,或多架构镜像优先调度到Arm虚拟节点,您可以基于Kubernetes原生调度配置来实现

开启集群虚拟节点调度策略 2025-04-15 17:15

开启虚拟节点调度策略后,ACK集群中的应用可以通过使用Kubernetes原生的Pod间亲和、地域间拓扑打散或节点亲和实现高可用、低时延等能力。 前提条件 已创建v1.22版本及以上的

实现虚拟节点Pod可用区打散以及亲和调度 2025-04-15 17:15

高可用以及高性能是分布式任务执行过程中的重要要求。在ACK Serverless集群Pro版中,您可以通过Kubernetes原生调度语义实现分布式任务的跨可用区打散,以达到高可用区部署的要求,或者通过Kubernetes原生调度语义实现分布式任务在指定可用区中的亲和性部署,以达到高性能部署的要求。

在容器服务 Serverless 版上部署有状态的高可用MySQL集群 2025-04-15 17:15

高可用是分布式应用的重要要求,在ACK Serverless集群中,您可以通过K8s原生调度语义实现分布式应用的跨可用区打散,以达到高可用部署的要求。本文档介绍如何在容器服务 Serverless 版上部署有状态的高可用MySQL集群。

向虚拟节点Pod注入Sidecar容器 2025-04-15 17:15

OpenKruise SidecarSet采用Admission Webhook机制,在创建Pod的阶段对匹配了目标Label的所有Pod注入Sidecar容器。此时Pod还未调度到虚拟节点,无法仅对调度到虚拟节点的Pod生效。您可以借助虚拟节点组件(ACK Virtual Node)仅为调度到虚拟

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号