我花了一整天的时间试图理解 Kubernetes 的资源管理。具体来说,我尝试设置逐出阈值和资源预留,以便始终有至少 1GiB 的可用内存。
继续查看有关 resource reservations 的文档和 out-of-resource handling ,我认为设置以下驱逐政策就足够了:
--eviction-hard=memory.available<1Gi
然而,在实践中,这根本不起作用,因为 kubelet 所做的计算似乎与内核需要确定是否需要调用 OOM Killer 时所做的计算不同。例如。当我用一堆运行人工内存占用的 pod 加载系统时,我从 free -m
得到以下报告:
Total: 15866
Used: 14628
free: 161
shared: 53
buff/cache: 1077
available: 859
根据内核,有 859 MiB 可用内存。然而,kubelet 不会调用其驱逐政策。事实上,我已经能够在调用 kubelet 逐出策略之前调用系统 OOM killer ,即使内存使用量增加得非常缓慢(以允许 kubelet 管家控制循环根据其默认配置休眠 10 秒)。
我找到了this script它曾经出现在 Kubernetes 文档中,应该以与 Kubelet 相同的方式计算可用内存。我与上面的 free -m
并行运行它并得到以下结果:
memory.available_in_mb 1833
这几乎有 1000M 的差异!
现在,我知道计算是有意设计的,但这给我留下了一个明显的问题:如何可靠地管理系统资源使用情况,以便系统 OOM killer 不会被调用?我可以设置什么驱逐策略,以便 kubelet 在可用内存少于 1 GB 时开始驱逐 pod?
最佳答案
根据文档https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/ ,您应该添加 Kubelet 标志 --system-reserved=memory=1024Mi
关于kubernetes - 如何正确设置 Kubernetes pod 驱逐限制,以避免系统 OOM killer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64374779/