在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和对应容忍为例。
步骤一:为目标节点池设置污点
登录容器服务控制台,单击目标集群,从左侧导航栏进入页面,找到目标节点池,单击操作列的编辑。
在节点池编辑页面,单击高级选项(选填),找到污点 (Taints)条目。
新建键值对,键填入
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中建议加引号,避免被解析为布尔值导致标签匹配失败。