调度Pod到Arm架构的虚拟节点

将Pod调度到虚拟节点以ECI运行时,ACK集群和ACK Serverless集群均默认将Pod调度到x86架构的虚拟节点上。如果您的应用采用Arm架构,需要您额外添加nodeSelector来指定Arm架构的虚拟节点。本文介绍如何将Pod调度到Arm架构的虚拟节点。

前提条件

请确认集群满足以下要求:

注意事项

将Pod调度到Arm架构的虚拟节点上时,对应的ECI实例按照实际生成的Arm规格进行计费,不按vCPU和内存计费。

说明

ECI Pod创建成功后,您可以通过kubectl describe pod <pod name>命令查看Pod详情,通过k8s.aliyun.com/eci-instance-spec字段确认Pod实际使用的ECS规格。

添加Arm架构的虚拟节点

您可以通过以下步骤修改eci-profile,在集群中添加Arm架构的虚拟节点。

  1. 修改eci-profile。

    kubectl edit configmap eci-profile -n kube-system

    在eci-profile的data中将enableLinuxArm64Node配置为true,同时确保配置的可用区中至少有一个可用区开放了Arm规格。示例如下:

    data:
      enableClusterIp: "true"
      enableHybridMode: "false"
      enableLinuxArm64Node: "true"    #开启Arm节点
      enableLogController: "false"
      enablePVCController: "false"
      enablePrivateZone: "false"
      enableReuseSSLKey: "false"
      featureGates: MetricsVpcNet=true,ProtectionFinalizers=false,WaitForFirstConsumer=false
      resourceGroupId: ""
      securityGroupId: sg-2zeg1fci0oq1hljo6h0a
      selectors: ""
      slsMachineGroup: ""
      vSwitchIds: vsw-2zewa5mb19wr45g63****,vsw-2zevanrscmoiaxryx****,vsw-2ze94pjtfuj9vaymf****   #配置的可用区中包含已开放Arm规格的可用区
      vpcId: vpc-2zeghwzptn5zii0w7****
  2. 查看生成的节点。

    配置enableLinuxArm64Node为true后,通过kubectl get node命令查看节点信息时,您可以看到集群已自动生成Arm节点。

    ARM节点

将Pod调度到Arm架构的虚拟节点

通过nodeSelector调度

在ACK集群和ACK Serverless集群中,Arm架构的节点均带有kubernetes.io/arch: arm64 的标签,创建ECI Pod时,可以通过nodeSelector来指定Arm架构的节点,将Pod调度到Arm架构的虚拟节点上运行。

nodeSelector:
  kubernetes.io/arch: arm64 

YAML示例如下:

  • 不指定规格

    没有指定任何规格时,系统默认采用2 vCPU和4 GiB内存的Arm规格,即ecs.c8y.large。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 调度到虚拟节点。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用基于Arm架构的镜像。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # 指定Arm架构的节点。
  • 指定vCPU和内存规格

    指定vCPU和内存规格时,系统会从ECI支持的ECS Arm规格中自动选择一个符合vCPU和内存条件的Arm规格。

    说明

    指定vCPU和内存规格时,可以直接定义Containers的limits或requests来指定(建议使用limits),也可以添加k8s.aliyun.com/eci-use-specs的Annotation来指定。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 调度到虚拟节点。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用基于Arm架构的镜像。
            command: ["sleep"]
            args: ["999999"]
            resources:
              limits:
                cpu: "1000m"      # 指vCPU为1 vCPU。
                memory: "4096Mi"   # 指定nginx容器的内存为4 GiB。
          nodeSelector:
            kubernetes.io/arch: arm64  # 指定Arm架构的节点。
  • 指定ECS Arm规格

    如果您对规格有特殊需求,可以通过k8s.aliyun.com/eci-use-specs的Annotation来指定具体的Arm规格。关于ECI支持的Arm规格,请参见指定Arm规格创建Pod

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true" 
          annotations:
            k8s.aliyun.com/eci-use-specs: "ecs.c8y.large,ecs.g8y.large"   # 指定支持的ECS Arm规格,单次最多5个。
        spec:
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用基于Arm架构的镜像。
            command: ["sleep"]
            args: ["999999"]
          nodeSelector:
            kubernetes.io/arch: arm64  # 调度到Arm节点。

多架构镜像调度

如果您的应用镜像为多架构镜像,需要配置跨x86和Arm架构的节点调度,您可以通过tolerations和nodeAffinity实现将Pod优先调度到Arm架构或者x86架构的虚拟节点。

重要

参考以下YAML使用nodeAffinity配置节点亲和性时,请确保集群已开启虚拟节点调度功能。具体操作,请参见开启集群虚拟节点调度策略

YAML示例如下:

  • 优先调度到Arm节点

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 调度到虚拟节点。
        spec:
          tolerations:                 # 容忍Arm架构的节点的Taint。
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
          affinity:                 
            nodeAffinity:     
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                preference:
                  matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                    - arm64       # 优先调度到Arm架构的节点。
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用多架构镜像。
            command: ["sleep"]
            args: ["999999"]
  • 优先调度到x86节点

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx-test
          labels:
            app: nginx
            alibabacloud.com/eci: "true"    # 调度到虚拟节点。
        spec:
          tolerations:                 # 容忍Arm架构节点的Taint。
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
          affinity:                 
            nodeAffinity:     
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                preference:
                  matchExpressions:
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                    - amd64         # 优先调度到x86架构的节点。
          containers:
          - name: nginx
            image: arm64v8/centos:7.9.2009   # 使用多架构镜像。
            command: ["sleep"]
            args: ["999999"]

相关文档