β

kubernetes调度详解

zhangwei-xa ■ 文/ 天云软件 云平台开发工程师 张伟

张伟现主要负责天云软件SkyForm云平台设计及开发工作。熟悉各种开源IaaS平台,如CloudStack,OpenStack;熟悉各种资源管理及调度框架,如Kubernetes,Mesos,YARN,Borg等。

经过六个月的持续优化,kubernetes宣布1.2版本已经可以支持1000+节点的群集,并且有相当出色的响应能力,这对kubernetes来说是一个重大的改进。随着kubernetes集群规模的扩大,kubernetes调度器作为集群的大脑,在如何提高集群的资源利用率、保证集群中服务的稳定运行中也会变得越来越重要。本文将从调度流程、调度算法、资源限制几个方面详细介绍kubernetes调度器。

kubernets调度器

kubernets scheduler主要负责的工作是:接受API Server创建的新Pod,并为其安排一个主机,将信息写入etcd中。当然在这个过程中要处理的事情远远没有这么简单,需要综合考虑多种决策因素,比如把同一个replication controller的Pod分配到不同的主机上,防止因主机节点宕机对业务造成较大冲击;以及如何考虑资源均衡,从而提升整个集群的资源使用率等。

调度流程

kubernetes调度器通过API Server查找还未分配主机的Pod,并尝试为这些Pod分配主机,这个过程如下图所示:

k8s16041201

调度算法

kubernetes通过一组规则,为每一个未调度的Pod选择一个主机,如调度流程中介绍,kubernetes的调度算法主要包括两个方面,过滤主机和主机打分。

kubernetes调度器的源码位于kubernetes/plugin/中,大体的代码目录结构如下所示:

—-kubernetes

——–plugin

————cmd    //kub-scheduler启动函数在cmd包中

————pkg    //调度相关的具体实现

—————-scheduler

——————–algorithm

————————predicates    //主机筛选策略

————————priorities    //主机打分策略

——————–algorithmprovider

————————defaults       //定义默认的调度器

过滤主机的目的是过滤掉不符合Pod要求的主机,现在kubernetes中实现的过滤规则主要包括以下几种(在kubernetes/plugin/pkg/scheduler/algorithm/predicates中实现):

可以通过配置修改kubernetes默认支持的过滤规则。

经过过滤后,再对符合需求的主机列表进行打分,最终选择一个分值最高的主机部署Pod。kubernetes用一组优先级函数处理每一个待选的主机(在kubernetes/plugin/pkg/scheduler/algorithm/priorities中实现)。每一个优先级函数会返回一个0-10的分数,分数越高表示主机越“好”, 同时每一个函数也会对应一个表示权重的值。最终主机的得分用以下公式计算得出:

finalScoreNode = (weight1 * priorityFunc1) + (weight2 * priorityFunc2) + … + (weightn * priorityFuncn)

现在支持的优先级函数包括以下几种:

cpu((capacity – sum(requested)) * 10 / capacity) + memory((capacity – sum(requested)) * 10 / capacity) / 2

score = 10 – abs(cpuFraction-memoryFraction)*10

多层次资源限制

kubernetes包含多种资源限制,用来控制Container、Pod和多租户级别的资源共享。

k8s16041202

每一个容器都可以指定*spec.container[].resources.limits.cpu*,*spec.container[].resources.limits.memory*,*spec.container[].resources.requests.cpu*和*spec.container[].resources.requests.memory*。对容器的资源限制是可选的,可以通过修改集群配置设置默认的资源限制属性。

LimitRange是在namespace级别设置的pod容量限制。所有在对应的命名空间中的Pod,都会受到LimitRange的资源限制。

Pod的每一类资源限制是Pod中对应的资源类型限制的总和,在调度的过程中调度器使用这个总和值和主机上可用容量做比较,决定主机是否满足资源需求。这种调度属于静态的资源调度,即使主机上的真实负载很低,只要容量限制不满足需求,也不能在主机上部署Pod。

Resource Quota是在命名空间级别设置的资源限制,主要是解决多租户共享资源的问题。Resource Quota中的cpu指对应的命名空间中所有Pod可以使用的cpu的总和,memory指对应的命名空间中所有Pod可以使用的memory的总和。

结语

kubernetes的调度器是完全插件化的实现,可以很方便的集成其它的调度器进行扩展。目前的调度器包含多个级别的资源限制,但是调度相关的实现相对简单,使用一些静态的规则去做调度,对于提升集群资源使用率、保障业务的QoS效果不是很明显。

kubernetes调度器以后可能支持使用不同的调度器去调度不同的任务,这个实验中的新特性对于有多种类型业务混合部署在kubernetes集群中的用户会有很大帮助。

kubernetes正在开发中的QoS借鉴Borg的成熟经验,重点关注提高集群资源利用率的问题,这个特性非常值得期待。

作者:天云软件_北京天云融创_云计算_云平台
北京天云融创软件技术有限公司_云系统专家
原文地址:kubernetes调度详解, 感谢原作者分享。

发表评论