将工作负载调度到智能托管节点池

更新时间:
复制 MD 格式

在ACK Auto Mode集群中运行工作负载时,可能需要精确控制Pod运行在智能托管节点池(即Auto Mode节点)还是其他节点池上。本文介绍如何使用节点选择器(nodeSelector)、亲和性规则(affinity)以及污点与容忍(Taint/Toleration),将工作负载精准调度到期望的节点池。

工作原理

Auto Mode节点在创建时即带有标签alibabacloud.com/auto-mode=true,通过该标签并结合节点选择器(nodeSelector)、节点亲和性(nodeAffinity)以及污点与容忍(Taint/Toleration),可精细控制工作负载是否调度到由Auto Mode管理的节点上,实现多种调度策略。

工作负载调度策略实现

策略一:强制调度到智能托管节点池

若要求工作负载必须被调度到Auto Mode节点上,可按照如下示例片段编辑目标工作负载YAML,使用nodeSelector:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      nodeSelector:
        alibabacloud.com/auto-mode: "true"

策略二:优先但不强制调度到智能托管节点池

若希望工作负载"优先但不强制"调度到Auto Mode节点,并在无Auto Mode节点可用时允许回退到其他节点,可按照如下示例片段编辑目标工作负载YAML,使用软亲和性preferredDuringSchedulingIgnoredDuringExecution。

affinity:
  nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      preference:
        matchExpressions:
        - key: alibabacloud.com/auto-mode
          operator: In
          values:
          - "true"

策略三:禁止调度到智能托管节点池

若不允许将工作负载调度到Auto Mode节点上,可按照如下示例片段编辑目标工作负载YAML,使用nodeAffinity并配合NotIn运算符。此时工作负载仅会被调度到普通节点池、自定义托管节点池等非Auto Mode节点上。

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: alibabacloud.com/auto-mode
          operator: NotIn
          values:
          - "true"

策略四:节点侧反向控制

若希望从节点侧进行反向控制,可利用污点(Taint)与容忍(Toleration)来实现:为 Auto Mode 之外的节点池打上污点,仅让声明了对应容忍的工作负载调度上去,从而将默认(未声明容忍的)工作负载调度到 Auto Mode 节点。此处以污点dedicated=stateful:NoSchedule和对应容忍为例。

步骤一:为目标节点池设置污点

  1. 登录容器服务控制台,单击目标集群,从左侧导航栏进入节点管理 > 节点池页面,找到目标节点池,单击操作列的编辑。

  2. 在节点池编辑页面,单击高级选项(选填),找到污点 (Taints)条目。

  3. 新建键值对,键填入dedicated,值填入stateful,Effect选择NoSchedule,单击确认。

步骤二:为工作负载设置容忍

为目标节点池设置污点dedicated=stateful:NoSchedule后,可按照如下示例片段编辑目标工作负载YAML,仅携带以下容忍的工作负载可调度到目标节点池。

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      tolerations:
      - key: dedicated
        operator: Equal
        value: stateful
        effect: NoSchedule

注意事项

  • nodeSelector 与 nodeAffinity 自下而上定义工作负载的调度期望,taints 与 tolerations 则自上而下实施节点的访问控制,可组合使用以实现更精细的调度隔离。

  • nodeSelector并非必需。若集群不以混合模式运行,即所有节点均由Auto Mode管理,则无需添加nodeSelector,其仅在存在多种资源池时才有意义。

  • 上述调度策略的典型适用场景为混合模式集群中区分静态容量(如自定义托管节点池)与动态弹性容量(Auto Mode),例如将常驻的有状态服务固定在自定义托管节点池、将弹性伸缩的无状态服务交给智能托管节点池承载。

  • alibabacloud.com/auto-mode标签的值为字符串"true",在YAML中建议加引号,避免被解析为布尔值导致标签匹配失败。