一、Pod Priority Preemption
对于运行的各种负载(如Service、Job)的中等规模或者打规模的集群来说,由于各种原因,需要尽可能提高集群的资源利用率。而提高资源利用率的常规做法是采用优先级方案,即不同负载对应不用的优先级,同时允许集群中的所有负载所需的资源超过集群可提供的资源,在这种情况下,当发生资源不足的情况下时,系统可以选择性释放一些不重要的负载(优先级最低的),保证最重要的负载能够获取足够的资源稳定运行。
在Kubernetes1.8版本之前,当集群的可用资源不足时,在用户提交新的Pod创建请求之后,该Pod会一直处于Pending状态,即使这个Pod是一个重要的Pod,也只能被动等待其它Pod被删除并释放资源,才能被调度成功。Kubernetes 1.8版本之后引入基于Pod优先级(Pod Priority Preempition)的调度策略,此时Kubernetes会尝试释放Pod,这种调度方式被称为“抢占式调度”。如果声明一个负载相对其它负载“更重要”,可以通过以下几个维度定义:
- Priority,优先级
- Qos,服务器质量等级
- 系统定义的其它度量指标
优先级抢占式调度策略的核心行为分别是驱逐(Eviction)和抢占式(Preemption),这两种行为使用场景不同,效果相同。
Eviction是kubelet进程的行为,即当一个Node资源不足时(under resource pressure)的情况时,该节点上的kubelet进程会执行驱逐动作,此时Kubelet会综合考虑Pod的优先级、资源申请量与实际使用量等信息计算哪些Pod需要驱逐;当同样优先级