【问题标题】:How can I correctly set Kubernetes pod eviction limits, to avoid system OOM killer如何正确设置 Kubernetes pod eviction 限制,以避免系统 OOM 杀手
【发布时间】:2021-01-30 03:03:01
【问题描述】:

我花了一整天的时间试图理解 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 housekeeing 控制循环休眠 10 秒)。

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

memory.available_in_mb 1833

这几乎是 1000M 的差异!

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

【问题讨论】:

  • 是否使用kube-reserved?github.com/kubernetes/community/blob/master/contributors/…指定了任何资源预留
  • 并非专门针对 kubelet。 kubelet 在system.slice cgroup 中运行,所以无论如何都无所谓。我确实尝试过system-reserved。事实上,我确实设法通过简单地增加eviction-hard 限制来调用kubelet 的驱逐系统。但是,问题的关键在于,如果我说“当可用内存低于 1GiB 时驱逐 pod”,则 kubelet 不会因为计算上的差异而坚持这一点。那么问题来了:我如何正确设置它,以便 kubelet 在正确的时间调用驱逐逻辑?

标签: kubernetes memory resources kubelet


【解决方案1】:

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

【讨论】:

  • 我也使用它。我链接了相同的文档页面。这不会改变计算可用内存的方式,当调用驱逐管理器时,它只会改变调度计算 AFAIK。
猜你喜欢
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
  • 2012-12-07
  • 2022-11-11
  • 1970-01-01
相关资源
最近更新 更多