背景

Kubernetes中的调度策略可以大致分为两种,一种是全局的调度策略,要在启动调度器时配置,包括kubernetes调度器自带的各种predicates和priorities算法;另一种是运行时调度策略,包括nodeAffinity(主机亲和性),podAffinity(POD亲和性)以及podAntiAffinity(POD反亲和性)。

podAffinity 主要解决POD可以和哪些POD部署在同一个拓扑域中的问题(拓扑域用主机标签实现,可以是单个主机,也可以是多个主机组成的cluster、zone等),podAntiAffinity主要解决POD不能和哪些POD部署在同一个拓扑域中的问题。它们处理的是Kubernetes集群内部POD和POD之间的关系。

使用场景介绍

  • podAntiAffinity使用场景:

    将一个服务的POD分散在不同的主机或者拓扑域中,提高服务本身的稳定性。
    给POD对于一个节点的独占访问权限来保证资源隔离,保证不会有其它pod来分享节点资源。
    把可能会相互影响的服务的POD分散在不同的主机上。

对于亲和性和反亲和性,每种都有两种规则可以设置:

  1. RequiredDuringSchedulingIgnoredDuringExecution:在调度期间要求满足亲和性或者反亲和性规则,如果不能满足规则,则POD不能被调度到对应的主机上。在之后的运行过程中,系统不会再检查这些规则是否满足。(硬规则)

  2. PreferredDuringSchedulingIgnoredDuringExecution:在调度期间尽量满足亲和性或者反亲和性规则,如果不能满足规则,POD也有可能被调度到对应的主机上。在之后的运行过程中,系统不会再检查这些规则是否满足。(软规则)

使用示例

  • podAntiAffinity 使用示例:

使用hostname作为拓扑域,把pod创建在不同主机上,每个主机上最多只有一个同类型的POD(同类型用标签区分)。其中matchExpressions中填写内容对应到RC中POD自身的标签。可以通过修改需要匹配的标签内容来控制把一个服务中的POD和其它服务的POD部署在不同主机上。

yaml中的定义如下:
...
spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchLabels:Anti_wmonitorTest6: wmonitorTesttopologyKey: kubernetes.io/hostname
...

上边的例子中可以通过修改topologyKey来限制拓扑域的范围,实现把相关服务部署在不同的容灾域等其它功能。

具体实现过程

整个计算过程摘选自Kubernetes 1.7源码,为便于阅读部分函数删除了无关代码

  1. 对于待调度的Pod,首先分别判断是否存在亲和性限制和反亲和性限制,若有都会调用processTerms方法,若为亲和性则传入参数multiplier = 1,若为反亲和性则传入参数multiplier = -1

        if existingHasAffinityConstraints {terms := existingPodAffinity.PodAffinity.PreferredDuringSchedulingIgnoredDuringExecutionpm.processTerms(terms, existingPod, pod, existingPodNode, 1)}if existingHasAntiAffinityConstraints {terms := existingPodAffinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecutionpm.processTerms(terms, existingPod, pod, existingPodNode, -1)}
    
  2. 对于具体的processTerms方法会遍历Pod设置的所有affinityTerm或者antiaffinityTerm(即比如某个Pod设置CPU密集型和IO密集型则是两个term),针对每个具体antiaffinityTerm(或者affinityTerm)调用processTerm方法

    func (p *podAffinityPriorityMap) processTerms(terms []v1.WeightedPodAffinityTerm, podDefiningAffinityTerm, podToCheck *v1.Pod, fixedNode *v1.Node, multiplier int) {
    for i := range terms {term := &terms[i]p.processTerm(&term.PodAffinityTerm, podDefiningAffinityTerm, podToCheck, fixedNode, float64(term.Weight*int32(multiplier)))
    }
    }
    
  3. 带调度的Pod的具体某种亲和性选项(PodAffinityTerm)会将自身的权重(weight)加入一个key为主机名(node.Name)value为当前累计weight和的一个map(p.counts)中,该map可以看作单次优选时候的一个全局的map

    func (p *podAffinityPriorityMap) processTerm(term *v1.PodAffinityTerm, podDefiningAffinityTerm, podToCheck *v1.Pod, fixedNode *v1.Node, weight float64) {func() {for _, node := range p.nodes {if p.failureDomains.NodesHaveSameTopologyKey(node, fixedNode, term.TopologyKey) {p.counts[node.Name] += weight}}}()
    }
    
  4. 等到该待调度Pod计算完所有节点的亲和性及反亲和性Term的累计权重值后,开始为所有节点打分数,最终分数在0到10分之间

    func (ipa *InterPodAffinity) CalculateInterPodAffinityPriority {
    for _, node := range nodes {if p.counts[node.Name] > maxCount {maxCount = p.counts[node.Name]}if p.counts[node.Name] < minCount {minCount = p.counts[node.Name]}
    }
    for _, node := range nodes {fScore := float64(0)if (maxCount - minCount) > 0 {fScore = 10 * ((p.counts[node.Name] - minCount) / (maxCount - minCount))}
    }
    

总结

对于单个Pod,可以设置多个亲和性项和多个反亲和性项,每个亲和性项和反亲和性项自身都可以设置独立的权重,然后一次亲和性优选调度会将自身的所有亲和项权重加入每个节点的累计权值(或将自身的所有反亲和项权重减去每个节点的累计权值),然后对于每个节点所带的累计权重算出一个0到10分的分数。

ref:Kubernetes调度之亲和性和反亲和性

Kubernetes调度之亲和性和反亲和性相关推荐

  1. Kubernetes 亲和性与反亲和性

    文章目录 一.前言 1. 概述 2. 亲和性和反亲和性的类型 3.硬亲和与软亲和 4.亲和性支持的运算符 二.nodeAffinity(节点亲和) 1. 测试环境准备 2. 节点硬亲和 3. 节点软亲 ...

  2. k8s中亲和性与反亲和性

    k8s中亲和性与反亲和性 Kubernetes的默认调度器以预选.优选.选定机制完成将每个新的Pod资源绑定至为其选出的目标节点上,不过,它只是Pod对象的默认调度器,默认情况下调度器考虑的是资源足够 ...

  3. k8s之亲和性、反亲和性

    k8s中亲和性与反亲和性 Kubernetes的默认调度器以预选.优选.选定机制完成将每个新的Pod资源绑定至为其选出的目标节点上,不过,它只是Pod对象的默认调度器,默认情况下调度器考虑的是资源足够 ...

  4. 【云原生 | 从零开始学Kubernetes】十、k8sPod节点亲和性和反亲和性

    该篇文章已经被专栏<从零开始学k8s>收录 Pod节点亲和性和常见的状态 Pod 节点亲和性 pod 节点反亲和性 写在最后 Pod 节点亲和性 pod 自身的亲和性调度有两种表示形式 p ...

  5. pod 的亲和性,反亲和性 实验

    文章目录 1 ,环境准备 2 亲和性+ In 测试 3 亲和性+NotIn 测试 4 非亲和性+In 测试 5 非亲和性 + NotIn 测试 1 ,环境准备 node01. node02 都有标签 ...

  6. k8s调度之node的亲和性以及pod的亲和性/反亲和性

    k8s调度之node的亲和性以及pod的亲和性/反亲和性 通常情况下,使用的都是k8s默认的调度调度方式,但是在有些情况下,我们需要将pod运行在具有特定的标签的node上才能都运行,这个时候,pod ...

  7. 运维实操——kubernetes(十一)调度nodeName、nodeSelector、亲和性、污点、容忍、删除节点

    调度nodeName.nodeSelector.亲和性.污点.容忍.删除节点 1.什么是调度? 2.nodeName 3.nodeSelector (1)节点亲和性 (2)pod亲和与反亲和 4.Ta ...

  8. Kubernetes调度

    Overview kube-scheduler 是kubernetes控制平面的核心组件,其默认行为是将 pod 分配给节点,同时平衡Pod与Node间的资源利用率.通俗来讲就是 kube-sched ...

  9. kubernetes调度器

    目录 文章目录 目录 实验环境 实验软件 本节实践 前置知识 调度器 1.调度流程 1.默认调度器 2.扩展调度器(extender) 3.调度框架 1.扩展点(Extension Points) 2 ...

最新文章

  1. 2018会考计算机成绩查询入口,2018年山东会考成绩查询时间及入口
  2. UIButton 的 imageEdgeInsets 和 titleEdgeInsets
  3. Django框架基础知识05-自定义模板标签与过滤器
  4. 算法---会议最大安排问题
  5. 邻值查找—算法进阶指南
  6. java中的jpa_在JPA中处理Java的LocalDateTime
  7. int main() 与 void main()
  8. LeetCode 528. 按权重随机选择(前缀和+二分查找)
  9. 2.Java 面试题整理(基础篇二)
  10. MySQL详细知识点总结 可以收藏啦
  11. mac 强制退出程序_Mac OS系统如何强制退出应用程序
  12. docker stats 监控资源使用情况
  13. cognos安装教程linux,Cognos安装步骤Linux
  14. 心得体会计算机辅助设计实训,cad实训的心得体会模板
  15. 常用元器件使用方法3:电平转换芯片74LVC1T45的使用方法
  16. 程设课终章:c++使用socket实现bmp图片的传输
  17. 通向大规模医疗知识图谱:万字详解天衍实验室知识图谱对齐技术
  18. 2016届毕业设计(论文) 基本规范及档案袋封面填写要求
  19. xy苹果助手未受信任_苹果ios企业签名后App无法安装?如何解决?
  20. Ubuntu安装多用户免密登录Jupyterhub

热门文章

  1. 每日十道面试题(五)
  2. HNUCM 道具的魅力值(贪心算法)
  3. 【web常见的攻击方式有哪些?如何防御?】
  4. 随机梯度下降(SGD)与经典的梯度下降法的区别
  5. 以太网交换机可以家用吗_以太网交换机是什么? 以太网交换机的使用方法
  6. 如何彻底关闭win11自动更新
  7. JavaScript —— JSchallenger Arrays 数组练习(测试一下你的 JS 数组基础)【专题二】
  8. C语言生成0-9的6位数密码递归方法实现
  9. 20230106 作业
  10. 微信公众号之在图片上添加热点链接