开放问答
K8s Guaranteed QoS 买"稳"到底值多少钱:怎么按 SLI 给无状态服务分级定 requests/limit 的 gap
该问题的正文、回答与评论。
提问者 苏星河-383 · 状态 open
KubernetesQoS资源预算成本优化CFS节流
背景
我负责一个 12 节点(16C64G,Kubernetes 1.28.9,containerd 1.7.13,cgroup v2,内核 5.15)的生产集群,上面跑着 30+ 个 Java 17 / Spring Boot 3 与 Go 写的无状态服务。当前资源策略是"一刀切":所有无状态 Pod 都设 requests = limits(Guaranteed QoS),目的是保命——过去一年节点内存吃紧时,确实有几个 requests 设得规整的 Guaranteed Pod 没排到驱逐队首而活了下来。
现象 / 卡点 但 FinOps 给的账不好看:节点 CPU 的 request 装箱率只有约 55%,也就是一半"配额"平时闲置;按成本折算,这套 Guaranteed 策略比"requests < limits 的 Burstable 策略"大约贵 30%。我的纠结是:为这份"稳"多花 30% 的钱,到底值不值?
已尝试的排查
- 我试过把非核心服务的 limit 放宽到 1.5× request,想靠 Burstable 省成本,结果高峰期 CFS 节流把 P99 抬了 3 倍(现象与站内几篇 CPU limit 节流复盘一致),被迫回滚;
- 我想按 SLI 给服务分级(核心 / 次核心 / 可丢弃),每档给不同的 requests/limit gap,但卡在我不知道用什么指标做分级判据,也不知道每档 gap 给多少才既省钱又不踩驱逐 / 节流红线。
期望得到的答案形态 希望给一个可落地、带数字的分级方案:(a) 三档(或两档)判据——用什么 SLI(P99 延迟、驱逐率、nr_throttled/throttled_time 比例)做红线,阈值大概多少;(b) 每档 requests/limit 的 gap 建议范围(如核心档 gap=0,次核心档 gap=20~40%,可丢弃档不设 limit);(c) 走 Burstable 时如何配合节点级驱逐排序(memory/cpu 的 allocatable 预留、QoS 权重)兜底,避免"省成本省成驱逐"。最好给一个我能直接套到 30+ 服务上、算得出成本收益的公式或对照表。
已采纳
回答者
回答正文
评论
补充一个我们集群实操过的量化判据:Burstable 档的 limit 红线不是拍脑袋的 1.5×,而是用
nr_throttled / nr_periods > 1%且throttled_time / period连续 5 分钟超标,作为"该服务需要回退到 Guaranteed"的自动触发条件。我们当时 30 个服务里只有 6 个(核心支付链路)需要 gap=0,其余 24 个跑 limit=2×request 的 Burstable,CPU 装箱率从 55% 提到 78%,没有触发过一次驱逐——前提是节点上 memory 的 allocatable 预留留了 256Mi(kubelet 默认 eviction 阈值),别把驱逐线调太紧。