工作负载亲和/反亲和调度概述
在Kubernetes中,工作负载亲和/反亲和调度允许您根据现有Pod的标签和拓扑域(如节点、可用区等)来调度新的Pod。这有助于优化资源利用、减少网络延迟和提高应用性能。
拓扑域
拓扑域是通过节点的标签(topologyKey)来定义的。例如,kubernetes.io/hostname可以将每个节点视为一个独立的拓扑域,而failure-domain.beta.kubernetes.io/zone则可以将每个可用区视为一个拓扑域。
调度策略类型
负载亲和:
不配置:默认行为,不进行特殊调度。
优先多可用区部署:通过Pod反亲和策略,尽量将Pod分散到不同的可用区。
强制多可用区部署:强制将Pod分散到不同的可用区,如果无法满足,则Pod无法调度。
自定义亲和策略:根据Pod标签实现灵活的调度策略。
自定义亲和策略:
工作负载亲和性:
必须满足(硬约束):如果满足条件的Pod已经存在于某个拓扑域,则新Pod必须调度到该拓扑域。
尽量满足(软约束):如果满足条件的Pod已经存在于某个拓扑域,则新Pod优先调度到该拓扑域,但不是必须的。
工作负载反亲和性:
必须满足(硬约束):如果满足条件的Pod已经存在于某个拓扑域,则新Pod不能调度到该拓扑域。
尽量满足(软约束):如果满足条件的Pod已经存在于某个拓扑域,则新Pod尽量不调度到该拓扑域,但不是必须的。
策略设置参数说明
参数 用途 说明 权重(Weight) 在“尽量满足”(Preferred)策略中,权重用于评估节点对Pod的适合程度。 取值范围:1-100
调度器会计算每个节点的总评分,该评分由节点的其他优先级函数评分和此权重附加的评分相加得出。Pod将被调度到总评分最高的节点上。命名空间(Namespace) 指定调度策略生效的命名空间。 调度策略将仅应用于指定命名空间内的Pod和节点。 拓扑域(Topology Domain) 通过节点的标签和标签值定义调度的节点范围。 使用topologyKey(如kubernetes.io/hostname或kubernetes.io/os)来划分拓扑域。
kubernetes.io/hostname:每个节点是一个独立的拓扑域,适用于单个节点级别的亲和性调度。
kubernetes.io/os:具有相同操作系统的节点属于同一拓扑域,适用于将多个节点作为一个整体进行调度。
标签名(Label Name) 设置工作负载亲和/反亲和性时,指定需要匹配的Pod标签。 调度器将查找具有指定标签名的Pod,并根据亲和/反亲和规则进行调度。 操作符(Operator) 定义标签匹配关系。 取值范围:
In:Pod的标签值在指定的标签值列表中。
NotIn:Pod的标签值不在指定的标签值列表中。
Exists:Pod存在指定的标签名。
DoesNotExist:Pod不存在指定的标签名。
标签值(Label Value) 设置工作负载亲和/反亲和性时,指定Pod标签对应的值。 与标签名和操作符一起使用,用于确定Pod是否符合亲和/反亲和规则。
配置负载亲和/反亲和调度策略
进入创建负载的页面,在高级配置中,选择调度策略,在负载亲和配置中,添加亲和与反亲和策略。
例如,将新创建的前端应用(附带app=frontend标签)负载分散调度,同时与后端应用(附带app=backend标签)尽量部署到同个zone同一个节点,在负载亲和配置中通过kubernetes.io/hostname拓扑域,每个这样的域仅包含一个节点,在执行工作负载亲和性调度时,可以确保将它们尽量部署到同一节点上;通过topology.kubernetes.io/zone拓扑域,将前后端的负载部署到同个zone。在负载反亲和配置中,通过topology.kubernetes.io/zone拓扑域,将前端负载分散到不同的zone,通过kubernetes.io/hostname拓扑域,尽量将前端负载分散到不同的节点上。