Kubernetes调度算法介绍

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 调度流程 调度器就是一个独立的进程,负责不断从apiserver拉取还没有被调度的pod,以及可调度的node列表,通过一些列算法筛选,选出一个node并与该pod绑定,将绑定的结果写回apiserver 调度算法 下面讲解基于k8s v1.6.6的源码 算法需要经过两个阶段,分别是过滤和打分,首先过滤掉一部分,保证剩余的节点都是可调度的,接着在打分阶段选出最高分节点,该节点就是scheduler的输出节点。

调度流程

调度器就是一个独立的进程,负责不断从apiserver拉取还没有被调度的pod,以及可调度的node列表,通过一些列算法筛选,选出一个node并与该pod绑定,将绑定的结果写回apiserver

调度算法   

下面讲解基于k8s v1.6.6的源码

算法需要经过两个阶段,分别是过滤和打分,首先过滤掉一部分,保证剩余的节点都是可调度的,接着在打分阶段选出最高分节点,该节点就是scheduler的输出节点。

算法流程:

过滤

过滤环节就是一条过滤器链,包含多个过滤器,每个相当于一个函数,接收node和待调度的pod作为参数,返回bool来确定是否可调度。通过组合多个函数可以完成一条可扩展的过滤器链。目前k8s中已注册的过滤器函数如下:

算法名称 是否默认 详细说明
NoVolumeZoneConflict 当主机上zone-label(地区)包含pod中PersistentVolume卷下的zone label时,可以调度。当主机没有zone-label,表示没有没有zone限制,也可调度
MaxEBSVolumeCount 当主机上被挂载的AWS EBS Volume超过了默认限制39,就不调度到该主机
MaxGCEPDVolumeCount 当主机上被挂载的GCD Persistent Disk超过了默认限制16,就不调度到该机器
MaxAzureDiskVolumeCount 当主机上被挂载的Azure Disk Volume超过了默认限制16,就不调度到该机器
NoDiskConflict

当主机上所有pod使用的卷和待调度pod使用的卷存在冲突,就不调度到该主机。这项检查只针对GCE, Amazon EBS, Ceph RBD, ISCSI,具体规则为:

  • GCE PersistentDisk允许多次只读挂载相同的volume
  • EBS禁止两个pod挂载同一个id的volume
  • Ceph RBD禁止两个pod共享一个monitor、pool、image
  • ISCSI禁止两个pod共享同一个IQN
MatchInterPodAffinity 亲和性检查,设带调度的pod为X,当主机上所有正运行的pod与X不相互排斥时,则可调度
PodToleratesNodeTaints 当pod可以容忍(tolerate)主机所有的taint(污点)时,才可被调度(容忍taint标签的方式就是给自己也打上相应tolerations标签)
CheckNodeMemoryPressure 当主机剩余内存紧张时,BestEffort类型的pod无法被调度到该主机
CheckNodeDiskPressure 当主机剩余磁盘空间紧张时,无法调度到该主机
PodFitsHostPorts 当待调度pod中所有容器所用到的HostPort与工作节点上已使用端口存在冲突,就不调度到该主机
PodFitsPorts 被PodFitsHostPorts取代
PodFitsResources 当总资源-主机中所有pod对资源的request总量 < 带调度的pod request资源量,则不调度到该主机,现在会检查CPU,MEM,GPU资源
HostName 如果待调度的pod指定了pod.Spec.Host,则调度到该主机上
MatchNodeSelector 当主机label与pod中nodeSelector以及annotations scheduler.alpha.kubernetes.io/affinity匹配,则可调度


打分

打分环节也是一条链路,包含多个打分函数,每个打分函数会接收node和待调度的pod作为参数,返回一个范围在0-10的分数,每个打分函数还有一个权重值。某个node算出的总分就是所有打分函数的分值*权重值的总和,获取总分最大的node(如果有多个,随机取一个),该node就是最终要被调度的节点

示例:假设有个节点nodeA,有两个打分函数priorityFunc1、priorityFunc2(每个方法都能返回一个score),两个方法分别都有权重因子weight1、weight2。则nodeA的总分为:finalScoreNodeA = (weight1 * priorityFunc1) + (weight2 * priorityFunc2)

目前k8s中已注册的打分函数如下:

算法名称 是否默认 权重 详细说明
SelectorSpreadPriority 1 相同service/rc的pods越分散,得分越高
ServiceSpreadingPriority 1 相同service的pods越分散,优得分越高,被SelectorSpreadPriority取代,保留在系统中,并不使用
InterPodAffinityPriority 1 pod与node上正运行的其他pod亲和性匹配度越高,得分越高
LeastRequestedPriority 1 剩余资源越多,得分越高。cpu((capacity - sum(requested)) * 10 / capacity) + memory((capacity - sum(requested)) * 10 / capacity) / 2
BalancedResourceAllocation 1 cpu和内存利用率越接近,得分越高。10 - abs(cpuFraction-memoryFraction)*10
NodePreferAvoidPodsPriority 10000 当node的annotation scheduler.alpha.kubernetes.io/preferAvoidPods被设置时,说明该node不希望被调度,得分低,当没有设置时得分高。之所以权重较大是因为一旦设置preferAvoidPods表示该node不希望被调度,该项得分为0,其他没有设置的node得分均为10000*分值,相当于直接过滤掉该节点。思考:其实可以放在过滤环节处理
NodeAffinityPriority 1 pod与node的亲和性匹配度越高,得分越高
TaintTolerationPriority 1 pod对node的污点(taint)的容忍(tolerate)程度越高,得分越高
EqualPriority 1 所有机器得分一样
ImageLocalityPriority 1 待调度的pod会使用到一些镜像,拥有这些镜像越多的节点,得分越高
MostRequestedPriority 1 request资源越多,得分越高,与LeastRequestedPriority相反。(cpu(10 * sum(requested) / capacity) + memory(10 * sum(re
本文转移开源中国- Kubernetes调度算法介绍
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
21天前
|
算法 调度 UED
探索操作系统的心脏:调度算法的奥秘与影响
【10月更文挑战第9天】 本文深入探讨了操作系统中至关重要的组件——调度算法,它如同人体的心脏,维持着系统资源的有序流动和任务的高效执行。我们将揭开调度算法的神秘面纱,从基本概念到实际应用,全面剖析其在操作系统中的核心地位,以及如何通过优化调度算法来提升系统性能。
|
1天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
6天前
|
算法 大数据 Linux
深入理解操作系统之进程调度算法
【10月更文挑战第24天】本文旨在通过浅显易懂的语言,带领读者深入了解操作系统中的进程调度算法。我们将从进程的基本概念出发,逐步解析进程调度的目的、重要性以及常见的几种调度算法。文章将通过比喻和实例,使复杂的技术内容变得生动有趣,帮助读者建立对操作系统进程调度机制的清晰认识。最后,我们还将探讨这些调度算法在现代操作系统中的应用和发展趋势。
|
23天前
|
算法 调度 UED
深入理解操作系统的进程调度算法
【10月更文挑战第7天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。它不仅影响系统的性能和用户体验,还直接关系到资源的合理分配。本文将通过浅显易懂的语言和生动的比喻,带你一探进程调度的秘密花园,从最简单的先来先服务到复杂的多级反馈队列,我们将一起见证算法如何在微观世界里编织宏观世界的和谐乐章。
|
25天前
|
存储 算法 固态存储
IO调度算法
【10月更文挑战第5天】IO调度算法
33 3
|
25天前
|
存储 算法 固态存储
IO调度算法
【10月更文挑战第5天】IO调度算法
33 2
|
28天前
|
边缘计算 算法 调度
探究操作系统的心脏:调度算法的进化与影响
【10月更文挑战第2天】 本文深入探讨了操作系统中核心组件——调度算法的历史演变、关键技术突破及其对现代计算的影响。通过详细回顾从单任务到多任务、实时系统及分布式计算环境下调度算法的发展,文章揭示了这些算法如何塑造我们的数字世界,并对未来的趋势进行了展望。不同于传统的摘要,本文特别聚焦于技术细节与实际应用的结合点,为读者提供一幅清晰的技术演进蓝图。
42 4
|
28天前
|
应用服务中间件 调度 nginx
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
Kubernetes的Pod调度:让你的应用像乘坐头等舱!
|
1月前
|
算法 调度 UED
探索操作系统的心脏:进程调度算法
【9月更文挑战第32天】在数字世界的每一次心跳中,都隐藏着一个不为人知的英雄——进程调度算法。它默默地在后台运作,确保我们的命令得到快速响应,应用程序平稳运行。本文将带你走进操作系统的核心,一探进程调度的奥秘,并通过代码示例揭示其背后的智慧。准备好跟随我一起深入这趟技术之旅了吗?让我们开始吧!
|
2月前
|
算法 调度
操作系统的心脏:深入解析进程调度算法
本文旨在深入探讨现代操作系统中的核心功能之一——进程调度。进程调度算法是操作系统用于分配CPU时间片给各个进程的机制,以确保系统资源的高效利用和公平分配。本文将详细介绍几种主要的进程调度算法,包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)以及优先级调度(PS)。我们将分析每种算法的基本原理、优缺点及其适用场景。同时,本文还将讨论多级反馈队列(MFQ)调度算法,并探讨这些算法在实际应用中的表现及未来发展趋势。通过深入解析这些内容,希望能够为读者提供对操作系统进程调度机制的全面理解。

热门文章

最新文章