4. API Server 高延迟的指标分析与参数调优

API Server 高延迟的指标分析与参数调优 学习卡片

延迟指标定位:先分清 apiserver 内部耗时与 etcd 后端耗时

API Server 高延迟通常不是单一原因,而是请求在“准入 → 鉴权 → 缓存 → etcd → 序列化”链路上某一段被拖慢。排查时先看 apiserver_request_duration_seconds 的 P99 分位,再按 verb(GET/LIST/WATCH/POST)和 resource 拆分,判断是读多还是写多;随后用 etcd_request_duration_seconds 对比,若 apiserver 总延迟高但 etcd 延迟正常,瓶颈多在 apiserver 内部(限流、缓存、序列化);若两者同步升高,则重点转向 etcd 磁盘与网络。

审计日志可提供请求级证据:关注 requestReceivedTimestamp 与 stageTimestamp 的差值,以及 responseStatus.code 为 429/500 的比例。429 增多说明请求限流触发,500 增多则可能是 etcd 超时或 webhook 失败。

API Server 请求延迟链路与调优切入点 客户端请求 kubectl / controller 请求限流 max-inflight / QPS 鉴权 / 准入 webhook / RBAC Watch Cache cache size / TTL etcd 后端 磁盘 / 网络 / 选举 关键指标对照: apiserver_request_duration_seconds{verb,resource,code} → 总延迟 P99 etcd_request_duration_seconds{operation} → 后端延迟 P99 apiserver_current_inflight_requests → 当前并发 apiserver_response_sizes → 响应体大小 分支 A:etcd 延迟同步升高 → 检查 etcd 磁盘 fsync 延迟 → 检查 leader 切换频率 → 检查网络 RTT 与丢包 分支 B:etcd 正常但 apiserver 高 → 检查 429 限流比例 → 检查 watch cache 命中率 → 检查 webhook 超时 分支 C:仅特定 verb/resource 高 → LIST 大资源分页不足 → WATCH 连接数过多 → 序列化开销大 调优参数与验证目标: --max-requests-inflight / --max-mutating-requests-inflight:控制并发,降低排队延迟 --watch-cache-sizes:按资源调整缓存条目,提升 LIST/WATCH 命中率 --etcd-request-timeout / --etcd-servers-overrides:控制 etcd 交互超时与连接复用 验证:P99 下降 ≥ 30% 429 比例 < 1% etcd 延迟无恶化

审计日志与指标联动:定位高延迟请求的具体来源

仅看聚合指标难以定位到具体请求。建议同时开启审计日志的 RequestResponse 级别(仅针对关键资源),并配合以下 PromQL 查询:

# 按 verb 和 resource 拆分 P99 延迟
histogram_quantile(0.99,
  sum(rate(apiserver_request_duration_seconds_bucket[5m])) by (le, verb, resource)
)

# etcd 后端 P99 延迟
histogram_quantile(0.99,
  sum(rate(etcd_request_duration_seconds_bucket[5m])) by (le, operation)
)

# 429 限流比例
sum(rate(apiserver_request_total{code="429"}[5m]))
/ sum(rate(apiserver_request_total[5m]))

若 verb="LIST" 且 resource="pods" 的 P99 显著高于其他组合,优先检查 --watch-cache-sizes 是否对该资源设置了足够条目;若 verb="POST" 且 resource="leases" 延迟高,则可能是 etcd 写入竞争,需检查 --max-mutating-requests-inflight 是否过小导致排队。

参数调优与验证闭环

以下参数调整需在控制平面节点上修改 kube-apiserver 启动参数,并滚动重启生效。建议每次只调整一组参数,观察 10 分钟后再决定下一步。

参数默认值调优方向适用场景
--max-requests-inflight400根据节点 CPU 核数适当提高读请求排队严重,429 比例高
--max-mutating-requests-inflight200写密集场景可提高至 300POST/PUT 延迟高,etcd 写入竞争
--watch-cache-sizes100(默认)对 pods、endpoints 等高频资源调至 500-1000LIST/WATCH 延迟高,缓存命中率低
--etcd-request-timeout10s网络稳定时可降至 5s 快速失败etcd 偶发慢请求导致 apiserver 线程阻塞
--etcd-servers-overrides无为 watch 请求单独指定 etcd 端点watch 流量与普通请求争抢 etcd 连接
调优后验证:使用 kubectl get --raw /metrics | grep apiserver_request_duration_seconds 对比调整前后的 P99 分位;同时观察 etcd_request_duration_seconds 是否保持稳定。若 P99 下降但 429 比例上升,说明限流阈值仍偏低,需继续微调。
不要同时调整多个参数,否则无法判断哪个参数真正生效。每次调整后至少观察 10 分钟,确保指标稳定后再进行下一步。若调整后延迟未下降,应回滚参数并重新检查 etcd 磁盘和网络。