【发布时间】:2021-01-30 03:03:01
【问题描述】:
我花了一整天的时间试图理解 Kubernetes 的资源管理。具体来说,我正在尝试设置驱逐阈值和资源预留,以便始终有至少 1GiB 的可用内存。
查看有关 resource reservations 和 out-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.slicecgroup 中运行,所以无论如何都无所谓。我确实尝试过system-reserved。事实上,我确实设法通过简单地增加eviction-hard限制来调用kubelet 的驱逐系统。但是,问题的关键在于,如果我说“当可用内存低于 1GiB 时驱逐 pod”,则 kubelet 不会因为计算上的差异而坚持这一点。那么问题来了:我如何正确设置它,以便 kubelet 在正确的时间调用驱逐逻辑?
标签: kubernetes memory resources kubelet