限制microk8s的最大内存使用



我们使用一个自托管的microk8s集群(目前是单节点)作为内部暂存工作负载。有时,服务器变得无响应,我甚至不能ssh到它。唯一的出路就是重新开始。

我可以看到,在服务器崩溃之前,它的内存使用达到极限,CPU负载飙升到1000以上。因此,资源耗尽可能是罪魁祸首。

这给我带来了一个问题-我如何为microk8s设置全局限制,以不消耗所有?


我知道有资源限制可以分配给Kubernetes pod,和ResourceQuotas来限制聚合命名空间资源。但这也有资源利用率低的缺点(如果我理解正确的话)。为简单起见,我们输入:

  • 每个pod是相同的
  • 它的实际内存需求可以从50 MiB500 MiB
  • 每个pod运行在自己的命名空间
  • 有30个pod
  • 服务器有8gb内存
  1. 我将request: 50 Milimit: 500 Mi分配给pod。只要节点至少有50 * 30 Mi = 1500 Mi的内存,它就应该运行所有请求的pod。但是没有什么可以阻止所有pod使用每个450 Mi的内存,这是在单独的限制之下,但总的来说仍然是450 Mi * 30 = 13500 Mi,这超过了服务器可以处理的范围。我怀疑这就是导致服务器崩溃的原因。

  2. 我将request: 500 Milimit: 500 Mi分配给pod,以确保总内存使用量永远不会超过我的预期。这当然允许我只安排16个吊舱。但是当pod在没有实际负载的情况下运行并且只使用50 Mi的内存时,就会出现严重的RAM利用率不足。

  3. 我正在寻找第三种选择。它可以让我自由地安排pod,只有当总内存使用超过一定限制时,才会开始驱逐/杀死它们。这个限制需要是可配置的,并且要低于服务器的总内存,这样它才不会死。


我们正在使用microk8s,但我预计这是所有自托管节点面临的问题,以及AWS/Google/Azure也必须处理的问题。

感谢

由于microk8在主机上运行,因此主机的所有资源都分配给它。这就是为什么如果您希望将集群资源保留在边界中,您必须使用以下方法之一来管理它们:

  1. 为命名空间中的pod设置LimitRange策略。

ALimitRange提供以下约束:

  • 在命名空间中强制每个Pod或Container使用最小和最大的计算资源。
  • 在命名空间中强制每个persistentvolumecclaim最小和最大存储请求。
  • 在命名空间中强制一个资源的请求和限制之间的比率。
  • 为命名空间中的计算资源设置默认请求/限制,并在运行时自动将其注入容器。
  1. 每个命名空间使用资源配额

资源配额,由ResourceQuota对象定义限制每个名称空间的总资源消耗的约束。它可以限制可以创建的对象的数量名称空间按类型,以及计算资源的总量

  1. 为每个pod分配必要的请求和限制。

当您为Pod中的容器指定资源请求时调度器使用此信息来决定放置Pod的节点上。当您为容器指定资源限制时,kubelet将使用强制执行这些限制,使正在运行的容器不允许使用比你设定的限制更多的资源。kubelet也是至少保留该系统资源的请求数量

最新更新