扒一扒Kubernetes的调度策略

简介:

Docker是一个开源的应用容器引擎,让开发者可以打包应用以及依赖包到一个可移植的容器中,然后发布到Linux机器上。容器使用沙箱机制,相互之间不会有任何接口,几乎没有性能开销,可以很容易地在主机和数据中心中运行。

Kubernetes容器集群管理系统的主要功能包括:使用Docker对应用程序进行打包、实例化及运行;以集群的方式运行及管理跨主机的容器;解决位于不同主机之间所运行的容器之间的通信问题等等。其中,Scheduler(调度器)是Kubernetes容器集群管理系统中加载并运行的调度程序,其负责收集、统计分析容器集群管理系统中所有Node的资源使用情况,然后以此为依据将新建的Pod发送到优先级最高的可用Node上去建立。

在新增Pod的过程中,调度器的调度策略被分成两个阶段:Predicates阶段和Priorities阶段。其中,Predicates阶段回答“能不能”的问题,即能否将Pod调度到特定的Node上运行,这一阶段输出的所有满足要求的Node将被记录并作为第二阶段的输入。Priorities阶段是回答“哪个更适合的问题”,即再次对节点进行筛选,筛选出最适合运行Pod的节点。

Predicates阶段包括五个调度策略:PodFitsPorts、PodFitsResources、NoDiskConflict、MatchNodeSelector和HostName,即需要经过上述5个Predicates的检验,才能确定为“能被调度到的Node”。如其中的PodFitsPorts规则,它所评估的依据就是端口是否冲突,即检测待调度的Pod中所有容器要用到的端口集对应的HostPort集与Node上已使用的端口是否冲突。而Priorities则是在Predicates的基础上回答“哪个可用Node最优先”的问题。

Priorities阶段包括三个调度策略:LeastRequestedPriority(最少请求资源优先调度策略)、ServiceSpreadingPriority(最小相同服务优先调度策略)和EqualPriority(平等优先调度策略)。即按照LeastRequestedPriority、ServiceSpreadingPriority和EqualPriority三个调度策略,给Predicates阶段筛选出来的所有Node打分,并评出优先级,优先级最高的Node作为Pod被调度的目的节点。

具体如下: LeastRequestedPriority的计算原则是尽量将需要新创建的Pod调度到计算资源占用比较小的Node上,这里的“计算资源”指 CPU 资源和Memory资源;ServiceSpreadingPriority的计算原则是使同一个Node上属于相同服务的Pod数量尽量少,这样调度的Pod能够尽可能地实现服务的高可用性和流量负载均衡;EqualPriority的计算原则是平等对待Predicates阶段筛选出来的每一个可用Node。目前,LeastRequestedPriority是最主要的评分依据。其计算过程如下:

l 遍历所有可用Node,对每个可用Node上已经调度运行的所有Pod请求所需的Memory资源和CPU资源进行求和;

l 对待创建的Pod请求所需的Memory资源和CPU资源进行求和,加上S11中得出的对应的Memory和CPU的值,并以int64型的整数totalMemory和int64型的整数totalMilliCPU进行返回;

l 再次遍历所有可用Node,并计算每个可用Node的Memory资源和CPU资源的总量,并以int64型的整数capacityMemory和int64型的整数capacityMilliCPU进行返回;

l 分别计算每个可用Node 的CPU得分和Memory得分;其中,CPU得分=int(((capacityMilliCPU - totalMilliCPU) 10) / capacityMilliCPU);Memory得分= int(((capacityMemory - totalMemory) 10) / capacityMemory);如果totalMilliCPU的值大于capacityMilliCPU或者totalMemory的值大于capacityMemory的值,则直接返回CPU得分为0或者Memory得分为0。将得分和最高的节点做为Pod的启动节点。

Kubernetes的调度器实现了插件化,用户可以开发自己的调度策略并以插件的形式集成到Kubernetes中,以便调度不同类型的任务。然而随着时间的推移,由于种种因素的影响,如工作节点上资源变化、其他Pod的创建与删除,原有已经被调度的Pod可能已经不适合调度策略了。在这种情况下,社区提出了“重调度”的概念,即控制器将某个处于运行中的Pod终止,并在不中断服务的情况下,将此Pod重新调度到适合的节点上。
原文发布时间为: 2016年6月16日

本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Kubernetes 监控 调度
Kubernetes Pod调度:从基础到高级实战技巧
Kubernetes Pod调度:从基础到高级实战技巧
176 0
|
4月前
|
Kubernetes 应用服务中间件 调度
k8s教程(pod篇)-全自动调度
k8s教程(pod篇)-全自动调度
45 0
|
4月前
|
存储 Kubernetes 调度
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
k8s教程(pod篇)-DaemonSet(每个node上只调度一个pod)
67 0
|
7月前
|
Kubernetes 固态存储 调度
Kubernetes(k8s)容器编排Pod调度策略
Kubernetes(k8s)容器编排Pod调度策略
102 0
|
28天前
|
Kubernetes 网络安全 调度
容器服务ACK常见问题之容器服务ACK的eci调度卡住如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
4月前
|
消息中间件 Kubernetes 调度
k8s教程(pod篇)-批处理调度
k8s教程(pod篇)-批处理调度
68 0
|
6月前
|
Kubernetes 算法 调度
【K8S系列】深入解析K8S调度
【K8S系列】深入解析K8S调度
444 0
|
4月前
|
Kubernetes Cloud Native 调度
云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度
云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度
215 0
|
4月前
|
Kubernetes 容灾 调度
k8s教程(pod篇)-容灾调度
k8s教程(pod篇)-容灾调度
72 0
|
4月前
|
Kubernetes 容灾 调度
k8s教程(pod篇)-调度总结(三)
k8s教程(pod篇)-调度总结(三)
44 0