如何正确设置Kubernetes Pod驱逐限制以避免系统OOM杀手

问题描述

我花了整整一天的时间试图理解Kubernetes的资源管理。具体来说,我正在尝试设置逐出阈值和资源预留,以使始终至少有1GiB的可用内存。

继续阅读有关resource reservationsout-of-resource handling的文档,我认为设置以下驱逐策略就足够了:

--eviction-hard=memory.available<1Gi

但是,实际上,这根本不起作用,因为kubelet的计算似乎与内核在需要确定是否需要调用OOM杀手程序时所进行的计算不同。例如。当我用一堆运行人工记忆猪的Pod加载系统时,我从free -m得到以下报告:

Total:      15866
Used:       14628
free:       161
shared:     53
buff/cache: 1077
available:  859

根据内核,有859个MiB内存可用。但是,kubelet不会调用其驱逐策略。实际上,即使在非常缓慢地提高内存使用量的情况下,我也能够在调用kubelet逐出策略之前调用系统OOM杀手(按照其默认配置,使kubelet房屋控制循环休眠10秒)。

我发现this script曾经在Kubernetes文档中,并且应该以与Kubelet相同的方式计算可用内存。我与上面的free -m并行运行,并得到以下结果:

memory.available_in_mb 1833

差不多差了10亿!

现在,我知道计算是设计使然的,但是这给我带来了一个显而易见的问题:如何可靠地管理系统资源使用情况,从而不会调用系统OOM杀手?我可以设置什么驱逐策略,以便当可用内存不足1 GB时,kubelet将开始驱逐Pod?

解决方法

根据文档https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/,您应该添加Kubelet标志--system-reserved=memory=1024Mi

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...