kubernetes - 如何正确设置 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?
解决方案
根据文档https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/,您应该添加 Kubelet 标志--system-reserved=memory=1024Mi
推荐阅读
- sql - 计算选定行之间的提前期 (SQL)
- javascript - 为 v-for 中的每个项目呈现一个异步的日期
- c - 在 C 中 - 我将如何使用 scanf 将随机数量的整数存储到二维数组中
- linux - GATT 库直接读取特征值,无需遍历服务
- c# - 在 C# 中单击绘制的形状
- android - setOnNavigationItemSelectedListener 似乎对我不起作用
- javascript - 如何通过 fetch 获取元素?
- css - 移动问题中的自动缩放
- javafx - JavaFX如何从Path类调整形状
- python - IPython Widgets - 处理许多按钮和文本框