Kubernetes 中的 Pod resources.limits 和 resources.requests 有什么区别?

What's the difference between Pod resources.limits and resources.requests in Kubernetes?

我一直在阅读 kubernetes 文档 https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#resource-requests-and-limits-of-pod-and-container

但是我还是不清楚spec.containers[].resources.limits.cpuspec.containers[].resources.requests.cpu有什么区别,对资源限制有什么影响

你能推荐一些用普通英语解释的读物或书籍吗?

提前致谢

当 Kubernetes pod 被安排在特定节点上时,要求 pod 有足够的资源来 运行。 Kubernetes 知道它的节点的资源,但是 kubernetes 如何知道 pod 预先需要多少资源才能在节点中有效地调度它。为此,将使用 requests。当我们指定 request 资源时,kubernetes 将保证 pod 将获得该数量的资源。

另一方面,limit 限制了 pod 的资源使用。 Kubernetes 将不允许 pod 占用比 limit 更多的资源。当涉及到 CPU 时,如果您请求更多 kubernetes 将人为地限制 pods CPU。如果 pod 超过 limit 个 pod,它将被终止。为了简单起见,简单来说 limit 总是大于 request.

这个例子会让您了解 requestlimit。假设有一个 pod,您已将其内存请求指定为 7GB,将内存限制指定为 10GB。集群中有三个节点,其中 node1 有 2GB 内存,node2 有 8GB 内存,node3 有 16GB。您的 pod 永远不会被安排在 node1 上。但它会根据 pod 当前内存使用情况在 node2 或 node3 上安排。但是如果调度到node3上,任何场景都会终止,超过10GB的内存使用。

简而言之: 对于 cpu 和内存请求:k8s 保证你在调度程序安排你的 pods.

时声明的内容

对于cpu和内存限制:k8s保证你不能超过你设置的值。

当您的 pod 超出限制时的结果:

  • 对于 cpu:k8s 正在限制您的容器
  • 为了记忆:OOM,k8s 杀了你 豆荚

内存有点难以理解。 requests是保证,limits是不能超过的。这也意味着,例如,当您发出 kubectl describe nodes | tail -10 时,您会看到类似这样的短语:

"Total limits may be over 100 percent, i.e., overcommitted".

意思是requests.memory的总和<=100%(否则pods无法排到guaranteed[=的意思70=]记忆)。同时,如果你看到 100% 的值,这意味着 limits.memory 的总和可以超过 100%(这是消息中过度使用的部分)。所以当一个节点尝试调度一个 pod 时,它只会检查 requests.memory 看它是否有足够的内存。

cpu 部分比较复杂。

requests.cpu 转换为 cpu 份额,如果不查看节点上的所有 pods,老实说这可能毫无意义。恕我直言,理解这个 属性 的最简单方法是看一个例子。

  • 假设您在一个节点上有 100 个核心可用,您部署一个 pod 并设置 requests.cpu = 1000m。在这种情况下,您的 pod 可以使用 100 cpus,bot min 和 max.

  • 您有同一台机器(100 个核心),但您部署了两个 pods 和 requests.cpu = 1000m。在这种情况下,您的 pods 每个最少可以使用 50 个内核,最多可以使用 100 个内核。

  • 同节点,4pods(requests.cpu = 1000m)。每个 pod 最多可以使用 25 cpu,最多 100

你得到了图片,重要的是 所有 pods 为 requests.cpu 设置了什么以获得整体图片。

limits.cpu 更有趣,它转换为 cgroup 上的 两个 属性:cpu periodcpu quota。就是在一定的时间段(期间)内,你能得到多少时间(配额)。一个例子也应该让事情变得更简单。

  • 假设 period=100msquota=20ms 并且您收到一个请求,该请求将在您的 pod 上 50ms 完成。

这是它的样子:

|     100ms   ||     100ms   ||     100ms   |
| 20 ms ......|| 20 ms ......|| 10 ms ......|

因为处理一个请求需要 50ms,而每个 100ms 我们只有 20ms 可用,所以总共需要 300ms 来处理我们的请求要求。


也就是说,有很多人建议根本不要设置 cpu。 google 工程师、zalando、monzo 等——包括我们。我们不这样做,并且有充分的理由(超出这个问题)。