kubernetes - 如何正确设置 Kubernetes pod 驱逐限制,以避免系统 OOM killer

标签 kubernetes memory resources kubelet

我花了一整天的时间试图理解 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/

相关文章:

kubernetes v1.1 baremetal => 如何将入口连接到外部世界

java - 在 Java 中限制线程的 CPU/内存使用?

.net - 使用 String.Format 避免资源(可本地化字符串)重复

localization - .resw 资源中的超链接文本值

ssl - 证书管理器无法使用 cloudflare 完成 dns01 挑战

docker - Docker Swarm是否使节点之间的数据保持同步?

docker - InitContainer 从 Kubernetes 中的容器镜像中使用 config.template

有人可以回顾一下这个练习吗?我是对的,但想澄清一些事情

objective-c - 如果我依赖 Objective-C 中的垃圾收集,我是否需要 getter 和 setter

Android - 显示来自可绘制资源的图像