我一直在阅读 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
对资源限制有什么影响
你能推荐一些用普通英语解释的读物或书籍吗?
提前致谢
当 Kubernetes pod 被安排在一个特定的节点上时,它需要有足够的资源来运行。Kubernetes 知道它的节点的资源,但是 kubernetes 如何知道 pod 需要多少资源才能在节点中有效地调度它。因为那requests
将被使用。当我们指定一个request
资源时,kubernetes 将保证 pod 将获得该数量的资源。
另一方面limit
限制 pod 的资源使用。Kubernetes 不允许 Pod 占用比limit
. 当涉及到 CPU 时,如果您请求更多 kubernetes 会人为地限制 pods CPU。如果 pod 超过一个limit
pod,它将被终止。为了简单起见, simplelimit
总是大于request
.
这个例子会让你了解request
和limit
。假设有一个 pod,您将其内存请求指定为 7GB,将内存限制指定为 10GB。您的集群中有三个节点,其中 node1 有 2GB 内存,node2 有 8GB 内存,node3 有 16GB。您的 pod 永远不会被安排在 node1 上。但是它将根据 pod 当前内存使用情况在 node2 或 node3 上进行调度。但是如果是在node3上调度,在任何情况下都会被终止,超过10GB的内存使用量。
记忆对于理解来说有点微不足道。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 设置requests
为1024
.
如果第一个 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 次 |
最近记录: |