hualinux 进阶 1.23:k8s调度器的调度策略(整理)

目录

 一、调度器的调度策略

二、Predicates谓词(过滤)

2.1 GeneralPredicates(一般谓词)

2.2 与 Volume 相关的过滤规则

2.3 宿主机相关的过滤规则

2.4 Pod 相关的过滤规则

2.5 小结

三、Priorities优先级(打分)

四、总结


了解一下 调度器的调度策略 也是加深对k8s的理解,事先可以看一下官网的《调度策略 》

 一、调度器的调度策略

主要有两处策略:过滤的 谓词(Predicates) 和打分的 优先级(Priorities) 。

 

二、Predicates谓词(过滤)

Predicates 在调度过程中的作用,可以理解为 Filter,即:它按照调度策略,从当前集群的所有节点中,“过滤”出一系列符合条件的节点。这些节点,都是可以运行待调度 Pod 的宿主机。

官网的《调度策略 》,在 Kubernetes 中,默认的调度策略有如下三种。

2.1 GeneralPredicates(一般谓词)

顾名思义,这一组过滤规则,负责的是最基础的调度策略。比如,PodFitsResources 计算的就是宿主机的 CPU 和内存资源等是否够用。

当然,我在前面已经提到过,PodFitsResources 检查的只是 Pod 的 requests 字段。需要注意的是,Kubernetes 的调度器并没有为 GPU 等硬件资源定义具体的资源类型,而是统一用一种名叫 Extended Resource 的、Key-Value 格式的扩展字段来描述的。

2.2 与 Volume 相关的过滤规则

这一组过滤规则,负责的是跟容器持久化 Volume 相关的调度策略。

其中,NoDiskConflict 检查的条件,是多个 Pod 声明挂载的持久化 Volume 是否有冲突。比如,AWS EBS 类型的 Volume,是不允许被两个 Pod 同时使用的。所以,当一个名叫 A 的 EBS Volume 已经被挂载在了某个节点上时,另一个同样声明使用这个 A Volume 的 Pod,就不能被调度到这个节点上了。

 MaxPDVolumeCountPredicate 检查的条件,则是一个节点上某种类型的持久化 Volume 是不是已经超过了一定数目,如果是的话,那么声明使用该类型持久化 Volume 的 Pod 就不能再调度到这个节点了。

MaxPDVolumeCountPredicate 检查的条件,则是一个节点上某种类型的持久化 Volume 是不是已经超过了一定数目,如果是的话,那么声明使用该类型持久化 Volume 的 Pod 就不能再调度到这个节点了。

 VolumeZonePredicate,则是检查持久化 Volume 的 Zone(高可用域)标签,是否与待考察节点的 Zone 标签相匹配。

此外,这里还有一个叫作 VolumeBindingPredicate 的规则。它负责检查的,是该 Pod 对应的 PV 的 nodeAffinity 字段,是否跟某个节点的标签相匹配。

2.3 宿主机相关的过滤规则

这一组规则,主要考察待调度 Pod 是否满足 Node 本身的某些条件。

比如,PodToleratesNodeTaints,负责检查的就是我们前面经常用到的 Node 的“污点”机制。只有当 Pod 的 Toleration 字段与 Node 的 Taint 字段能够匹配的时候,这个 Pod 才能被调度到该节点上。

2.4 Pod 相关的过滤规则

这一组规则,跟 GeneralPredicates 大多数是重合的。而比较特殊的,是 PodAffinityPredicate。这个规则的作用,是检查待调度 Pod 与 Node 上的已有 Pod 之间的亲密(affinity)和反亲密(anti-affinity)关系。

PS:可以查看官网的《亲和性和反亲和性

2.5 小结

四种类型的 Predicates,就构成了调度器确定一个 Node 可以运行待调度 Pod 的基本策略。

在具体执行的时候, 当开始调度一个 Pod 时,Kubernetes 调度器会同时启动 16 个 Goroutine,来并发地为集群里的所有 Node 计算 Predicates,最后返回可以运行这个 Pod 的宿主机列表。

需要注意的是,在为每个 Node 执行 Predicates 时,调度器会按照固定的顺序来进行检查。这个顺序,是按照 Predicates 本身的含义来确定的。比如,宿主机相关的 Predicates 会被放在相对靠前的位置进行检查。要不然的话,在一台资源已经严重不足的宿主机上,上来就开始计算 PodAffinityPredicate,是没有实际意义的。

 

三、Priorities优先级(打分)

在 Predicates 阶段完成了节点的“过滤”之后,Priorities 阶段的工作就是为这些节点打分。这里打分的范围是 0-10 分,得分最高的节点就是最后被 Pod 绑定的最佳节点。

Priorities 里最常用到的一个打分规则,是 LeastRequestedPriority。它的计算方法,可以简单地总结为如下所示的公式:

score = (cpu((capacity-sum(requested))10/capacity) + memory((capacity-sum(requested))10/capacity))/2

可以看到,这个算法实际上就是在选择空闲资源(CPU 和 Memory)最多的宿主机。

而与 LeastRequestedPriority 一起发挥作用的,还有 BalancedResourceAllocation。它的计算公式如下所示:

score = 10 - variance(cpuFraction,memoryFraction,volumeFraction)*10

其中,每种资源的 Fraction 的定义是 :Pod 请求的资源 / 节点上的可用资源。而 variance 算法的作用,则是计算每两种资源 Fraction 之间的“距离”。而最后选择的,则是资源 Fraction 差距最小的节点。

所以说,BalancedResourceAllocation 选择的,其实是调度完成后,所有节点里各种资源分配最均衡的那个节点,从而避免一个节点上 CPU 被大量分配、而 Memory 大量剩余的情况。

此外,还有 NodeAffinityPriority、TaintTolerationPriority 和 InterPodAffinityPriority 这三种 Priority。顾名思义,它们与前面的 PodMatchNodeSelector、PodToleratesNodeTaints 和 PodAffinityPredicate 这三个 Predicate 的含义和计算方法是类似的。但是作为 Priority,一个 Node 满足上述规则的字段数目越多,它的得分就会越高。

在默认 Priorities 里,还有一个叫作 ImageLocalityPriority 的策略。它是在 Kubernetes v1.12 里新开启的调度规则,即:如果待调度 Pod 需要使用的镜像很大,并且已经存在于某些 Node 上,那么这些 Node 的得分就会比较高。

当然,为了避免这个算法引发调度堆叠,调度器在计算得分的时候还会根据镜像的分布进行优化,即:如果大镜像分布的节点数目很少,那么这些节点的权重就会被调低,从而“对冲”掉引起调度堆叠的风险。

 

四、总结

以上,就是 Kubernetes 调度器的 Predicates 和 Priorities 里默认调度规则的主要工作原理了。

在实际的执行过程中,调度器里关于集群和 Pod 的信息都已经缓存化,所以这些算法的执行过程还是比较快的。

此外,对于比较复杂的调度算法来说,比如 PodAffinityPredicate,它们在计算的时候不只关注待调度 Pod 和待考察 Node,还需要关注整个集群的信息,比如,遍历所有节点,读取它们的 Labels。这时候,Kubernetes 调度器会在为每个待调度 Pod 执行该调度算法之前,先将算法需要的集群信息初步计算一遍,然后缓存起来。这样,在真正执行该算法的时候,调度器只需要读取缓存信息进行计算即可,从而避免了为每个 Node 计算 Predicates 的时候反复获取和计算整个集群的信息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.23版本的Kubernetes(K8s)是开源容编排平台的最新发行版。它是一个用于自动部署、扩展和管理容化应用程序的工具。以下是一些1.23版本的K8s资源的特点和功能: 1. Pod:Pod是K8s的最小工作单元,用于运行应用程序的容1.23版本的K8s引入了一些新功能,例如支持IPVS代理模式,以提升网络性能和可靠性。 2. Service:Service用于将一组Pod暴露给其他应用程序或用户。1.23版本的K8s增加了支持基于路径的域名转发,以简化网络配置和管理。 3. Deployment:Deployment用于管理Pod副本集的部署和更新。1.23版本的K8s增强了Deployment的功能,例如引入了滚动升级和回滚功能,以确保应用程序的平滑运行。 4. StatefulSet:StatefulSet用于管理有状态应用程序的部署和更新。1.23版本的K8s提供了更灵活的网络标识和稳定的网络持久性,以更好地支持有状态应用程序的部署。 5. DaemonSet:DaemonSet用于在集群中的每个节点上运行一个Pod副本。1.23版本的K8s增加了弹性容量管理功能,例如支持节点污点和容忍策略,以更好地适应节点的添加和删除。 6. ConfigMap和Secret:ConfigMap和Secret用于存储应用程序的配置信息和敏感数据。1.23版本的K8s提供了更强大的ConfigMap和Secret功能,例如支持环境变量、文件和挂载卷的动态更新。 7. PersistentVolume和PersistentVolumeClaim:PersistentVolume和PersistentVolumeClaim用于提供持久化存储。1.23版本的K8s引入了新的存储插件和功能,例如CSI (Container Storage Interface)插件,以增强持久化存储的灵活性和可扩展性。 总之,1.23版本的K8s提供了更多功能和改进,以帮助用户更轻松地部署、管理和扩展容化应用程序。它继续致力于提供可靠、高性能和可扩展的容编排平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值