深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116709 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

42 | Kubernetes默认调度器调度策略解析

PodAffinityPredicate
NodeMemoryPressurePredicate
PodToleratesNodeTaints
VolumeBindingPredicate
VolumeZonePredicate
MaxPDVolumeCountPredicate
NoDiskConflict
PodMatchNodeSelector
PodFitsHostPorts
PodFitsHost
PodFitsResources
ImageLocalityPriority
InterPodAffinityPriority
TaintTolerationPriority
NodeAffinityPriority
BalancedResourceAllocation
LeastRequestedPriority
Pod相关的过滤规则
宿主机相关的过滤规则
Volume相关的过滤规则
GeneralPredicates
避免Pod堆叠的算法
控制调度器的调度行为
配置kube-scheduler
Kubernetes默认调度器主要调度算法
Priorities
Predicates
思考题
总结
Predicates和Priorities
Kubernetes默认调度器调度策略解析

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:Kubernetes 默认调度器调度策略解析。
在上一篇文章中,我主要为你讲解了 Kubernetes 默认调度器的设计原理和架构。在今天这篇文章中,我们就专注在调度过程中 Predicates 和 Priorities 这两个调度策略主要发生作用的阶段。
首先,我们一起看看 Predicates。
Predicates 在调度过程中的作用,可以理解为 Filter,即:它按照调度策略,从当前集群的所有节点中,“过滤”出一系列符合条件的节点。这些节点,都是可以运行待调度 Pod 的宿主机。
而在 Kubernetes 中,默认的调度策略有如下四种。
第一种类型,叫作 GeneralPredicates。
顾名思义,这一组过滤规则,负责的是最基础的调度策略。比如,PodFitsResources 计算的就是宿主机的 CPU 和内存资源等是否够用。
当然,我在前面已经提到过,PodFitsResources 检查的只是 Pod 的 requests 字段。需要注意的是,Kubernetes 的调度器并没有为 GPU 等硬件资源定义具体的资源类型,而是统一用一种名叫 Extended Resource 的、Key-Value 格式的扩展字段来描述的。比如下面这个例子:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kubernetes默认调度器调度策略解析文章深入探讨了Kubernetes默认调度器中的Predicates和Priorities两个关键调度策略。在Predicates阶段,通过一系列过滤规则,从集群的所有节点中过滤出符合条件的节点,以确定可以运行待调度Pod的宿主机。文章详细介绍了四种默认调度策略类型,包括GeneralPredicates、与Volume相关的过滤规则、宿主机相关的过滤规则和Pod相关的过滤规则。而在Priorities阶段,为经过Predicates过滤的节点打分,最终选择得分最高的节点作为最佳节点。LeastRequestedPriority和BalancedResourceAllocation是两个常用的打分规则,分别用于选择空闲资源最多的宿主机和资源分配最均衡的节点。此外,文章还介绍了调度器并发计算Predicates并按照固定顺序进行检查的执行过程。总体而言,本文深入解析了Kubernetes默认调度器的调度策略,为读者提供了深入了解Kubernetes调度器工作原理的技术内容。文章内容涵盖了调度器的默认调度规则的主要工作原理,以及实际执行过程中的相关细节,为读者提供了全面的技术视角。文章还提到了配置kube-scheduler的方法,以及通过设置权重来控制调度器的调度行为。最后,文章提出了一个思考题,即如何让Kubernetes的调度器尽可能将Pod分布在不同机器上,避免“堆叠”,鼓励读者思考并留言分享。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(30)

  • 最新
  • 精选
  • 鱼自由
    老师,最后你提到为 Priorities 设置权重,请问,这个操作在哪里进行?

    作者回复: google一下 kube-scheduler policy。是一个配置文件或者配置yaml。

    2019-01-03
    6
  • Alex
    podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: name operator: In values: - nginx-demo topologyKey: "kubernetes.io/hostname" 我用了反亲和的特性让pod分到了不同的机器上,不知道是否回答了你的问题

    作者回复: 这就成了predicate了,我们希望的是一个priority

    2018-11-28
    4
  • 芒果少侠
    思考题答案,个人认为有三个解决思路 1. 为pod.yaml设置PreferredDuringSchedulingIgnoredDuringExecution(注意不是required),可以指定【不想和同一个label的pod】放在一起。调度器随后会根据node上不满足podAntiAffinity的pod数量打分,如果不想一起的pod数量越多分数越少。就能够尽量打散同一个service下多个副本pod的分布。 关于这一思路,k8s官网也给出了相同应用的例子。【preferredDuringSchedulingIgnoredDuringExecution 反亲和性的一个例子是 “在整个域内平均分布这个服务的所有 pod”(这里如果用一个硬性的要求是不可行的,因为您可能要创建比域更多的 pod)。】 -- https://k8smeetup.github.io/docs/concepts/configuration/assign-pod-node/ 2. SelectorSpreadPriority,kubernetes内置的一个priority策略。具体:与services上其他pod尽量不在同一个节点上,节点上同一个Service里pod数量越少得分越高。 3. 自定义策略,实现自己的负载均衡算法(一次性哈希等)。 参考资料: 0. PreferredDuringSchedulingIgnoredDuringExecution :在调度期间尽量满足亲和性或者反亲和性规则,如果不能满足规则,POD也有可能被调度到对应的主机上。在之后的运行过程中,系统不会再检查这些规则是否满足。 1. https://wilhelmguo.cn/blog/post/william/Kubernetes%E8%B0%83%E5%BA%A6%E8%AF%A6%E8%A7%A3 2. https://blog.fleeto.us/post/adv-scheduler-in-k8s/ 3. https://zhuanlan.zhihu.com/p/56088355 4. https://kuboard.cn/learning/k8s-advanced/schedule/#filtering
    2020-03-10
    7
    87
  • Dale
    在工作中遇到这个问题,需要将pod尽量分散在不通的node上,通过kubernetes提供的反亲和性来解决的。从回答中老师希望从Priorities阶段中实现,我的想法如下: 1、首先在Predicates阶段,已经选择出来一组可以使用的node节点 2、在Priorities阶段,根据资源可用情况将node从大到小排序,加上node节点个数为m 3、根据pod中配置replicate个数n,在node列表中进行查找出资源可用的top n的node节点 4、如果node节点个数m不满足pod中的replicate个数,每次选择top m之后,重新计算node的资源可用情况,在选择top(n-m)的node,会存在node上有多个情况,最大程度上保证pod分散在不同的node上
    2018-12-13
    1
    14
  • 陈斯佳
    第四十二课:Kubernetes默认调度器调度策略解析 Predicates在调度过程中的作用,可以理解为Filter,也就是按照调度策略从当前的集群所有节点中“过滤”出一些符合条件的节点来运行调度的 Pod。 默认的调度策略有三种,一种是GerenalPredicates,负责最基础的调度策略,比如计算宿主机CPU和内存资源等是否够用的PodFitsResource;还有检查宿主机名字是否和Pod的spec.nodeName一致的PodFitsHost。第二类是和Volume相关的过滤规则,比如NoDiskConflict是检查多个Pod申明挂载的持久化Volume是否有冲突。第三类是宿主机相关的过滤条件,主要考察待调度的Pod是否满足Node本身条件,比PodToleratesNodeTaints,负责检查Node 的“污点”taint机制,而 NodeMemoryPressurePredicate,检查的是当前节点的内存是不是已经不够充足,如果是的话,那么待调度 Pod 就不能被调度到该节点上。第四种类型是和Pod相关的过滤规则,这一组规则,跟 GeneralPredicates 大多数是重合的。而比较特殊的,是 PodAffinityPredicate。在具体执行的时候, 当开始调度一个 Pod 时,Kubernetes 调度器会同时启动 16 个 Goroutine,来并发地为集群里的所有 Node 计算 Predicates,最后返回可以运行这个 Pod 的宿主机列表。 在 Predicates 阶段完成了节点的“过滤”之后,Priorities 阶段的工作就是为这些节点打分。这里打分的范围是 0-10 分,得分最高的节点就是最后被 Pod 绑定的最佳节点。Priorities 里最常用到的一个打分规则,是LeastRequestedPriority。这个算法实际上就是在选择空闲资源(CPU 和 Memory)最多的宿主机。此外,还有 NodeAffinityPriority、TaintTolerationPriority 和 InterPodAffinityPriority 这三种 Priority。在默认 Priorities 里,还有一个叫作 ImageLocalityPriority 的策略。它是在 Kubernetes v1.12 里新开启的调度规则,即:如果待调度 Pod 需要使用的镜像很大,并且已经存在于某些 Node 上,那么这些 Node 的得分就会比较高。
    2021-11-03
    11
  • freeman
    首先筛选出满足资源的机器。如果可用节点大于等于需求副本集则一个node一份,顺序取node调度即可,如果node节点少于副本数量,则进行一次调度后,剩下的副本重复上面的事情。直到为每个副本找到对应node或者调度失败。
    2018-11-29
    1
    9
  • 陈小白( ´・ᴗ・` )
    这个我们线上就遇到了,一开始编排好差不多100个系统,发现其中几台主机一堆pod ,内存cpu 都很吃紧,而其他的主机却十分空闲。重启也没用。另外还想请教老师一个问题,我们遇到主机内存不足的时候,经常出现docker hang 住了,就是docker 的命令完全卡死,没反应,不知道老师有遇到过呢?
    2019-12-30
    2
    5
  • tyamm
    老师,我有个疑问。这个课程后面会讲到如何搭建master节点高可用么??
    2018-11-28
    4
  • 王景迁
    根据老师上面说的,默认的调度策略不是应该有四种类型吗?为什么文章开头说是三种类型?
    2019-10-23
    1
    3
  • 小朱
    请教一个问题,自己启动了另一个scheduler,某一个node上同时存在default-scheduler和second-scheduler调度的资源。但是scheduler只统计schedulerName是自己的pod,这样就和node上面kubelet统计的资源就出现了不一致,这种设计是为什么呢?
    2018-12-05
    1
收起评论
显示
设置
留言
30
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部