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相关日志