十分钟搞懂K8S的亲和与反亲和调度

本文主要快速讲解Kube.NETes的亲和性调度 和 反亲和性调度,通过理论结合实际的方式,让理解更深刻 。
首先来个一句话总结:亲和性调度就像关系亲密的闺蜜,你去哪儿我也去哪儿 。反亲和性调度就像赌气的两个孩子,赌气永远不在一起玩儿 。更多解释和实战详见下文 。花10分钟看到最后,你肯定会有收获 。

十分钟搞懂K8S的亲和与反亲和调度

文章插图
一、调度Pod的主要方式Pod调度到指定Node的方式主要有4种:
  • nodeName调度:直接在Pod的yaml编排文件中指定nodeName , 调度到指定name的节点上 。
  • nodeSelector调度:直接在Pod的yaml编排文件中指定nodeSelector,调度到带有指定label的节点上 。
  • 污点(TAInts)和容忍度(Tolerations)调度:详见文章《5分钟搞懂K8S的污点和容忍度(理论+实战)》 。主要通过在Node节点上打污点,然后在Pod的yaml编排文件中配置容忍度 , 来实现调度 。
  • 亲和-反亲和调度:见下文讲解 。
二、为什么需要亲和调度有了nodeName调度、nodeSelector调度、污点(Taints)和容忍度(Tolerations)调度,为什么还需要亲和-反亲和调度呢?
为了更灵活更复杂的调度方式 。比如有些场景想把2个Pod 调度到一台节点上,有的场景为了隔离性高可用性想把2个Pod分开到不同节点上,或者有的场景想把Pod调度到指定的一些特点节点上 。
三、亲和调度的前置概念(重要)label在K8S中是非常重要的概念,不管是什么场景 , 只要和选择、筛选相关的 , 基本是用label字段来匹配的 。
亲和性和反亲和性的调度,筛选的条件依旧用的是Node的label字段 。
不管是Node亲和性调度,还是Pod亲和性调度,被调度的主体都是Pod 。都是讲的Pod根据亲和规则调度到某个节点,或者Pod跟随别的Pod调到到某个节点(比如Pod1跟随Pod2,Pod2被调度到B节点,那么Pod1也被调度到B节点) 。
Node亲和性调度 和  Pod亲和性调度 的配置都是写在 编排Pod的yaml里 。因为被调度的主体是Pod 。
Node亲和性调度是指Pod和Node的亲密关系 。
Pod亲和性调度是指Pod和Pod的亲密关系 。
  • 硬亲和:亲和规则只有一种,必须符合该规则 。
  • 软亲和:规则有多种,每个权重不同,根据权重优先级去选择一个规则 。
Node亲和性调度的图示如下 , Pod亲和性调用和Pod反亲和性调用也类似 。
十分钟搞懂K8S的亲和与反亲和调度

文章插图
四、亲和调度的具体概念Affinity的中文意思是亲近,用来表述亲和性调度再合适不过了 。
亲和性调度:就好像Node(或者Pod)和Pod是关系很好的闺蜜,Pod说,“只要符合这种label的Node(Pod)都是我的好闺蜜,闺蜜在哪儿我就去哪儿” 。
反亲和性调度:就好像2个Pod是赌气的2个孩子,互相对着干,一个往东,另一随便去哪个方向就是不往东,他们不会去到同一个地方 。
1.记住这三种调度关系亲和性调度 和 反亲和性调度的关系就三种:
  • node亲和调度:硬亲和、软亲和
  • pod亲和调度:硬亲和、软亲和
  • pod反亲和调度:硬亲和、软亲和
2.记住这2种亲和表达式不管是Node亲和 还是Pod亲和 , 他们都有2种亲和性表达方式:
  • RequiredDuringSchedulingIgnoredDuringExecution:是硬亲和的方式,必须满足指定的规则才可以把Pod调度到该Node上 。这里注意Required这个词,中文意思必须的 。
  • PreferredDuringSchedulingIgnoredDuringExecution:是软亲和的方式,强调优先满足某个规则 , 然后根据优先的规则,将Pod调度到节点上 。这里注意Preferred这个词,中文意思是首?。?用来说明选择规则的优先级 , 确实比较合适 。
这两个字段也比较长,我们来做下拆解,将RequiredDuringSchedulingIgnoredDuringExecution拆解为RequiredDuringScheduling和IgnoredDuringExecution 。