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 的比例来排序驱逐。理解这一点对设计稳定的集群很重要。

更多工具