专栏首页K8S疑难杂症K8S调度器优选策略讲解(2)SelectorSpreadPriority
原创

K8S调度器优选策略讲解(2)SelectorSpreadPriority

该优选策略的目标是使属于同一个服务(service或者Replication Controllers)的pod尽量均匀的分布在各个节点上或者zone上。在k8s 1.18版本中默认开启。在该优选策略的实现中,使用的是DefaultPodTopologySpread打分插件。

接下来一起看下DefaultPodTopologySpread打分插件的打分(算法)逻辑。

算法逻辑

DefaultPodTopologySpread 插件的算法逻辑包括了三个部分:

  • preScore 准备阶段
  • Score 统计阶段
  • NormalizeScore 分数计算阶段

preScore

打分前的准备阶段。对于该插件,在准备阶段中,主要的工作是依据pod,并结合service、Replication Controllers, ReplicaSets 和 StatefulSets推导出的selector。用于在Score阶段,过滤出节点上与pod(待调度)同一个的其他pods对象。

Score

打分的统计阶段。对于该优选策略,统计节点会给node上的pods做统计,统计的匹配条件是被调度pod的namespace和preScore推导出的selector,方法是遍历当前node节点上所有的pods,如果符合匹配条件,count++。

经过这个阶段后,集群中所有的node都会得到一个统计值(count或者sores[i].Socre)。

代码逻辑如下:

countMatchingPods

NormalizeScore

分数计算阶段,在该阶段,会计算出所有node的分数(在调度过程中起作用的分数值)。

1 第一步 获取以下三个值:

  • maxCountByZone : 某个zone下的Count(来自Score阶段)最大的值。
  • maxCountByNodeName:某个node上的Count(来自Score阶段)最大的值。
  • countsByZone:以zone为单位的count计数。

2 第二步:

首先:所有节点的打分都会有一个初始化值MaxNodeScore(默认数值是100)

然后:开始为节点的打分,计算方法如下:

# socres[i].Score 表示某个节点的count计数
fScore = MaxNodeScoreFloat64 * (float64(maxCountByNodeName-scores[i].Score) / maxCountByNodeNameFloat64)

3 第三步

判断集群中的节点是否有使用zone,如果有使用zone,再给zone打分,最后结合节点的打分和zone的打分来给出一个最终得分(就是当前候选节点的score得分)。计算方法如下:

其中,在最后打分环节,zone的权重(zoneWeighting)为2/3,node的权重(nodeWeighting)是1/3。

# zone分数的初始值也是100
zoneScore := MaxNodeScoreFloat64
# 计算出单个zone的分数
zoneScore = MaxNodeScoreFloat64 * (float64(maxCountByZone-countsByZone[zoneID]) / maxCountByZoneFloat64)
# 根据节点的打分和zone的打分,计算出node的最后得分
fScore = (fScore * (1.0 - zoneWeighting)) + (zoneWeighting * zoneScore)

经过上面的三个阶段,SelectorSpreadPriority优选策略就完成了对所有节点的打分。

举例说明

接下来一个测试deployment为例,进一步熟悉一下SelectorSpreadPriority打分的过程,具体场景描述如下:

节点

node4000101

node4000102

node4000201

所属zone

sh-40001

sh-40001

sh-40002

副本数量

1

2

1

统计分数count(node维度)

1

2

1

统计分数count(zone维度)

3

3

1

补充:创建deployment时,也有创建对应的service。并且暂不考虑其他具有相同seleter服务的情况。

场景1 多扩容一个pod副本

比如,当前测试deployment的副本数为4,在场景1中把测试deployment的副本数扩容到5。

  • maxCountByZone : 3
  • maxCountByNodeName:2

打分结果如下:

打分结果

由上图可以得出,node4000101的打分是16,node4000102的打分是0,node4000201的打分是61,所以在考虑其他策略打分一样的情况下,新扩容的pod会被调度到node4000201这个节点上。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • K8S调度器优选策略讲解(3)隐藏的优选策略ImageLocalityPriority

    在pod的一次调度过程中,调度器(scheduler)会有预选策略和优选策略(打分策略),其中预选策略是选择出要调度的候选节点(比如检查node节点本身状态是否...

    keke.
  • K8S调度器优选策略讲解(1)简介

    在K8S集群中,调度器负责将客户提交的pod绑到某个node节点上,完成pod调度的调度工作。

    keke.
  • Kubernetes K8S之调度器kube-scheduler详解 预选策略(Predicates)优选策略(Priorities)

    在 Kubernetes 中,调度是指将 Pod 放置到合适的 Node 节点上,然后对应 Node 上的 Kubelet 才能够运行这些 pod。

    踏歌行
  • K8s 调度系统由浅入深系列:简介

    从CNCF基金会的成立,到Kubernetes社区蓬勃发展,历经6载,17年异军突起,在mesos、swarm等项目角逐中,拔得头筹,继而一统容器编排,其成功的...

    CNCF
  • Kubernetes Scheduler 调度详解:基于Kubernetes 1.61版本

    Kubernetes Scheduler 的作用是根据特定的调度算法将 pod 调度到指定的工作节点(Node)上,这一过程也叫绑定(bind)。本文将对 Sc...

    腾讯云容器服务团队
  • 深入kubernetes调度之原理分析

    调度器是编排工具的核心,调度策略和算法是编排工具的灵魂。Kubernetes之所以能够大行其道,正是因为其优良的调度算法,本文就来分析下kubernets中sc...

    kubernetes中文社区
  • 这应该是最全的K8s-Pod调度策略了

    API Server接受客户端提交Pod对象创建请求后的操作过程中,有一个重要的步骤就是由调度器程序kube-scheduler从当前集群中选择一个可用的最佳节...

    小小科
  • k8s基础之调度策略(一)

    Kubernetes Scheduler在整个系统中承担了“承上启下”的重要功能, “承上”是指它负责接收Controller Manager创建的新Pod, ...

    dogfei
  • Kubernetes 调度器介绍

    kube-scheduler 是 kubernetes 的调度器,它的主要作用就是根据特定的调度算法和调度策略将 Pod 调度到合适的 Node 节点上去,是一...

    SY小站
  • Kubernetes系列学习文章 - 什么是K8S?(二)

    | 导语 上一篇文章我们讲解了什么是“容器云” ,也许你会问我们用什么技术手段来实现容器云?很简单,就是上篇文章结尾说的 "docker + kubernet...

    宝哥@上云专家
  • k8s必学必会知识梳理

    对外暴露了Kubernetes API。它是的 Kubernetes 核心控制层。它被设计为水平扩展,即通过部署更多实例来横向扩展。API Server 负责和...

    我的小碗汤
  • 使用 K8s 进行作业调度实战分享

    最近在公司的数据同步项目(以下简称 ZDTP)中,需要使用到分布式调度数据同步执行单元,目前使用的方案是将数据同步执行单元打包成镜像,使用 K8s 进行调度。

    张乘辉
  • k8s 调度

    经过预选策略(Predicates)对节点过滤,获取节点列表,再对符合需求节点列表进行打分,最终选择Pod调度到一个分值最高节点。

    程序猿Damon
  • Kubernetes 之集群调度

    我们现在有这样一个需求,就是集群中多台服务的配置是不一致的。这就导致资源分配并不是均匀的,比如我们需要有些服务节点用来运行计算密集型的服务,而有些服务节点来运行...

    民工哥
  • 看焱融云CSI动态感知如何扩展Kubernetes Scheduler

    Kubernetes Scheduler 的作用是将待调度的 Pod 按照一定的调度算法和策略绑定到集群中一个合适的 Worker Node(以下简称 Node...

    焱融科技
  • kubernetes基础概念知多少

    kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用、高扩展性和可预测性的方式来管理容器应用的生命周期。通...

    luoxn28
  • Kubernetes Pod资源调度概述

    Kubernetes API Server接受客户端提交Pod对象创建请求后的操作过程中,有一个重要的步骤是由调度器程序kube-scheduler从当前集群中...

    仙人技术
  • k8s源码-揭开scheduler的算法面纱(下)

    先回顾下优选算法执行的流程,针对每个pod,先使用16个协程并行进行Map操作,Map操作每次要遍历配置的所有的的优选算法,建立node和算法的映射关系,然后并...

    ascehuang
  • 「首席看容器云架构」K8s 多区域部署

    Kubernetes 1.2增加了在多个故障区域中运行单个集群的支持(GCE称它们为“区域”,AWS称它们为“可用区域”,在这里我们将它们称为“区域”)。这是...

    首席架构师智库

扫码关注云+社区

领取腾讯云代金券