由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

摘要

从 CNCF 基金会的成立,到 Kubernetes 社区蓬勃发展,历经6载,17年异军突起,在mesos、swarm 等项目角逐中,拔得头筹,继而一统容器编排,其成功的关键原因可概括为以下几点:
  • 项目领导者们的坚守与远见

  • 社区的良好的运作与社区文化

  • 社区与企业落地的正反馈

虽然针对 kubernetes 的介绍已经比较多了,但是云原生还是 Kubernetes 项目的发展都已经迈入深水区,因而今天 zouyee 为大家带来《kubernetes调度系统系列文章》,希望通过接下来的五篇文章,让各位能够系统深入的了解 Kubernetes 调度系统,该系列对应版本为1.20.+,今天带来《K8S 调度系统由浅入深系列:简介》

一、调度简介

在开始前,先来看看 Kubernetes 的架构示意图,其中控制平面包含以下三大组件:kube-scheduler、kube-apiserver、kube-controller-manager。kubelet 及 kube-proxy 组件的分析我们后续单独成章进行讲解,现在我们可以简单给理解上述组件的难易程度排个序,kube-apiserver、kubelet、kube-scheduler、kube-controller-manager、kube-proxy。

由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

如上所述,kube-scheduler 是 K8S 系统的核心组件之一,其主要负责 Pod 的调度,其监听 kube-apiserver,查询未分配 Node 的 Pod(未分配、分配失败及尝试多次无法分配),根据配置的调度策略,将 Pod 调度到最优的工作节点上,从而高效、合理的利用集群的资源,该特性是用户选择 K8S 系统的关键因素之一,帮助用户提升效率、降低能耗。

kube-scheduler 负责将 Pod 调度到集群内的最佳节点(基于相应策略计算出的最佳值)上,它监听 kube-apiserver,查询还未分配节点的 Pod,然后根据调度策略为这些 Pod 分配节点,执行绑定节点的操作(更新 Pod 的 nodeName 字段)。

在上述过程中,需要考虑以下问题:

  • 如何确保节点分配的公平性
  • 如何确保节点资源分配的高效性
  • 如何确保Pod调度的公平性
  • 如何确保Pod调度的高效性
  • 如何扩展Pod调度策略
为解决上述的问题,kube-scheduler 通过汇集节点资源、节点地域、节点镜像、Pod调度等信息综合决策,确保Pod分配到最佳节点,以下为 kube-scheduler 的主要目标:
  • 公平性:在调度Pod时需要公平的决策,每个节点都有被分配的机会,调度器需要针对不同节点作出平衡决策。

  • 资源高效:最大化提升所有可调度资源的利用率,使有限的 CPU、内存等资源服务尽可能更多的 Pod。

  • 性能:能快速的完成对大规模Pod的调度工作,在集群规模扩增的情况下,依然能确保调度的性能。

  • 灵活性:在实际生产中,用户希望 Pod 的调度策略是可扩展的,从而可以定制化调度算法以处理复杂的实际问题。因此平台要允许多种调度器并行工作,并支持自定义调度器。

二、调度流程

首先我们通过下面的整体的交互图,来构建 Pod 调度的直观感受。

由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

上述以创建一个Pod为例,简要介绍调度流程:

  1. 用户通过命令行创建 Pod(选择直接创建 Pod 而不是其他 workload,是为了省略 kube-controller-manager);
  2. kube-apiserver 经过对象校验、admission、quota等准入操作,写入etcd;
  3. kube-apiserver 将结果返回给用户;
  4. 同时 kube-scheduler 一直监听节点、Pod事件等(流程1);
  5. kube-scheduler 将 spec.nodeName 的 pod 加入到调度队列中,进行调度周期(该周期即位后续介绍内容)(流程2-3
  6. kube-scheduler 将 pod 与得分最高的节点进行 binding 操作(流程4
  7. kube-apiserver 将 binding 信息写入 etcd
  8. kubelet 监听分配给自己的Pod,调用 CRI 接口进行 Pod 创建(该部分内容后续出系列,进行介绍)
  9. kubelet 创建 Pod 后,更新 Pod 状态等信息,并向 kube-apiserver 上报
  10. kube-apiserver写入数据

a.调度周期

kube-scheduler 的工作任务是根据各种调度算法将Pod绑定(bind)到最合适的工作节点,整个调度流程分为两个阶段:过滤和评分。流程示意图如下所示。

由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

:以前称之为 predicate 与 priorities,当前统称为过滤与评分,实际效果一致
  • 过滤:输入是所有节点,输出是满足预选条件的节点。kube-scheduler 根据过滤策略过滤掉不满足的节点。例如,如果某节点的资源不足或者不满足预选策略的条件如“节点的标签必须与Pod的Selector一致”时则无法通过过滤。
  • 评分:输入是通过过滤阶段的节点,评分时会根据评分算法为通过过滤的节点进行打分,选择得分最高的节点。例如,资源越充足、负载越小的节点可能具有越高的排名。

通俗点说,调度的过程就是在回答两个问题:1. 候选节点有哪些?2. 其中最适合的是哪一个?

如果在过滤阶段没有节点满足条件,Pod 会一直处在 Pending 状态直到出现满足的节点,在此期间调度器会不断的进行重试。如果有多个节点评分一致,那么 kube-scheduler 任意选择其一。

注:Pod首先进入调度队列,失败后进入 backoff,多次失败后进入 unschedule,该部分内容后续介绍。

b. 调度算法

当前支持两种方式配置过滤、评分算法:

1. Scheduling Policies:通过文件或者 configmap 配置 Predicate 算法(过滤)和 Priorities算法(评分)的算法2. Scheduling Profiles:当前调度系统为插拔架构,其将调度周期分为 `QueueSort``PreFilter``Filter``PreScore``Score``Reserve``Permit``PreBind``Bind``PostBind`等阶段,通过定制调度周期中不同阶段的插件行为来实现自定义。

下面简单介绍一下通过 Scheduling Policies 方式配置

pkg/scheduler/framework/plugins/legacy_registry.go

1)预选(Precates)

由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

注:其中 MaxEBSVolumeCountPred、 MaxGCEPDVolumeCountPred MaxAzureDiskVolumeCountPred、MaxCinderVolumeCountPred 等云厂商相关预选算法已经废弃

2)优选(Priorities)
由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~

来源:本文转自公众号 DCOS,点击查看原文

XOps 风向标!GOPS 全球运维大会 2022 · 深圳站,AIOps、DevOps、SRE,运维转型,提升自我价值,来 GOPS 看看吧~

由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~
长按图片二维码
解锁精彩内容▲
近期好文:

记一次线上 K8s Ingress 访问故障排查,最后竟不是 Post 的锅

“高效运维”公众号诚邀广大技术人员投稿,
投稿邮箱:jiachen@greatops.net,或添加联系人微信:greatops1118
由浅入深地搞懂 K8S 调度系统,一般人我不告诉他~
点个“在看”,一年不宕机

文章来源于网络,投诉文章请联系:zhangyunfei@anqiangkj.com

主题测试文章,只做测试使用。发布者:2915,转转请注明出处:https://community.anqiangkj.com/archives/15748

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月16日 下午7:38
下一篇 2022年5月17日 下午9:06

相关推荐