k8s QoS与pod驱逐
概述
QoS是Quality of Service的缩写,即服务质量。每个pod属于某一个QoS分类,而Kubernetes会根据pod的QoS级别来决定pod的调度、抢占调度和驱逐优先级,而且pod的QoS级别也影响oomkiller对杀死进程的选择。
pod QoS级别
QoS主要分为Guaranteed、Burstable和Best-Effort三个级别,优先级从高到低。
怎么决定某个pod属于哪个QoS分类呢?根据pod yaml中的cpu和内存资源定义决定。
Guaranteed
同时满足以下情形的pod属于Guaranteed级别:
(1)pod中的所有容器都设置了cpu的request、limit值;
(2)pod中每个容器的cpu的request值与limit值都相等;
(1)pod中的所有容器都设置了内存的request、limit值;
(2)pod中每个容器的内存的request值与limit值都相等;
...
containers:
- name: test-a
resources:
limits:
cpu: 10m
memory: 1Gi
requests:
cpu: 10m
memory: 1Gi
...
- name: test-b
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 100m
memory: 100Mi
...
Burstable
同时满足以下情形的pod属于Burstable级别:
(1)pod不符合Guaranteed的QoS级别标准;
(2)pod中至少有一个容器设置了内存或cpu的request或limit值;
...
containers:
- name: test-a
...
- name: test-b
resources:
limits:
memory: 200Mi
requests:
memory: 100Mi
...
Best-Effort
同时满足以下情形的pod属于Best-Effort级别:
(1)pod中的所有容器都没有设置内存的request与limit;
(2)pod中的所有容器都没有设置cpu的request与limit;
...
containers:
- name: test-a
...
- name: test-b
...
kubelet驱逐pod顺序
kubelet不使用pod的QoS级别来确定驱逐顺序,但注意,Guaranteed级别QoS的pod不会被驱逐。
当node节点内存资源不足时,会触发kubelet的节点压力驱逐,pod驱逐顺序选择如下(排在前面的优先被驱逐):
(1)先根据pod的内存使用量是否超过内存request排序,超过的排在前面;
(2)再根据pod的priority值大小排序,值小的排在前面;
(3)最后根据pod内存request值减去pod的内存使用量的值,得到值小的排在前面;
关于pod的priority
通过pod.spec.priorityClassName、pod.spec.priority可为pod设置priority值大小,另外,Guaranteed级别QoS的pod也会间接设置priority值;
pod的priority值大小会影响kubelet驱逐pod的顺序,还会影响kube-scheduler对于pod调度、抢占调度的优先级顺序:
(1)当kubelet驱逐pod时,pod其他条件相同的情况下,priority值越小的越容易被驱逐;
(2)priority值越大,kube-scheduler对于pod调度的优先级越高;
(3)当pod因资源不足而调度失败时,kube-scheduler会抢占调度该pod,即将priority值比它小的pod驱逐掉,然后将该pod调度上去;
详细内容请查看官方文档:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/pod-priority-preemption/
OOM killer机制
当kubelet没来得及触发pod驱逐,使得节点内存耗尽时,将触发节点上的OOM killer机制;
Linux上有个机制叫OOM killer(Out Of Memory killer),这个机制会在系统内存耗尽的情况下发挥作用,即根据一定的算法规则,选择性的杀死一些进程,以释放部分内存,让系统继续稳定运行。
如何选择杀死哪个进程
当发生oomkill时,OOM killer给进程打分,得到oom_score,然后优先把oom_score最大的进程先杀死;
oom_score怎么计算获得呢?oom_score=oom_score_adj+进程内存占用大小;
而oom_score_adj则是可以人工给每个进程设置的,从而让用户通过设置进程的oom_score_adj值来影响OOM killer杀死进程的选择;
当oom_score_adj的值设置为-1000时,表示该进程将不会被OOM killer杀死,但如果设置的值不是-1000,那这个进程还是会参与打分,会受oom_score_adj以及进程内存占用大小的影响,需要注意的是,即使oom_score_adj的值设置的很小,比如-999,但当你的进程占用内存很大时,该进程同样有很大的概率会被杀死;
pod中容器进程的oom_score_adj
对于Guaranteed级别的pod,其oom_score_adj的值被设置为-998,对于Best-Effort级别的pod,其oom_score_adj的值被设置为1000,对于Burstable级别的pod,其oom_score_adj的取值为2到999。
怎么避免OOM Killer杀死某个业务进程?
(1)将进程oom_score_adj的值设置为-1000;
(2)关闭OOM killer机制;
pod抢占调度
pod抢占调度机制,解决的是 Pod 调度失败时该怎么办的问题。
正常情况下,当一个 pod 调度失败后,就会被暂时 “搁置” 处于 pending 状态,直到 pod 被更新或者集群状态发生变化,调度器才会对这个 pod 进行重新调度。
但是有的时候,我们希望给pod分等级,即分优先级。当一个高优先级的 Pod 调度失败后,该 Pod 并不会被“搁置”,而是会“挤走”某个 Node 上的一些低优先级的 Pod(请求apiserver,删除pod),这样一来就可以保证高优先级 Pod 会优先调度成功。
这里所讲的优先级就是前面提到的pod的priority值大小。
关于pod优先级,具体请参考:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/pod-priority-preemption/
抢占发生的原因,一定是一个高优先级的 pod 调度失败,我们称这个 pod 为“抢占者”,称被抢占的 pod 为“牺牲者”(victims)。
k8s QoS与pod驱逐的更多相关文章
- 如何为k8s中的pod配置QoS等级?
1.概述 本文介绍如何为pod分配特定的QoS等级. 我们知道,在k8s的环境中,通过使用QoS等级来做决定,在资源紧张的时候,将哪些的pod进行驱逐,或者说如何对pod进行调度. OK,话不多说,让 ...
- 十六, k8s集群资源需求和限制, 以及pod驱逐策略。
目录 容器的资源需求和资源限制 QoS Classes分类 Guaranteed Burstable Best-Effort kubernetes之node资源紧缺时pod驱逐机制 Qos Class ...
- k8s 应用优先级,驱逐,波动,动态资源调整
k8s 应用优先级,驱逐,波动,动态资源调整 应用优先级 Requests 和 Limits 的配置除了表明资源情况和限制资源使用之外,还有一个隐藏的作用:它决定了 Pod 的 QoS 等级. 上一节 ...
- k8s学习 - 概念 - Pod
k8s学习 - 概念 - Pod 这篇继续看概念,主要是 Pod 这个概念,这个概念非常重要,是 k8s 集群的最小单位. 怎么才算是理解好 pod 了呢,基本上把 pod 的所有 describe ...
- Kubernetes Pod 驱逐详解
原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...
- kubernetes之node资源紧缺时pod驱逐机制
在系统硬件资源紧缺的情况下保证node的稳定性, 是kubelet需要解决的一个重要问题 1.驱逐策略 kubelet持续监控主机的资源使用情况, 一旦出现资源紧缺的迹象, kubelet就会主动终止 ...
- Kubernetes Pod驱逐策略
Kubelet 能够主动监测和防止计算资源的全面短缺. 在资源短缺的情况下,kubelet 可以主动地结束一个或多个 Pod 以回收短缺的资源. 当 kubelet 结束一个 Pod 时,它将终止 P ...
- K8s之实践Pod深入理解
K8s之实践Pod深入理解 1.同一pod下的nginx+php+mysql nginx+php+mysql.yaml文件 --- apiVersion: v1 kind: Secret meta ...
- k8s 中的 Pod 细节了解
k8s中Pod的理解 基本概念 k8s 为什么使用 Pod 作为最小的管理单元 如何使用 Pod 1.自主式 Pod 2.控制器管理的 Pod 静态 Pod Pod的生命周期 Pod 如何直接暴露服务 ...
随机推荐
- grpc-java源码环境编译
1. Clone 1.1 git clone https://github.com/grpc/grpc-java.git 1.2 idea 打开grpc-java工程 2.compile 2.1 ja ...
- 万字长文,带你轻松学习 Spark
大家好,我是大D. 今天给大家分享一篇 Spark 核心知识点的梳理,对知识点的讲解秉承着能用图解的就不照本宣科地陈述,力求精简.通俗易懂.希望能为新手的入门学习扫清障碍,从基础概念入手.再到原理深入 ...
- MTK 平台sensor arch 介绍-scp
架构介绍 路径:vendor/mediatek/proprietary/tinysys/scp 1.[build]编译相关 2.[driver]scp 的driver,I2C,power,eint 3 ...
- 中国程序员容易发错音的单词「GitHub 热点速览 v.22.23」
中国程序员容易发错音的单词,像极了学生时代的纠错本,收录着偶尔会忘记的单词.不过,它似乎更新频率跟不上我们的进步速度,至少一半以上的单词读起来是没有压力的.同样没有压力的还有让应用程序动起来的 aut ...
- 【算法】Floyd算法
什么是Floyd Floyd用于求最短路程.举个栗子,给你一张图,让你求出点[1]到点[5]的最短路程,你会怎么求? (画图工具:CS Academy) 如上图,有向边分别是 1->2 1-& ...
- React中http-proxy-middleware代理使用
React项目npm run start启动本地服务后浏览器访问http://localhost:3000 start命令也可自定义port指定本地运行端口(eg: PORT=3002) 对于单点登录 ...
- LoRa模块无线收发通信技术详解
LoRa是一种LPWAN通信技术,它基于扩频技术而广泛应用于超长距离的无线传输场景中.现在,LoRa主要在全世界433.868.915MHz等自由频带工作.其最大特征是灵敏度高,传输距离长,工作功耗低 ...
- Gitee整改之思考
本文主要内容如下: 1.Gitee是什么? 2.Gitee与Github的区别有哪些? 3.为什么要使用Gitee? 4.Gitee的商业模式是怎样的? 5.Gitee为何会被整改? 6.Gitee这 ...
- vivo大规模 Kubernetes 集群自动化运维实践
作者:vivo 互联网服务器团队-Zhang Rong 一.背景 随着vivo业务迁移到K8s的增长,我们需要将K8s部署到多个数据中心.如何高效.可靠的在数据中心管理多个大规模的K8s集群是我们面临 ...
- 敲了几万行源码后,我给Mybatis画了张“全地图”
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.说说:"产"后感受 有人跟我说,手写Spring难,手写Mybatis ...