全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:创建Arm节点池并调度工作负载至Arm节点

更新时间:Jan 24, 2025

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

前提条件

  • 已创建1.20及以上版本的集群,且操作系统为Alibaba Cloud Linux 3。更多信息,请参见创建集群升级集群

    说明
    • ACK组件中心中,仅核心组件日志和监控存储网络类的组件支持在Arm节点池中使用。

    • 应用市场的组件不支持在Arm节点池中使用。

  • 已安装kube-scheduler组件,请参见管理组件

注意事项

如果您的ACK集群同时存在Arm节点和x86节点,为了防止不支持Arm的应用和组件被错误地调度到Arm节点,请为Arm节点添加污点kubernetes.io/arch=arm64:NoSchedule。如果您的集群版本为v1.24之前,在使用nodeSelector或者nodeAffinity指定应用调度至Arm节点时,您需要同时声明污点容忍kubernetes.io/arch=arm64:NoScheduletolerations。如果您的集群版本为v1.24版本及之后,调度器能够自动识别Arm节点的污点kubernetes.io/arch=arm64:NoSchedule,无需您额外声明tolerations

相关计费

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

创建Arm集群或节点池

您可以在新建ACK集群时添加Arm节点,创建一个只包含Arm节点的新集群;也可以在已有集群中新建一个Arm节点池,创建一个包含Arm节点的节点池。

新建集群时添加

在集群创建的节点池配置过程中,在实例规格区域,架构选择ARM 计算,选择通用型实例规格族g8m的实例规格,然后按需配置其他参数,完成集群的创建。关于创建集群的配置介绍,请参见创建ACK托管集群image.png

说明

您可以前往ECS实例可购买地域,查看实例在各地域的可购情况。

新建一个节点池

在节点池创建过程中,在实例规格区域,架构选择ARM 计算,然后按需配置其他参数,完成节点池的创建。关于创建节点池的配置介绍,请参见创建和管理节点池image.png

说明

您可以前往ECS实例可购买地域,查看实例在各地域的可购情况。

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

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

nodeSelector

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

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

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

展开查看YAML文件

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节点。
      containers:
      - name: nginx
        image: nginx

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文件

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
      containers:
      - name: nginx
        image: nginx

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

ACK集群默认会将所有工作负载调度到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文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: arm-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
# 优先调度到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文件

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:
# 优先调度到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架构的竞价实例。关于使用方式,请参见使用抢占式实例

在ACK集群中使用Arm架构节点有哪些限制?

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

  • 核心组件

  • 日志和监控

  • 存储

  • 网络

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

相关文档