文字翻譯自: 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
其它的一些相關連結: