源码为k8sv1.6.1版本,github上对应的commitid为b0b7a323cc5a4a2019b2e9520c21c7830b7f708e本文将分析Scheduler的调度算法原理和执行过程,重点介绍Scheduler算法预选和偏好的相关内容。KubernetesScheduler的基本功能KubernetesScheduler的作用是根据特定的调度算法将pod调度到指定的工作节点(Nodes)。这个过程也称为绑定(bind)。Scheduler的输入是需要调度的Pod和可以调度的节点(Node)的信息,输出是调度算法选出的Node,Pod绑定到这个Node上。KubernetesScheduler中的调度算法分为两个阶段:Preselection:根据配置的PredicatesPolicies(默认是DefaultProvider中定义的默认predicates策略集)过滤掉那些不符合Policies的Nodes,剩下的Nodes用作首选输入。Preference:根据配置的PrioritiesPolicies(默认为DefaultProvider中定义的默认优先级策略设置),对预选的Nodes进行评分排序,评分最高的Node为最合适的Node,绑定Pod到这个节点。预选规则详解Pre-rules主要用于过滤掉不符合规则的Node节点,剩下的节点作为首选输入。在1.6.1版本中,预选规则包括:详细规则说明:(1)NoDiskConflict:检查本主机是否存在卷冲突。如果此主机已挂载卷,则无法将使用此卷的其他Pod调度到此主机。GCE、AmazonEBS和CephRBD使用以下规则:GCE允许同时挂载多个卷,只要这些卷都是只读的。AmazonEBS不允许不同的pod挂载同一个卷。CephRBD不允许任意两个pod共享同一个监视器、匹配池和镜像。注意:ISCSI和GCE一样,如果卷都是只读的,则允许挂载具有相同IQN的两个卷。(2)NoVolumeZoneConflict:在给定区域限制的前提下,检查在本主机上部署Pod时是否存在卷冲突。目前指的是检查PV资源(NewVolumeZonePredicate对象谓词函数)。(3)MaxEBSVolumeCount:确保挂载的EBS存储卷不超过设置的最大值。默认值为39。它检查直接使用的存储卷,以及间接使用此类存储的PVC。计算不同卷的总数。如果部署一个新的Pod后卷的数量会超过设置的最大值,那么这个Pod就不能被调度到这个主机上。(4)MaxGCEPDVolumeCount:保证挂载的GCE存储卷不超过设置的最大值。默认值为16。规则与MaxEBSVolumeCount相同。(5)MaxAzureDiskVolumeCount:确保挂载的Azure存储卷不超过设置的最大值。默认值为16。规则与MaxEBSVolumeCount相同。(6)CheckNodeMemoryPressure:判断节点是否进入内存压力状态,如果是,则只允许调度内存标记为0的Pod。(7)CheckNodeDiskPressure:判断节点是否进入磁盘压力状态,如果是这样,则不会安排新的Pod。(8)PodToleratesNodeTaints:Pod是否满足节点容忍的一些条件。(9)MatchInterPodAffinity:节点亲和性筛选。(10)GeneralPredicates:包含一些基本的过滤规则(PodFitsResources、PodFitsHostPorts、HostName、MatchNodeSelector)。(11)PodFitsResources:检查节点上的空闲资源(CPU、Memory、GPU资源)是否满足Pod的要求。(12)PodFitsHostPorts:检查Pod中每个容器需要的HostPort是否已经被其他容器占用。如果有一个需要的HostPort不符合要求,那么这个Pod就不能被调度到这个主机上。(13)检查主机名是否为Pod指定的HostName。(14)检查host的label是否满足Pod的nodeSelector属性的要求。优化规则详解优化规则对符合要求的主机列表进行打分,最终选择得分最高的主机部署Pod。Kubernetes使用一组优先级函数处理每个候选主机。每个优先级函数返回一个0-10的分数,分数越高表示“更好”的主机,每个函数还对应一个表示权重的值。最终主机的得分通过以下公式计算:finalScoreNode=(weight1priorityFunc1)+(weight2priorityFunc2)+...+(weightn*priorityFuncn)详细规则说明:(1)SelectorSpreadPriority:对于属于同一个服务的Pod和replicationcontroller,尽可能分散在不同的主机上。如果指定区域,Pod将尽可能分布在不同区域的不同主机上。调度Pod时,先搜索Pod对应的service或replicationcontroller,再搜索service或replicationcontroller中已有的Pod。主机上运行的现有Pod越少,主机的得分越高。(2)LeastRequestedPriority:如果一个新的pod需要分配一个节点,这个节点的优先级由节点空闲部分占总容量的比例决定((总容量-节点上所有pod容量之和-新pod的容量)/总容量)来决定。CPU和内存的权重相等,比例最高的节点得分最高。需要注意的是,这个优先级函数起到了根据资源消耗跨节点分配pod的作用。计算公式如下:cpu((capacity–sum(requested))10/capacity)+memory((capacity–sum(requested))10/capacity)/2(3)BalancedResourceAllocation:尝试选择要更新的资源Pod部署后平衡机。BalancedResourceAllocation不能单独使用,必须和LeastRequestedPriority一起使用。它分别计算主机上cpu和内存的占比,主机的得分由cpu占比和内存占比的“距离”决定。计算公式如下:score=10–abs(cpuFraction-memoryFraction)*10(4)NodeAffinityPriority:Kubernetes调度中的亲和机制。NodeSelectors(调度时限制pod到指定节点),支持多种算子(In、NotIn、Exists、DoesNotExist、Gt、Lt),不限于节点标签的精确匹配。另外,Kubernetes支持两种类型的选择器,一种是“hard(requiredDuringSchedulingIgnoredDuringExecution)”选择器,保证选择的宿主机满足所有Pod对宿主机的规则要求。这个选择器更像是之前的nodeselector,在nodeselector的基础上增加了更合适的表达式语法。另一个“soft(prefersDuringSchedulingIgnoredDuringExecution)”选择器,它作为调度器将尝试但不保证满足NodeSelector的所有要求的提示。(5)InterPodAffinityPriority:通过迭代weightedPodAffinityTerm的元素计算sum,如果节点满足对应的PodAffinityTerm,则在sum上加上“weight”,sum最大的节点被选中。(6)NodePreferAvoidPodsPriority(weight1W):如果Node的Anotation没有设置key-value:scheduler.alpha.kubernetes.io/preferAvoidPods="...",则节点对该策略的评分为10分,加上权重10000,则该节点对该策略的评分至少为10W。如果设置了Node的Anotationscheduler.alpha.kubernetes.io/preferAvoidPods="...",如果pod对应的Controller是ReplicationController或者ReplicaSet,则该节点的策略得分为0。(7)TaintTolerationPriority:使用Pod中的tolerationList来匹配Node节点的Taint。成功配对的项目越多,分数越低。另外,在preferredschedulingrules中,有几个规则是默认不使用的:(1)ImageLocalityPriority:根据主机是否已经有Pod运行环境来打分。ImageLocalityPriority会判断主机上是否已经存在Pod运行所需的镜像,并根据已存在镜像的大小返回0-10的分数。如果Pod需要的镜像在宿主机上不存在,则返回0;如果主机上存在一些需要的图片,则根据这些图片的大小来确定分数。图像越大,得分越高。(2)EqualPriority:EqualPriority是一个优先级函数,赋予所有节点同等的权重。(3)ServiceSpreadingPriority:与SelectorSpreadPriority功能相同,已被SelectorSpreadPriority取代。(4)MostRequestedPriority:在ClusterAutoscalerProvider中,替换LeastRequestedPriority,给使用多个资源的节点更高的优先级。计算公式为:(cpu(10sum(requested)/capacity)+memory(10sum(requested)/capacity))/2原文链接:http://zhuanlan.51cto.com/columnlist/txyjs/【本文章为专栏作者《腾讯云技术社区》原创稿件,转载请联系原作者获得授权】点此查看作者更多好文章
