43 K8S 之节点 /Pod 亲和调度
节点亲和是调度程序用来确定 Pod 对象调度位置(哪个或哪类节点)的调度法则,这些规则基于节点上的自定义标签和 Pod 对象上指定的标签选择器进行定义,而支持这种调度机制的有 NodeName 和 NodeAffinity 调度插件。
在 Pod 上定义节点亲和规则时有两种类型的节点亲和关系:强制(required)亲和和首选(preferred)亲和,或分别称为硬亲和与软亲和。强制亲和限定了调度 Pod 资源时必须要满足的规则,无可用节点时 Pod 对象会被置为 Pending 状态,直到满足规则的节点出现。相比较来说,首选亲和规则实现的是一种柔性调度限制,它同样倾向于将 Pod 运行在某类特定的节点之上,但无法满足调度需求时,调度器将选择一个无法匹配规则的节点,而非将 Pod 置于 Pending 状态。
多个软亲和条件并存时,它还支持为每个条件定义 weight 属性以区别它们优先级,取值范围是 1~100,数字越大优先级越高。
在 Pod 规范上定义节点亲和规则的关键点有两个:一是给节点规划并配置合乎期望的标签;二是为 Pod 对象定义合理的标签选择器。
Pod 资源可以使用.spec.nodeName 直接指定要运行的目标节点,也可以基于.spec.nodeSelector 指定的标签选择器过滤符合条件的节点作为可用目标节点,最终选择则基于打分机制完成。
Pod 规范中的.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution 字段用于定义节点的强制亲和关系,它的值是一个对象列表,可由一到多个 nodeSelectorTerms 对象组成,彼此间为“逻辑或”关系。nodeSelectorTerms 用于定义节点选择器,其值为对象列表,它支持 matchExpressions 和 matchFields 两种复杂的表达机制。
Pod 间的亲和及反亲和关系主要由调度插件 InterPodAffinity 来支撑,它既要负责节点过滤,也要完成节点的优先级排序。而经典调度策略则使用内置的 MatchInterPodAffinity 预选策略和 terPodAffinityPriority 优选函数进行各节点的优选级评估。
Pod 间的反亲和关系(podAntiAffinity)要实现的调度目标刚好与亲和关系相反,它的主要目标在于确保存在互斥关系的 Pod 对象不会运行在同一位置,或者确保仅需要在指定的位置配置单个代理程序(类似于 DaemonSet 确保每个节点仅运行单个某类 Pod)等场景应用场景。反亲和性调度一般用于分散同一类应用的 Pod 对象等,也包括把不同安全级别的 Pod 对象调度至不同的区域、机架或节点等。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/a4de5e19007fcc0b3d20fc6a8】。文章转载请联系作者。
评论