首页 > 解决方案 > 如何正确设置 Kubernetes pod eviction 限制,以避免系统 OOM 杀手

问题描述

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

继续阅读有关资源预留资源不足处理的文档,我认为设置以下驱逐策略就足够了:

--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 housekeeing 控制循环休眠 10 秒)。

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

memory.available_in_mb 1833

那几乎是1000M的差异!

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

标签: kubernetesmemoryresourceskubelet

解决方案


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


推荐阅读