文档章节

解析Kubernetes 1.8中的基于Pod优先级的抢占式调度

WaltonWang
 WaltonWang
发布于 2017/11/02 01:34
字数 1800
阅读 1978
收藏 37

Author: xidianwangtao@gmail.com

Kubernetes 1.8中对scheduler的更新

  • 【Alpha】支持定义PriorityClass,并指定给Pod来定义Pod Priority;
  • 【Alpha】支持基于Pod Priority的抢占式调度;
  • 【Alpha】Node Controller支持自动根据Node Condition给Node打上对应的Taints;

什么是抢占式调度?
在Kubernetes 1.8版本之前,当集群资源不足时,用户提交新的Pod创建请求后,该Pod会处于Pending状态,直到集群中有某个Node有足够Available Resources时才会调度成功。 从Kubernetes 1.8版本开始,这种情况下scheduler会根据Pod's Priority进行调度,调度时会选择最合适的Node并把该Node上lower Priority的Pods进行Premmption(Eviction)以释放资源供该higher Priority Pod使用。这种调度时考虑Pod Priority的方式就是Kubernetes中的抢占式调度,简称为Preemption。

在后续的版本中,Pod Priority还会用于节点的out-of-resource Eviction,关于kubelet eviction的工作机制和源码分析,请参考我的对应博客:

如何开启或关闭该Feature

在Kubernetes 1.8中,Pod Priority和Preemption作为Alpha特性,默认是disable的,如果你要使用该特性,需要给apiserver和scheduler添加如下参数并重启:

  • kube-apiserver xxx --feature-gates=PodPriority=true --runtime-config=scheduling.k8s.io/v1alpha1=true
  • kube-scheduler xxx --feature-gates=PodPriority=true

反过来,把上面的参数删除并重启,即可disable。

有个问题:如果我开启了这个特性,并且创建了一些PriorityClass,然后还给某些Pod使用了,这个时候我再disable掉这个特性,会不会有问题?

答案是否定的!disable后,那些之前设置的Pod Priority field还会继续存在,但是并没什么用处了,Preemption是关闭的。当然,你也不能给新的Pods引用PriorityClass了。

创建PriorityClass

Enable后,接下来就是创建PriorityClass了:

apiVersion: scheduling.k8s.io/v1alpha1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for XYZ service pods only."

注意:PriorityClass是非namespace隔离的,是global的。因此metadata下面是不能设置namespace field的。

  • apiVersion: scheduling.k8s.io/v1alpha1 # enable的时候需要配置的runtime-config参数;
  • metadata.name: 设置PriorityClass的名字;
  • value: 32-bit 整型值,值越大代表优先级越高,但是必须小于等于 1 billion,大于 1 billion的值是给集群内的critical system Pods保留的,表示该Priority的Pod是不能被抢占的。
  • globalDefault: true or false,注意只能有一个PriorityClass的这个字段为true,如果没有一个PriorityClass的该字段为true,则那些没有明确引用PriorityClass的Pod的Priority value就为最低值0.
  • description: String,写给人看的备注,Kubernetes不做处理;

注意:

  • PriorityClass只会影响那些还没创建的Pod,一旦Pod创建完成,那么admission Controller就已经将Pod Spec中应用的PriorityClassName对应的PriorityClass的value设置到Pod的Priority field了。意味着你再修改PriorityClass的任何field,包括globalDefault,也不会影响已经创建完成的Pod。

  • 如果你删除某个PriorityClass,那么不会影响已经引用它的Pod Priority,但你不能用它来创建新的Pod了。这其实是显而易见的。

创建Pod并引用该PriorityClass

接下来,就是创建对应Priority的Pod了:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  priorityClassName: high-priority

如果Pod.spec. priorityClassName中指定的PriorityClass不存在,则Pod会创建失败;
前面也提到,创建Pod的时候Priority Admission Controller会根据PriorityClassName找到对应的PriorityClass,并将其value设置给Pod.spec.priority。

Preemption当前还存在的问题

  • 因为抢占式调度evict低优先级Pod时,有一个优雅终止时间(默认30s),如果该Node上需要evict多个低优先级的Pod,那么可能会需要很长的时间后,最终Pod才能调度到该Node上并启动运行,那么问题来了,这么长时间的过去了,这个Node是否此时此刻还是最适合这个Pod的呢?不一定!而且在大规模且创建Pod频繁的集群中,这种结果是经常的。意味着,当初合正确的调度决定,在真正落实的时候却一定时正确的了。
  • 还不支持preempted pod时考虑PDB,计划会在beta版中实现;
  • 目前premmpted pod时没考虑Pending pod和victims pod的亲和性:如果该pending pod要调度到的node上需要evict的lower Priority pods和该pending pod是亲和的,目前直接evict lower Priority pods就可能会破坏这种pod亲和性。
  • 不支持跨节点抢占。比如pending Pod M要调度到Node A,而该Pending Pod M又与“同Node A一个zone的Node B上的Pod N”是基于zone topology反亲和性的,目前的Alpha版本就会导致Pod M继续Pending不能成功调度。如果后续支持跨界点抢占,就能将lower Priority的Pod N从Node B上evict掉,从而保证了反亲和性。

Taint Nodes by Condition

在Kubernetes 1.8之前,Node Condition是会直接干预调度的,逻辑是是这样的,并且是无法改变的:

  • kubelet会定期的将Node Condition传给kube-apiserver并存于etcd。
  • kube-scheduler watch到Node Condition Pressure之后,会根据以下策略,阻止更多Pods Bind到该Node。
Node ConditionScheduler Behavior
MemoryPressureNo new BestEffort pods are scheduled to the node.
DiskPressureNo new pods are scheduled to the node.
- 当Node Condition包含Memory Pressure时,不再允许BestEffort QoS Pods调度到该节点;
- 当Node Condition包含DiskPressure时,不允许任何pods调度到该节点。

从Kubernetes 1.6开始,kubelet和Node Controller支持自动根据Node Condition给Node打上相应的内置Taints,当时这些Taints只是会影响kubelet eviction,而不会影响调度。这有啥不同呢?区别就是,给Node打上Taints对调度来说是软限制,可以通过给pods加上对应的Tolerations就可能强制调度到那个节点。而在1.8之前,Node Condition影响调度是硬限制。

Node Condition和Taints的Map关系如下:

ConditionTypeCondition StatusEffectKey
ReadyTrue-
FalseNoExecutenode.kubernetes.io/notReady
UnknownNoExecutenode.kubernetes.io/unreachable
OutOfDiskTrueNoSchedulenode.kubernetes.io/outOfDisk
False-
Unknown-
MemoryPressureTrueNoSchedulenode.kubernetes.io/memoryPressure
False-
Unknown-
DiskPressureTrueNoSchedulenode.kubernetes.io/diskPressure
False-
Unknown-
NetworkUnavailableTrueNoSchedulenode.kubernetes.io/networkUnavailable
False-
Unknown-

总结

Kubernetes 1.8中基于Pod优先级进行抢占式调度的特性都是Alpha,请谨慎在生产中使用,尤其是要注意本文中“Preemption当前还存在的问题”小节中提到的不足。

  • 【Alpha】支持定义PriorityClass,并指定给Pod来定义Pod Priority;
  • 【Alpha】支持基于Pod Priority的抢占式调度;
  • 【Alpha】Node Controller支持自动根据Node Condition给Node打上对应的Taints;

相信很快就能支持好抢占式调度时支持Pod亲和性、跨节点抢占等特性了,那时就完美了。

© 著作权归作者所有

共有 人打赏支持
WaltonWang
粉丝 203
博文 102
码字总数 214403
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

WaltonWang
WaltonWang

引用来自“Colben”的评论

节点亲和性、pod亲和性、现在又出了个 pod 优先级 …… 越来越复杂了
是的,越来越复杂了,都是为了解决不同的问题需要。
Colben
Colben
节点亲和性、pod亲和性、现在又出了个 pod 优先级 …… 越来越复杂了
Kubernetes 1.8抢占式调度Preemption源码分析

Author: xidianwangtao@gmail.com 阅读本博文前,建议先阅读解析Kubernetes 1.8中的基于Pod优先级的抢占式调度。 ScheduleAlgorithm的变化 在Kubernetes 1.8中,对ScheduleAlgorithm Interfa...

WaltonWang
2017/11/06
0
2
Kubernetes Pod 优先级和抢占

Kubernetes 1.8 及其以后的版本中可以指定 Pod 的优先级。优先级表明了一个 Pod 相对于其它 Pod 的重要性。当 Pod 无法被调度时,scheduler 会尝试抢占(驱逐)低优先级的 Pod,使得这些挂起...

数据架构师
2018/12/11
0
0
[kubernetes系列]Scheduler模块深度讲解

一,前言 调度器的职责是负责将Pod调度到最合适的Node上,但是要实现它并不是易事,需要考虑很多方面。(1) 公平性:调度后集群各个node应该保持均衡的状态。(2) 性能:不能成为集群的性能瓶颈...

奇犽
2018/11/11
0
0
Kubernetes 年度关键进展回顾

2017年已经接近尾声,Kubernetes保持者每季度一个大版本的节奏快速发展,1.6至1.9版本共计完成了近150项特新更新,在集群规模、调度能力、可扩展性、安全性等方面都有明显提升。以下,笔者将...

m2l0zgssvc7r69efdtj
2017/12/30
0
0
zephyr笔记 2.1.2 线程的调度

我正在学习 Zephyr,一个很可能会用到很多物联网设备上的操作系统,如果你也感兴趣,可点此查看帖子zephyr学习笔记汇总。 1 前言 Zephyr 使用基于优先级的调度器来让应用线程们共享CPU。 ht...

iotisan
2018/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

人生道路由什么决定

1. 坐在家里看会电视剧,觉得挺好看的,但是心里面不踏实,不舒服,觉得自己应该学习东西,研究工作内容。 2. 上次面试遇到的问题,让我认识到,工作中不仅仅要解决问题,还应该把工作中用到...

kuchawyz
1分钟前
1
0
分析java程序

最近公司的一个账单推送的服务,发现有延迟。我排查的时候发现,有一个程序日志不动了(采用消息队列,部署了两台服务器来负载均衡)。 网上说: jstack 可以来排查。 可以观察到jvm中当前所...

miaojiangmin
5分钟前
0
0
android camera(一):camera模组CMM介绍

这篇比较基础,做为科普知识看一下。 android camera(一):camera模组CMM介绍 android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF) android camera(三):camera V4L2 FIMC an...

天王盖地虎626
9分钟前
0
0
CDH整合zeppelin

CDH二进制安装zeppelin-0.8.0: 在下载地址1,下载zeppelin-0.8.0-bin-all.tgz 上传服务器,解压tar -zxvf zeppelin-0.8.0-bin-all.tgz cd zeppelin-0.8.0-bin-all/conf/ cp zeppelin-env.sh......

hblt-j
13分钟前
0
0
CMF5 图片上传并保存到七牛云

/** * 上传图片并保存到七牛云 */ public function uploadPic(){ //接收文件 $file=request()->file('file'); if($file==null){ ......

小小小小小胖丶
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部