问题描述
我花了整整一天的时间试图理解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房屋控制循环休眠10秒)。
我发现this script曾经在Kubernetes文档中,并且应该以与Kubelet相同的方式计算可用内存。我与上面的free -m
并行运行,并得到以下结果:
memory.available_in_mb 1833
差不多差了10亿!
现在,我知道计算是设计使然的,但是这给我带来了一个显而易见的问题:如何可靠地管理系统资源使用情况,从而不会调用系统OOM杀手?我可以设置什么驱逐策略,以便当可用内存不足1 GB时,kubelet将开始驱逐Pod?
解决方法
根据文档https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/,您应该添加Kubelet标志--system-reserved=memory=1024Mi