文本翻译自: https://itnext.io/cpu-limits-and-requests-in-kubernetes-fa9d5…
在 Kubernetes 中,我应该如何设置 CPU 的 requests 和 limits?
热门答案包含:
- 始终应用 limits !
- 永远不要应用 limits,只应用 requests !
- 都不必;能够吗?
让咱们深入研究它。
在 Kubernetes 中,您有两种办法来指定一个 pod 能够应用多少 CPU:
- Requests 通常用于确定均匀耗费。
- Limits 设置容许的最大资源数。
Kubernetes 调度器应用 requests 来确定 pod 应该调配到集群中的哪个节点。
因为调度器并不知道理论耗费(pod 尚未启动),它须要一个提醒。
但它并没有就此结束。
CPU requests 还用于将同一个节点上的 CPU 资源如何调配给不同的容器。
让咱们看一个例子:
- 一个节点只有一个 CPU。
- 容器 A requests 0.1 个 vCPU。
- 容器 B requests 0.2 个 vCPU。
当两个容器都尝试应用 100% 的可用 CPU 时会产生什么?
因为 CPU 申请不限度耗费,因而两个容器都将应用所有可用的 CPU。
然而,因为容器 B 的申请与另一个相比减少了一倍,因而最终的 CPU 调配是: 容器 1 应用 0.3vCPU,另一个应用 0.6vCPU(双倍数量)。
Requests 实用于:
- 设置基准(给我至多 X 数量的 CPU)。
- 设置 pod 之间的关系(这个 pod A 应用的 CPU 是另一个的两倍)。
但不影响硬性限度。
为此,您须要 CPU limits。
设置 CPU limits 时,您定义了 period 周期和 quota 配额。
例如:
- 周期:100000 微秒 (0.1s)。
- 配额:10000 微秒 (0.01s)。
我只能每 0.1 秒应用 CPU 0.01 秒。
这也缩写为“100m”。
如果你的容器有硬限度并且想要更多的 CPU,它必须期待下一个周期。
您的过程受到限制。
那么您应该在 Pod 中如何设置 CPU requests 和 limits?
一种简略(但不精确)的办法是将最小的 CPU 单元计算为:
REQUEST = NODE_CORES * 1000 / MAX_NUM_PODS_PER_NODE
对于 1 个 vCPU 节点和 10 个 Pod,最小单元就是 1 * 1000 / 10 = 100Mi
。
将最小单位或其乘数调配给您的容器。
例如,如果您不晓得 Pod A 须要多少 CPU,但您确定它是 Pod B 的两倍,您能够设置:
- Request A:1 个单元
- Request B:2 个单位
如果容器应用 100% CPU,它们将依据它们的权重 (1:2) 重新分配 CPU。
更好的办法是监控应用程序并得出均匀 CPU 利用率。
您能够应用现有的监控基础设施来实现此操作,或者应用 Vertical Pod Autoscaler 来监督并报告均匀申请值。
你应该如何设置 limits?
- 您的利用可能曾经有“硬性”限度。(例如单线程的利用即便调配了 2 个核,也最多只应用 1 个核)。
- 你能够设置:limit = 99th 分位数 + 30–50%。
您应该剖析应用程序(或应用 VPA)以取得更具体的答案。
您应该始终设置 CPU requests 吗?
相对没错。
这是 Kubernetes 中的规范良好实际,可帮忙调度器更无效地调配 pod。
您应该始终设置 CPU limits 吗?
这有点争议,但总的来说,我是这么认为的。
你能够进行更深刻的理解:https://dnastacio.medium.com/why-you-should-keep-using-cpu-limits-on-kubernetes-60c4e50dfc61
其它的一些相干链接:
- https://learnk8s.io/setting-cpu-memory-limits-requests
- https://medium.com/@betz.mark/understanding-resource-limits-i…
- https://nodramadevops.com/2019/10/docker-cpu-resource-limits