已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景 我在一个 12 节点(16C64G,Kubernetes 1.28.9,containerd 1.7.13,cgroup v1)的生产集群上跑一套 Java 17 / Spring Boot 3 的无状态订单服务。每个 Pod 里有 3 个容器:
-Xmx4g,CPU request=2 / limit=4,Memory request=6Gi / limit=8Gi)现象 过去两个月,同一 Deployment 触发了 7 次 main 容器 OOMKilled(Exit 137)+ 3 次 P99 飙到 2s(CFS 节流)。但每次炸之前:
kubectl top pod 看到的 Pod 总 USED 只有 limit 的 70%~80%;container_memory_working_set_bytes 确实在涨,但 container_cpu_cfs_throttled_seconds_total 的增量远大于 container_cpu_usage_seconds_total 的增量——说明 CPU 被 CFS 周期切了,不是真的"用完了";node_cpu_seconds_total 并没有打满,但 Pod 级别的 CFS quota 已经触顶。已尝试的排查
container_memory_working_set_bytes 反而涨了 200MB;container_cpu_cfs_throttled_seconds_total / container_cpu_usage_seconds_total,istio-proxy 在高峰时 throttle ratio 高达 40%+,但 main 容器只有 5%~10%——不确定这是否说明"sidecar 的 CFS 配额被吃掉了,挤占了 main 的调度窗口"。期望得到的答案形态
container_* 指标按 container name 拆分后,有没有一条 PromQL 能直接算出"sidecar 占 Pod 总 CPU/Memory 的比例",以及对应的告警阈值建议?Mem_Buffer_Limit 和 K8s memory limit 怎么配合,才能既不让 fluent-bit 被 OOM,也不挤占 main 容器的 page cache?最好能贴一段真实的多容器 YAML(含 3 个容器的 request/limit)+ 一组 PromQL 告警规则作为参考。空对空的"给 sidecar 多点资源"就略过了。