Kubernetes 容量計算器

計算您的工作負載的 Kubernetes 叢集節點需求

如何使用Kubernetes 容量計算器

  1. 1輸入單個 Pod 的 CPU 與記憶體請求值,以及執行的副本數。
  2. 2輸入節點規格(CPU/記憶體)與系統預留開銷。
  3. 3檢視部署前所需節點數與叢集利用率。

估算 Kubernetes 叢集容量

節點數 = ceil(總請求 / (節點容量 × (1 − 系統預留)));利用率 = 總請求 / (節點數 × 節點容量)

Kubernetes 按請求值而非限制值排程,因此必須按請求總和加上系統 Pod 與裝箱損耗的緩衝來規劃。

為每個節點預留 10–20% 給 kube-system 與驅逐閾值,可避免排程器在負載下把節點標記為不可排程。

K8s 容量規劃的基礎是理解 **requests 與 limits 的區別**:`requests` 是排程依據(Kubelet 保證至少這麼多,排程器按 requests 之和決定 Pod 放哪臺節點),`limits` 是硬上限(CPU 超限會被 throttle 限速,記憶體超限會被 OOMKilled)。**只設 limits 不設 requests 是常見錯誤**——排程器會認為該 Pod 不佔資源,導致節點過度擁擠。

**節點容量不是 100% 可用**,要扣掉三部分:① **系統預留(kube-reserved / system-reserved)**——通常 CPU 各預留 0.5–1 核、記憶體各預留 1–2 GB;② **每個節點的系統開銷**——kubelet、容器執行時、日誌、監控 agent,通常 1–2 GB 記憶體;③ **DaemonSet 佔用**(日誌採集、網路外掛 CNI、監控、儲存外掛),通常每節點 0.5–1 核 + 512 MB–1 GB。**經驗值:一臺 8 核 32 GB 的節點,實際可分配給業務 Pod 的約 6 核 26 GB。**另外還要預留至少 10%–15% 的餘量應對突發和節點故障時的重排程。

工作負載requests.cpulimits.cpurequests.memorylimits.memory
Nginx 靜態服務100m500m128Mi256Mi
Node.js API200m1000m256Mi512Mi
Java Spring Boot500m2000m1Gi2Gi(含 JVM 堆外)
Python Django (gunicorn)300m1000m512Mi1Gi
Redis 快取500m2000m1Gi2Gi
PostgreSQL1000m4000m2Gi4Gi
Prometheus500m2000m2Gi4Gi

K8s 資源請求與限制的典型配置

常見問題

排程看請求值還是限制值?

排程使用請求值;限制值僅約束使用,設過低可能觸發 OOM。

為什麼要預留節點容量?

kube-system Pod 與驅逐閾值需要餘量,否則節點會變得不可排程。

如何改善裝箱率?

合理設定請求值、使用拓撲分佈,並避免過小的節點浪費預留開銷。

CPU limit 會導致效能問題嗎?

**會,而且很隱蔽**。CPU limits 通過 CFS 配額(預設 100 ms 週期)實現,超限會被 throttle(限流)到下一個週期。表現為:應用 CPU 使用率看起來不高(比如只用了 30%),但延遲飆升、吞吐下降——**因為限流發生在 100 ms 粒度內的突發,監控工具通常看不到**。這就是為什麼很多團隊**只設 requests 不設 CPU limits**(讓 Pod 能用到空閒 CPU,靠 requests 保證最低資源)。記憶體 limits 則必須設(防止單個 Pod 拖垮整個節點)。**可以用 kube-state-metrics 的 container_cpu_cfs_throttled_seconds_total 監控限流情況。**

QoS 等級有什麼影響?

K8s 根據 requests/limits 設定分三個等級,決定了**節點資源不足時誰先被驅逐**:**Guaranteed**(requests = limits,所有資源都設且相等)最優先保留,適合關鍵業務;**Burstable**(設了 requests 但 limits 更大或不一致)中等;**BestEffort**(什麼都不設)最先被殺。**所以關鍵服務應設為 Guaranteed**。另外記憶體不足時(節點 OOM),K8s 會按 QoS 等級 + 實際記憶體使用超出 requests 的比例來排序驅逐。理解這一點對設計穩定的叢集很重要。

更多工具