无需登录 数据私有 本地保存

K8s 资源限制计算器 - 推荐 requests/limits

48
0
0
0

Q: requests 和 limits 的区别是什么?

A: Requests 是容器运行时的最低资源保障值,调度器根据 requests 决定 Pod 应该调度到哪个节点,并保证该 Pod 至少能获得 requests 数量的资源。Limits 是资源使用上限,当容器实际使用超过 limits 时,CPU 会被节流(throttling),内存超过 limits 则触发 OOMKilled。简而言之,requests 保底,limits 封顶。合理设置两者是 Kubernetes 资源管理的基础。

Q: 为什么要推荐不同的 requests 和 limits 而不是设为相同值?

A: 将 requests 和 limits 设为相同值(Guaranteed QoS)虽然能提供最高级别的资源保障,但会导致资源利用效率降低。在大多数场景下,应用的资源使用量是波动的——高峰时需要更多资源,低谷时资源闲置。通过设置 requests 小于 limits(Burstable QoS),应用可以在资源充裕时使用更多资源提高性能,同时在资源紧张时被限制在 requests 水平,既保障了基本服务,又提高了集群整体资源利用率。

Q: 如何避免 OOMKilled?

A: 避免 OOMKilled 需要从多个方面入手。首先,通过监控工具准确测量应用在不同负载下的内存使用量,获取稳态内存和峰值内存数据。其次,memory limits 应设置为峰值内存的 1.2-1.5 倍,留有一定余量。对于内存使用量不可预测的应用(如有大量缓存的应用),可以考虑不设置 memory limits(仅设置 requests),让 Kubernetes 在资源压力下驱逐 Pod 而非直接终止。此外,还应排查并修复可能的内存泄漏问题。

Q: CPU throttling 是什么?如何减少?

A: CPU throttling 是 Linux CFS 调度器在容器 CPU 使用量超过 limits 时采取的限制措施。当容器在某个调度周期(默认 100ms)内使用的 CPU 时间超过其配额时,内核会暂停该容器的 CPU 执行,导致响应延迟增加。减少 CPU throttling 的方法包括:适当提高 CPU limits(但会降低集群整体利用率);启用 CPU 突发机制(允许累积未使用的 CPU 配额);调整 CFS 调度周期参数;或者根据监控数据优化应用代码减少不必要的 CPU 消耗。

Q: Guaranteed、Burstable、BestEffort 三种 QoS 等级有什么区别?

A: Guaranteed QoS 要求所有容器的 CPU 和内存 requests 均等于 limits,提供最高级别的资源保障,在资源压力下最后被驱逐。Burstable QoS 允许 requests 小于 limits,在 Guaranteed 和 BestEffort 之间被驱逐。BestEffort QoS 不设置任何 requests 和 limits,最先被驱逐。生产环境中的核心服务建议配置为 Guaranteed 或 Burstable,非核心服务和批处理任务可以使用 BestEffort 以降低资源成本。

Q: 如何根据监控数据优化资源配置?

A: 优化资源配置需要持续监控和迭代。首先使用 Prometheus 收集应用的 CPU 和内存使用数据,分析 P50/P95/P99 分位数。然后对比当前配置的 requests/limits 与实际使用量:如果 requests 远大于实际使用,说明资源浪费,可以适当降低 requests;如果 limits 频繁被触发(通过 container_cpu_cfs_throttled_periods_total 指标),说明 limits 设置过低。优化的目标是让 requests 接近 P50 使用量,limits 接近 P99 使用量,在利用率和服务稳定性之间找到平衡。

Q: Java/JVM 应用在 Kubernetes 中有哪些特别注意事项?

A: Java 应用在 Kubernetes 中需要特别注意 JVM 内存管理与容器 cgroup 限制的交互。JVM 会根据系统可用内存自动调整堆大小,但在容器中 JVM 可能无法正确识别 cgroup 的内存限制,导致堆大小超出 limits 触发 OOMKilled。解决方案包括:使用 -XX:MaxRAMPercentage 显式设置最大堆比例(建议 50%-70%);确保 JVM 版本支持容器感知(JDK 8u131+ 或 JDK 10+);设置 -XX:+UseContainerSupport 启用容器支持;预留非堆内存空间(Metaspace、线程栈、直接内存等)约占总内存的 20%-30%。

Q: 资源单位中的 m/Mi/Gi 是什么意思?

A: 在 Kubernetes 资源配置中,m 表示 CPU 毫核(millicore),1000m 等于 1 个 CPU 核心,500m 等于半核。CPU 也可以用小数表示,如 0.5 等于 500m。内存方面,Mi(Mebibyte)是二进制单位,1 Mi = 1024 Ki = 1048576 字节;Gi(Gibibyte)是更大的二进制单位,1 Gi = 1024 Mi。与之对应的十进制单位 M(Megabyte)和 G(Gigabyte)在 Kubernetes 中较少使用。推荐使用二进制单位(Mi/Gi)以避免歧义,确保配置的准确性。