在 Kubernetes 中應該如何設定 CPU 的 requests 和 limits

rife發表於2023-04-05

文字翻譯自: https://itnext.io/cpu-limits-and-requests-in-kubernetes-fa9d5...


在 Kubernetes 中,我應該如何設定 CPU 的 requests 和 limits?

熱門答案包括:

  • 始終使用 limits !
  • 永遠不要使用 limits,只使用 requests !
  • 都不用;可以嗎?

讓我們深入研究它。

在 Kubernetes 中,您有兩種方法來指定一個 pod 可以使用多少 CPU:

  1. Requests 通常用於確定平均消耗。
  2. Limits 設定允許的最大資源數。

Kubernetes 排程器使用 requests 來確定 pod 應該分配到叢集中的哪個節點。

由於排程器並不知道實際消耗(pod 尚未啟動),它需要一個提示。

但它並沒有就此結束。

Kubernetes 排程器使用 requests 來決定如何將 pod 分配給節點

CPU requests 還用於將同一個節點上的 CPU 資源如何分配給不同的容器。

讓我們看一個例子:

  • 一個節點只有一個 CPU。
  • 容器 A requests 0.1 個 vCPU。
  • 容器 B requests 0.2 個 vCPU。

當兩個容器都嘗試使用 100% 的可用 CPU 時會發生什麼?

兩個容器的 CPU 使用率

由於 CPU 請求不限制消耗,因此兩個容器都將使用所有可用的 CPU。

但是,由於容器 B 的請求與另一個相比增加了一倍,因此最終的 CPU 分配是:容器 1 使用 0.3vCPU,另一個使用 0.6vCPU(雙倍數量)。

兩個容器都使用所有可用的 CPU,但它們保持比例配額

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 限制中的配額和週期

如果你的容器有硬限制並且想要更多的 CPU,它必須等待下一個週期。

您的程式受到限制。

一個被 CPU 限制的程式

那麼您應該在 Pod 中如何設定 CPU requests 和 limits?

一種簡單(但不準確)的方法是將最小的 CPU 單元計算為:

REQUEST = NODE_CORES * 1000 / MAX_NUM_PODS_PER_NODE

對於 1 個 vCPU 節點和 10 個 Pod ,最小單元就是 1 * 1000 / 10 = 100Mi

將最小單位或其乘數分配給您的容器。

將 CPU 請求分配給 Pod 和容器

例如,如果您不知道 Pod A 需要多少 CPU,但您確定它是 Pod B 的兩倍,您可以設定:

  • Request A:1 個單元
  • Request B:2 個單位

如果容器使用 100% CPU,它們將根據它們的權重 (1:2) 重新分配 CPU。

兩個 Pod 競爭 CPU 資源

更好的方法是監控應用程式並得出平均 CPU 利用率。

您可以使用現有的監控基礎設施來完成此操作,或者使用 Vertical Pod Autoscaler 來監視並報告平均請求值。

你應該如何設定 limits?

  1. 您的應用可能已經有“硬性”限制。(例如單執行緒的應用即使分配了 2 個核,也最多隻使用 1 個核)。
  2. 你可以設定:limit = 99th 分位數 + 30–50%。

您應該分析應用程式(或使用 VPA)以獲得更詳細的答案。

CPU 的第 99 百分位數

您應該始終設定 CPU requests 嗎?

絕對沒錯。

這是 Kubernetes 中的標準良好實踐,可幫助排程器更有效地分配 pod。

您應該始終設定 CPU limits 嗎?

這有點爭議,但總的來說,我是這麼認為的。

你可以進行更深入的瞭解:https://dnastacio.medium.com/why-you-should-keep-using-cpu-limits-on-kubernetes-60c4e50dfc61

其它的一些相關連結:

相關文章