首页 > 解决方案 > 如何处理可突发的 k8s pod 的 CPU 争用?

问题描述

当您在同一个节点上安排了各种可爆破的 Pod 时,我试图解决这个用例。当节点的内核在调度 CPU 并且 CPU 已经完全负担时,如何确保特定 pod 中的工作负载优先于另一个 pod?在典型的 Linux 主机中,我对进程之间争用的想法立即转向进程的“好”,但是我没有看到任何等效的 k8s 机制允许在节点上的 pod 内的进程之间指定 CPU 调度优先级。

我已经阅读了k8s 提供的最新功能(如果我正确解释了文档)只是提供了一种 CPU 固定到 pod 的机制,这并没有真正让我抓狂。如果更高优先级的 Pod 没有活动的工作负载,我仍然希望最大化“二等” Pod 的 CPU 利用率,同时在需要时允许更高优先级的工作负载具有 CPU 调度优先级。

到目前为止,还没有找到令人满意的答案,我认为社区会选择一种架构解决方案,比如自动缩放或在节点之间分离工作负载。我不认为这些是真正解决问题,但实际上只是投入更多的 CPU,这是我想避免的。为什么在 CPU 空闲时启动更多节点?

标签: kubernetes

解决方案


让我先解释一下k8s中CPU分配和利用率是如何发生的(内存有点不同)

您定义 CPU 要求如下。我们将 CPU 定义为千份。

resources:
  requests:
    cpu: 50m
  limits:
    cpu: 100m

在上面的示例中,我们要求最少 5% 和最多 10% 的 CPU 份额。

Kubernetes 使用请求来调度 pod。如果一个节点的可用 CPU 仅超过 5%,则该 pod 会被调度在该节点上。

限制被传递给 docker(或任何其他运行时),然后在 cgroups 中配置 cpu.shares。

因此,如果您请求 5% 的 CPU 并且仅使用 1%,那么剩余的不会锁定到此 pod,其他 pod 可以使用此空闲 CPU 以确保所有 pod 获得所需的 CPU,从而确保节点的高 CPU 利用率。

如果您限制为 10%,然后尝试使用更多,那么 Linux 将限制 CPU 使用,但不会杀死 pod。

因此,针对您的问题,您可以为可爆破的 pod 设置更高的限制,除非所有 pod cpu 同时爆裂,否则您没问题。如果它们同时爆发,它们将获得相同的 CPU 作为可用性。

您可以使用 pod affinity-and-anti-affinity将所有可突发的 pod 安排在不同的节点上。


推荐阅读