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

Her*_*cia 6 doc kubernetes

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

但是我仍然不清楚资源限制之间有什么区别spec.containers[].resources.limits.cpu以及spec.containers[].resources.requests.cpu对资源限制有什么影响

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

提前致谢

Han*_*ena 5

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

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

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


Eug*_*ene 5

记忆对于理解来说有点微不足道。requests是有保证的,limits是无法超越的。这也意味着,kubectl describe nodes | tail -10例如,当您发出命令时,您可能会看到如下短语:

"Total limits may be over 100 percent, i.e., overcommitted".
Run Code Online (Sandbox Code Playgroud)

这意味着总和requests.memory<= 100%(否则pod无法调度,这就是保证内存的意义)。同时,如果您看到一个值高于则意味着的100%总和limits.memory可以超过 100%(这是消息中过度使用的部分)。因此,当节点尝试调度 Pod 时,它只会检查requests.memory是否有足够的内存。

cpu部分比较复杂。

requests.cpu转换为 cpu 份额,并且在不查看节点上的所有 pod 的情况下,说实话可能没有任何意义。恕我直言,理解这个属性的最简单方法是看一个例子。

  • 假设一个节点上有 100 个可用核心,您部署一个 pod 并设置requests.cpu = 1000m. 在这种情况下,您的 Pod 可以使用 100 个 cpu,机器人最小和最大数量。

  • 您拥有同一台机器(100 个核心),但使用requests.cpu = 1000m. 在这种情况下,您的 Pod 至少可以使用 50 个核心,最多 100 个核心。

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

您明白了,重要的是所有Pod 的设置如何requests.cpu才能获得整体情况。

更重要的一点是,只有当超过 1 个 Pod 处于活动状态并请求 CPU 时间时,此设置才有意义,因此这几乎起到了套利的作用。一个例子可能会让这一点更容易理解。假设有一个具有 3 个 CPU 的集群,并且我有 3 个 pod 正在运行,每个 pod 设置requests1024.

  • 如果第一个 Pod 处于空闲状态,第二个和第三个将各使用 50% 或 1.5 个核心。请注意,它们的上限为 33%(或 1 个 CPU)。只要有更多可用的东西,并且没有人“要求”它,他们就会使用它。

  • 如果第一个和第二个空闲,则第三个将使用全部 3 个内核。这就是我上面说的100%的意思。

  • 如果第一个 Pod 处于空闲状态,第二个和第三个将各使用 50% 或 1.5 个核心。现在,当第一个 POD 开始工作时,它也会请求 CPU,因此第二个和第三个 POD 将放弃它们正在使用的 1/2,并且每个 PODS 将使用 1 个 CPU

limits.cpu更有趣的是,它转换为cgroup 上的两个cpu period属性:和cpu quota。它的意思是在一定的时间范围(周期)内你能获得多少时间(配额)。一个例子应该会让事情变得更简单。

  • 假设您收到period=100ms一个quota=20ms请求,该请求将在您的 Pod 上完成50ms

它将如下所示:

|     100ms   ||     100ms   ||     100ms   |
| 20 ms ......|| 20 ms ......|| 10 ms ......|
Run Code Online (Sandbox Code Playgroud)

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

想象一下,现在有足够的 CPU 剩余(因为其他 Pod 不使用它),但您已通过 限制了它limits。本质上,有足够的 CPU 在 50ms 内满足请求,但因为limits已设置,所以在 中满足300ms

这就是为什么很多人建议根本不要设置 cpu。谷歌工程师、zalando、monzo 等 - 包括我们。是这方面非常好的资源。


归档时间:

查看次数:

1015 次

最近记录:

6 年,7 月 前