kubernetes-pod驱逐机制
1.驱逐策略
kubelet持续监控主机的资源使用情况,并尽量防止计算资源被耗尽。一旦出现资源紧缺的迹象,kubelet就会主动终止部分pod的运行,以回收资源。
2.驱逐信号
以下是一些kubelet能用来做决策依据的信号,依据这些信号来做驱逐行为。
memory : 内存;
nodefs: 指node自身的存储,存储daemon的运行日志等,一般指root分区/;
imagefs: 指docker daemon用于存储image和容器可写层(writable layer)的磁盘;
| Eviction Signal | Condition | Description |
|---|---|---|
memory.available |
MemoryPressue | memory.available := node.status.capacity[memory] - node.stats.memory.workingSet |
nodefs.available |
DiskPressure |
|
nodefs.inodesFree |
DiskPressure | nodefs.inodesFree := node.stats.fs.inodesFree |
imagefs.available |
DiskPressure | imagefs.available := node.stats.runtime.imagefs.available(镜像以及容器可写层等) |
imagefs.inodesFree |
DiskPressure | imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree |
memory.available的值不是根据系统的free 收集,取值来自于cgroupfs,free -m命令不支持在容器中工作,
cgroup.event_control #用于eventfd的接口
memory.usage_in_bytes #显示当前已用的内存
memory.limit_in_bytes #设置/显示当前限制的内存额度
memory.failcnt #显示内存使用量达到限制值的次数
memory.max_usage_in_bytes #历史内存最大使用量
memory.soft_limit_in_bytes #设置/显示当前限制的内存软额度
memory.stat #显示当前cgroup的内存使用情况
memory.use_hierarchy #设置/显示是否将子cgroup的内存使用情况统计到当前cgroup里面
memory.force_empty #触发系统立即尽可能的回收当前cgroup中可以回收的内存
memory.pressure_level #设置内存压力的通知事件,配合cgroup.event_control一起使用
memory.swappiness #设置和显示当前的swappiness
memory.move_charge_at_immigrate #设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去
memory.oom_control #设置/显示oom controls相关的配置
memory.numa_stat #显示numa相关的内存
查看系统总memory:
cat /proc/meminfo |grep MemTotal
查看当前已使用memory的方法:
#cat /sys/fs/cgroup/memory/memory.usage_in_bytes
查看当前cgroup使用memory情况:
cat /sys/fs/cgroup/memory/memory.stat |grep total_inactive_file
3.软驱逐和硬驱逐
如果一个节点有10Gi内存,我们希望在内存不足1Gi时候进行驱逐,可以用下面两种方式进行定位驱逐阈值:
memory.available<10%
memory.available<1Gi
1.软驱逐(Soft Eviction):配合驱逐宽限期(eviction-soft-grace-period和eviction-max-pod-grace-period)一起使用。系统资源达到软驱逐阈值并在超过宽限期之后才会执行驱逐动作。
--eviction-soft:描述驱逐阈值,例如:memory.available<1.5G
--eviction-soft-grace-period:驱逐宽限期,memory.available=1m30s
--eviction-max-pod-grace-period:终止pod最大宽限时间,单位s
2.硬驱逐(Hard Eviction ):系统资源达到硬驱逐阈值时立即执行驱逐动作。
这些驱逐阈值可以使用百分比,也可以使用绝对值,如:
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"`
--system-reserved=memory=1.5Gi
4.回收Node级别资源
- 驱逐Node级别资源
- 配置了 imagefs 阈值时
- 达到 nodefs 阈值:删除已停止的 Pod
- 达到 imagefs 阈值:删除未使用的镜像
- 未配置 imagefs 阈值时
- 达到 nodefs阈值时,按照删除已停止的 Pod 和删除未使用镜像的顺序清理资源
- 配置了 imagefs 阈值时
- 驱逐用户 Pod
- 驱逐顺序为:BestEffort、Burstable、Guaranteed
- 配置了 imagefs 阈值时
- 达到 nodefs 阈值,基于 nodefs 用量驱逐(local volume + logs)
- 达到 imagefs 阈值,基于 imagefs 用量驱逐(容器可写层)
- 未配置 imagefs 阈值时
- 达到 nodefs阈值时,按照总磁盘使用驱逐(local volume + logs + 容器可写层)
除了驱逐之外,Kubelet 还支持一系列的容器和镜像垃圾回收选项,它们未来将会被驱逐替代:
| 垃圾回收参数 | 驱逐参数 | 解释 |
|---|---|---|
--image-gc-high-threshold |
--eviction-hard 或 --eviction-soft |
现存的驱逐回收信号可以触发镜像垃圾回收 |
--image-gc-low-threshold |
--eviction-minimum-reclaim |
驱逐回收实现相同行为 |
--minimum-image-ttl-duration |
由于驱逐不包括TTL配置,所以它还会继续支持 | |
--maximum-dead-containers |
一旦旧日志存储在容器上下文之外,就会被弃用 | |
--maximum-dead-containers-per-container |
一旦旧日志存储在容器上下文之外,就会被弃用 | |
--minimum-container-ttl-duration |
一旦旧日志存储在容器上下文之外,就会被弃用 | |
--low-diskspace-threshold-mb |
--eviction-hard or eviction-soft |
驱逐回收将磁盘阈值泛化到其他资源 |
--outofdisk-transition-frequency |
--eviction-pressure-transition-period |
驱逐回收将磁盘压力转换到其他资源 |
5.节点资源紧缺情况下系统行为
1.Scheduler行为
Master上的scheduler不再向该节点调度pod,节点状况与调度行为的对应关系如下:
MemoryPressure:不再调度新的BestEffort pod到这个节点 DiskPressure:不再向这一节点调度pod
2.Node的OOM行为
kubelet根据pod的Qos为每个容器设置一个oom_score_adj,如果kubelet无法在系统OOM之前回收足够的内存。则oom_killer会根据内存使用比例来计算oom_score,最后结果和oom_score_adj相加,得分最高的pod将会首先被驱逐。
kubernetes-pod驱逐机制的更多相关文章
- 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驱逐策略。
目录 容器的资源需求和资源限制 QoS Classes分类 Guaranteed Burstable Best-Effort kubernetes之node资源紧缺时pod驱逐机制 Qos Class ...
- k8s QoS与pod驱逐
概述 QoS是Quality of Service的缩写,即服务质量.每个pod属于某一个QoS分类,而Kubernetes会根据pod的QoS级别来决定pod的调度.抢占调度和驱逐优先级,而且pod ...
- Kubernetes Pod故障归类与排查方法
Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...
- 基于Kubernetes服务发现机制的探讨Non Service
服务注册 注册中⼼作为一般的RPC/Web服务中的底层设施提供了服务进程元数据(IP, Port, Interface, Group,Method等)存储,被Watch的功能,每个服务进程均需接⼊同⼀ ...
- 解决Kubernetes Pod故障的5个简单技巧
在很多情况下,你可能会发现Kubernetes中的应用程序没有正确地部署,或者没有正常地工作.今天这篇文章就提供了如何去快速解决这类故障以及一些技巧. 在阅读了这篇文章之后,你还将深入了解Kubern ...
- Kubernetes Pod 镜像拉取策略
Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...
- Kubernetes Pod 资源限制
Kubernetes Pod 资源限制 官方文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources- ...
随机推荐
- Java实现 黑洞数
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456.求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则 ...
- PAT 月饼
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样 ...
- Redis企业级数据备份与恢复方案
一.持久化配置 RBD和AOF建议同时打开(Redis4.0之后支持) RDB做冷备,AOF做数据恢复(数据更可靠) RDB采取默认配置即可,AOF推荐采取everysec每秒策略 AOF和RDB还不 ...
- MongoDB 4.X CRUD基本操作
本文总结了MongoDB 4.X在mongo shell客户端涉及的对文档一些基本的增删改查操作,即CRUD操作.主要结合了自己平时使用MongoDB的操作命令,更详细的命令可以参考官方文档: htt ...
- opencl(3)程序、内核
1:程序 1)从上下文中创建程序 cl_program clCreateProgramWithSource( cl_context context, //上下文 cl_uint count, //文本 ...
- 06.Django-用户认证
用户认证 Django 内置一个 auth 模块,帮助用户实现注册.登录.注销以及修改密码等功能,帮助开发者省去了很多功夫 用于认证的数据表 auth_user User是auth模块中维护用户信息的 ...
- 自动网络搜索(NAS)在语义分割上的应用(一)
[摘要]本文简单介绍了NAS的发展现况和在语义分割中的应用,并且详细解读了两篇流行的work:DARTS和Auto-DeepLab. 自动网络搜索 多数神经网络结构都是基于一些成熟的backbone, ...
- 通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
目录 一.背景 二.JAVA对象拷贝的实现 2.1 浅拷贝 2.2 深拷贝的实现方法一 2.3 深拷贝的实现方法二 2.3.1 C++拷贝构造函数 2.3.2 C++源码 2.3.3 JAVA通过拷贝 ...
- 利用Python将多个PDF文件合并
from PyPDF2 import PdfFileMerger import os files = os.listdir()#列出目录中的所有文件 merger = PdfFileMerger() ...
- 编译e2fsprogs-1.40.2
1.解压源码 tar zxvf e2fsprogs-1.40.2.tar.gz 2.配置 ./configure --enable-elf-shlibs --host=arm-linux --with ...