【APIServer】APIServer问题排查技巧总结

Posted by Hao Liang's Blog on Saturday, May 14, 2022

1、相关背景

2、原因分类

高负载导致访问慢

apiserver高负载

  • 内存:一般是因为List请求和资源较多,序列化开销也比较大

  • CPU:qps或List请求较高时,序列化反序列化开销较大

  • 流量:大量List请求导致大流量(可通过监控和审计确认来源)

etcd高负载

  • 流量:一般是由于客户端发起大量List请求,并且没走apiserver缓存(即没指定ResourceVersion)

  • 内存:一般是由于流量较大

  • CPU:流量比较大/watcher比较多等

  • IO延时:CBS异常抖动,母机负载高等

  • 慢查询:客户端有全量资源的List操作/写请求比较多

客户端高载高

  • 客户端CPU/内存/带宽高负载,请求发起和接收回包较慢

引发限速

apiserver限速

  • inflight限速(通过监控指标 apiserver_current_inflight_requests 确认):apiserver默认限速写200( –max-mutating-requests-inflight),读400( –max-requests-inflight).

  • 1.20+ APF限速(通过监控指标确认): 1.20默认开启APF限速,默认会通过namespace,user等进行限速,kube-system下的user和系统组件(kcm,scheduler等)默认限速阈值较高,普通serviceaccount限速阈值较低,在apiserver响应慢时有概率触发,现象可能会比较诡异(比如部分组件或者serviceaccount token请求较慢或不响应)。

loopback client限速,低版本(1.12及以下)apiserver会通过loopback client请求自身(qps 50),使用serviceaccount认证访问kube-apiserver时,如果并发过高,则可能导致限速(此时apiserver日志中常见大量Create tokenreviews 30s的慢查询)

客户端限速 client-go默认qps 5, kcm默认20,scheduler默认50: 如果触发限速,则日志级别4以上(高版本client-go日志级别3以上)可以看到客户端日志中有打印Throttling request took相关日志

外部组件异常

3、排查方法

4、常见误区