限制 microk8s 最大内存使用

Limiting microk8s maximum memory usage

我们正在使用自托管的 microk8s 集群(目前是单节点)来处理我们的内部暂存工作负载。有时,服务器变得没有响应,我什至无法进入它。唯一的出路就是重启。

我可以看到在服务器崩溃之前,它的内存使用量达到了极限并且 CPU 负载猛增到 1000 多个。所以 运行 耗尽资源很可能是罪魁祸首。

这让我想到了这个问题 - 我如何设置 microk8s 的全局限制不消耗 一切


我知道可以分配给 Kubernetes pods 的资源限制,以及用于限制聚合命名空间资源的 ResourceQuotas。但这有资源利用率低的缺点(如果我理解正确的话)。为简单起见,假设:

  1. 我将 request: 50 Milimit: 500 Mi 分配给 pod。只要节点至少有 50 * 30 Mi = 1500 Mi 内存,它就应该 运行 所有请求的 pods。但是没有什么可以阻止所有 pods 使用 450 Mi 的内存,这在个人限制之下,但仍然是 450 Mi * 30 = 13500 Mi,这超出了服务器可以处理的范围。我怀疑这就是导致我的服务器崩溃的原因。

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

  3. 我正在寻找第三种选择。让我可以自由安排 pods 并且 在总内存使用量超过某个限制时启动 evicting/killing 它们。并且该限制需要是可配置的并且低于服务器的总内存,这样它就不会死掉。


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

谢谢

既然microk8s在宿主机上运行,那么宿主机的所有资源都分配给它了。这就是为什么如果你想将你的集群资源保持在边界内,你必须通过以下方式之一来管理它们:

  1. 在命名空间中为 pods 设置 LimitRange 策略。

A LimitRange provides constraints that can:

  • Enforce minimum and maximum compute resources usage per Pod or Container in a namespace.
  • Enforce minimum and maximum storage request per PersistentVolumeClaim in a namespace.
  • Enforce a ratio between request and limit for a resource in a namespace.
  • Set default request/limit for compute resources in a namespace and automatically inject them to Containers at runtime.
  1. 每个命名空间使用 Resource Quotas

A resource quota, defined by a ResourceQuota object, provides constraints that limit aggregate resource consumption per namespace. It can limit the quantity of objects that can be created in a namespace by type, as well as the total amount of compute resources that may be consumed by resources in that namespace.

  1. 为每个 pod 分配必要的 requests and limits

When you specify the resource request for Containers in a Pod, the scheduler uses this information to decide which node to place the Pod on. When you specify a resource limit for a Container, the kubelet enforces those limits so that the running container is not allowed to use more of that resource than the limit you set. The kubelet also reserves at least the request amount of that system resource specifically for that container to use.