写点什么

43 K8S 之节点 /Pod 亲和调度

  • 2021 年 12 月 13 日
  • 本文字数:931 字

    阅读完需:约 3 分钟

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 对象调度至不同的区域、机架或节点等。


发布于: 1 小时前阅读数: 7
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
43 K8S之节点/Pod亲和调度