配置Arm节点池

更新时间: 2023-07-10 12:24:46

容器服务ACK已完整支持云服务器Arm节点池的生命周期管理,包括节点添加、扩容、升级、删除。同时ACR支持多架构镜像的管理,使用统一镜像部署在Arm和x86节点池中,简化ACK基础组件和用户应用在多架构集群中的管理。本文详细介绍了如何创建Arm集群和节点池以及将应用部署到Arm节点上。

使用限制

  • 配置Arm节点池的集群版本≥1.20。

  • Arm节点的操作系统只支持Alibaba Cloud Linux 3。

  • 组件中心中支持Arm的组件列表:

    • 核心组件

    • 日志和监控

    • 存储

    • 网络

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

步骤一:创建Arm集群和节点池

重要
  • 在混用Arm和x86节点的容器集群中,为了防止非Arm应用和组件被错误的调度到Arm节点上,建议为Arm节点添加污点kubernetes.io/arch=arm64:NoSchedule,确保只有指定运行在Arm节点上的应用和组件才会被调度到Arm节点上。

  • 通过nodeSelector或者nodeAffinity指定Arm节点部署应用的情况下,在ACK Kubernetes 1.24及之后的版本中,调度器会自动容忍污点 kubernetes.io/arch=arm64:NoSchedule,您不需要额外添加容忍此污点的声明。

方案一:创建集群时添加Arm节点

使用这种方案,您可以创建一个只包含Arm节点的新集群。

创建集群,详细信息请参见创建Kubernetes托管版集群。在集群创建过程中,进行节点池配置时,在实例规格区域,架构选择ARM计算,然后按需选择所需实例规格。然后配置其他参数,完成集群创建。

说明

方案二:创建一个Arm节点池

使用这种方案,您可以在已有集群上创建一个包含Arm节点的节点池。

创建节点池,详细信息请参见操作步骤。在节点池创建过程中,在实例规格区域,架构选择ARM计算,然后按需选择所需实例规格。然后配置其他参数,完成节点池创建。

说明

步骤二:将应用部署到Arm节点上

为了让应用运行在Arm节点上,您的应用需要支持Arm架构。您可以使用多架构容器镜像,或者推送针对Arm编译的容器镜像。

指定应用运行在Arm节点上

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

方式一:使用nodeSelector指定应用部署到Arm节点上

您可以通过在Pod的Spec增加如下约束,指定应用部署在Arm节点上。

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

此约束指定Pod只能被调度到带有Label kubernetes.io/arm=arm64的节点上。

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

下面的示例将Nginx部署到Arm节点上。

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

方式二:使用nodeAffinity指定应用部署到Arm节点上

除了使用nodeSelector,您还可以通过在Pod上增加如下约束,使用节点亲和性声明指定应用部署到Arm节点上。

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

此约束指定Pod只能被调度到带有Label kubernetes.io/arm=arm64的节点上。

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

下面的示例同样指定将Nginx部署到Arm节点上。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: nginx
        image: nginx:1.14.2

使用多架构容器镜像

多架构容器镜像支持在一个镜像内包含多种架构的镜像,例如同时支持amd64和Arm的镜像,它可以运行在Arm节点上,也可以运行在amd64节点上。为了推送多架构镜像,镜像客户端和镜像服务器都需要支持多架构,目前阿里云镜像服务ACR已经支持多架构镜像。

下面的实例演示如何构建和推送一个nginx多架构镜像。

  1. 准备支持amd64的镜像和支持Arm的镜像。本例中使用的两个镜像为registry.cn-hangzhou.aliyuncs.com/acs/myapp:amd64registry.cn-hangzhou.aliyuncs.com/acs/myapp:arm

  2. 执行如下命令,创建多架构镜像。

    docker manifest create registry.cn-hangzhou.aliyuncs.com/acs/myapp \
        --amend registry.cn-hangzhou.aliyuncs.com/acs/myapp:amd64 \
        --amend registry.cn-hangzhou.aliyuncs.com/acs/myapp:arm64
  3. 使用docker manifest push命令,将多架构镜像registry.cn-hangzhou.aliyuncs.com/acs/myapp:latest推送到镜像仓库。

    docker manifest push registry.cn-hangzhou.aliyuncs.com/acs/myapp

    接下来就可以在Pod中使用这个镜像了。

将社区多架构镜像同步到自己的仓库中

很多开源软件都提供了容器镜像,并且支持多架构。为了让应用在ACK上部署更快,您可以将这些镜像同步到您自己的ACR仓库中。下面以nginx:1.23.2为例,介绍如何在自己的ACR仓库中添加一份nginx多架构镜像。

  1. 执行如下命令,拉取amd64镜像,并将tag重命名为nginx:1.23.2-amd64

    docker pull --platform linux/amd64 nginx:1.23.2
    docker tag nginx:1.23.2 nginx:1.23.2-amd64
  2. 执行如下命令,拉取Arm镜像,并将tag重命名为nginx:1.23.2-arm64

    docker pull --platform linux/arm64 nginx:1.23.2
    docker tag nginx:1.23.2 nginx:1.23.2-arm64
  3. 执行如下命令,创建多架构镜像,请将下面的仓库地址替换成您的仓库地址。

    docker manifest create registry.cn-hangzhou.aliyuncs.com/acs/nginx:1.23.2 \ #
        --amend nginx:1.23.2-arm64 \
        --amend nginx:1.23.2-amd64
  4. 执行如下命令,推送多架构镜像,请将下面的仓库地址替换成您的仓库地址。

    docker manifest push registry.cn-hangzhou.aliyuncs.com/acs/nginx:1.23.2

相关文档

云服务器ECS ARM实例规格族

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