kube-apiserver组件监控指标及大盘使用说明_容器服务 Kubernetes 版 ACK(ACK)-阿里云帮助中心
kube-apiserver组件提供了Kubernetes的RESTful API接口,使得外部客户端、集群内的其他组件可以与ACK集群交互。本文介绍kube-apiserver组件的监控指标清单、大盘使用指导以及常见指标异常解析。
指标清单
指标是组件对外透出状态和参数的方式之一。kube-apiserver组件使用的指标清单如下。
指标清单 | 类型 | 解释 |
apiserver_request_duration_seconds_bucket | Histogram | 该指标用于统计API Server客户端对API Server不同请求的访问时延分布。 请求的维度包括:
API ServerHistogram的Bucket阈值为 |
apiserver_request_total | Counter | 对API Server不同请求的计数。请求的维度包括Verb、Group、Version、Resource、Scope、Component、HTTP contentType、HTTP code(响应的HTTP状态码)和Client。 |
apiserver_request_no_resourceversion_list_total | Counter | 对API Server的请求中参数未配置 |
apiserver_current_inflight_requests | Gauge | API Server当前处理的请求数量。请求包括两种:
|
apiserver_dropped_requests_total | Counter | API Server执行限流策略过程中,主动丢弃掉的请求数。HTTP返回值为 |
etcd_request_duration_seconds_bucket | Histogram | 该指标用于统计API Server对etcd请求的访问时延分布。 请求的维度包括操作(Operation)和操作对象的类型(Type)。 Bucket阈值为 |
apiserver_admission_controller_admission_duration_seconds_bucket | Gauge | 准入控制器(Admission Controller)的处理延时。标签包括Admission Controller名称、操作(CREATE、UPDATE、CONNECT等)、API资源、操作类型(validate或admit)和请求是否被拒绝(true或false)。 Bucket阈值为 |
apiserver_admission_webhook_admission_duration_seconds_bucket | Gauge | 准入Webhook(Admission Webhook)的处理延时。标签包括Admission Controller名称、操作(CREATE、UPDATE、CONNECT等)、API资源、操作类型(validate,校验请求的合法性,或admit,在请求合法的情况下,决定是否允许该请求)和请求是否被拒绝(true或false)。 Bucket的阈值为 |
apiserver_admission_webhook_admission_duration_seconds_count | Counter | 准入Webhook(Admission Webhook)的处理请求统计。标签包括Admission Controller名称、操作(CREATE、UPDATE、CONNECT等)、API资源、操作类型(validate或admit)和请求是否被拒绝(true或false)。 |
cpu_utilization_core | Gauge | CPU使用量。单位:核(Core)。 |
memory_utilization_byte | Gauge | 内存使用量。单位:字节(Byte)。 |
up | Gauge | 服务可用性。
|
大盘使用指导
大盘基于组件指标和相关PromQL绘制,包括关键指标、概览、资源分析、QPS和时延、准入控制器和Webhook、客户端分析部分。
大盘功能解析如下,常见的使用顺序为:
- 查看关键指标,以便快速查看集群关键指标。
- 查看概览,以便分析API Server的响应时延、当前处理请求数和是否有限流发生。
- 查看资源分析,以便查看托管侧组件的资源水位。
- 查看QPS和时延,以便通过多维度深入分析QPS、RT。
- 查看注入控制器和Webhook,以便分析准入控制器和Webhook的QPS、RT。
- 查看客户端分析,以便通过客户端多维度分析QPS。
筛选框
在大盘上方,您可以根据筛选框配置观测API Server请求的Verb、资源(Resource)、分位数(Quantile)和面板使用的PromQL的采样时长(Interval)。
说明
调整分位数(Quantile)时,以0.9为例,表示大盘上Histogram类型指标的采样值的数量占该类型指标总体采样值的90%。分位数为0.9(简称为P90)的指标可以去除采样值占比小的长尾样本的影响,分位数为0.99(简称为P99)的指标会包含长尾样本的影响。
以下筛选框可以选择观测的时间段和页面刷新周期。
关键指标
可观测性展示
功能解析
名称 | PromQL | 说明 |
API QPS | sum(irate(apiserver_request_total[$interval])) | API Server的总QPS。 |
读请求成功率 | sum(irate(apiserver_request_total{code=~"20.*",verb=~"GET|LIST"}[$interval]))/sum(irate(apiserver_request_total{verb=~"GET|LIST"}[$interval])) | API Server处理读请求的成功率。 |
写请求成功率 | sum(irate(apiserver_request_total{code=~"20.*",verb!~"GET|LIST|WATCH|CONNECT"}[$interval]))/sum(irate(apiserver_request_total{verb!~"GET|LIST|WATCH|CONNECT"}[$interval])) | API Server处理写请求的成功率。 |
在处理读请求数量 | sum(apiserver_current_inflight_requests{requestKind="readOnly"}) | API Server当前在处理的读请求数量。 |
在处理写请求数量 | sum(apiserver_current_inflight_requests{requestKind="mutating"}) | API Server当前在处理的写请求数量。 |
请求限流速率 | sum(irate(apiserver_dropped_requests_total[$interval])) | Dropped Request Rate。 API Server限流策略过程中,主动丢弃掉的请求数所占总请求数的比例。 |
概览
可观测性展示
功能解析
名称 | PromQL | 说明 |
GET读请求时延 | histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb="GET",resource!="",subresource!~"log|proxy"}[$interval])) by (pod, verb, resource, subresource, scope, le)) | 展示GET请求的响应时间,维度包括API Server Pod、Verb(GET)、Resources、Scope。 |
LIST读请求时延 | histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb="LIST"}[$interval])) by (pod_name, verb, resource, scope, le)) | 展示LIST请求的响应时间,维度包括API Server Pod、Verb(LIST)、Resources、Scope。 |
写请求时延 | histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb!~"GET|WATCH|LIST|CONNECT"}[$interval])) by (cluster, pod_name, verb, resource, scope, le)) | 展示Mutating请求的响应时间,维度包括API Server Pod、Verb(GET、WATCH、LIST、CONNECT)、Resources、Scope。 |
在处理读请求数量 | apiserver_current_inflight_requests{request_kind="readOnly"} | API Server正在处理的读请求数量。 |
在处理写请求数量 | apiserver_current_inflight_requests{request_kind="mutating"} | API Server正在处理的写请求数量。 |
请求限流速率 | sum(irate(apiserver_dropped_requests_total{request_kind="readOnly"}[$interval])) by (name) sum(irate(apiserver_dropped_requests_total{request_kind="mutating"}[$interval])) by (name) | API Server的限流速率 , |
资源分析
可观测性展示
功能解析
名称 | PromQL | 说明 |
内存使用量 | memory_utilization_byte{container="kube-apiserver"} | API Server的内存使用量。单位:字节。 |
CPU使用量 | cpu_utilization_core{container="kube-apiserver"}*1000 | API Server的CPU使用量。单位:毫核。 |
资源对象数量 |
|
说明 由于兼容性问题,1.22版本中apiserver_storage_objects名称和etcd_object_counts名称均存在。 |
QPS和时延
可观测性展示
功能解析
名称 | PromQL | 说明 |
按Verb维度分析QPS | sum(irate(apiserver_request_total{verb=~"$verb"}[$interval]))by(verb) | 按Verb维度,统计单位时间(1s)内的请求QPS。 |
按Verb+Resource维度分析QPS | sum(irate(apiserver_request_total{verb=~"$verb",resource=~"$resource"}[$interval]))by(verb,resource) | 按Verb+Resource维度,统计单位时间(1s)内的请求QPS。 |
按Verb维度分析请求时延 | histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb=~"$verb", verb!~"WATCH|CONNECT",resource!=""}[$interval])) by (le,verb)) | 按Verb维度,分析请求时延。 |
按Verb+Resource维度分析请求时延 | histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb=~"$verb", verb!~"WATCH|CONNECT", resource=~"$resource",resource!=""}[$interval])) by (le,verb,resource)) | 按Verb+Resource维度,分析请求时延。 |
非2xx返回值的读请求QPS | sum(irate(apiserver_request_total{verb=~"GET|LIST",resource=~"$resource",code!~"2.*"}[$interval])) by (verb,resource,code) | 统计非2xx返回值(除成功以外的所有情况,例如4xx、5xx等)的读请求QPS。 |
非2xx返回值的写请求QPS | sum(irate(apiserver_request_total{verb!~"GET|LIST|WATCH",verb=~"$verb",resource=~"$resource",code!~"2.*"}[$interval])) by (verb,resource,code) | 统计非2xx返回值(除成功以外的所有情况,例如4xx、5xx等)的写请求QPS。 |
Apiserver对etcd请求时延 | histogram_quantile($quantile, sum(irate(etcd_request_duration_seconds_bucket[$interval])) by (le,operation,type,instance)) | 统计API Server对etcd的请求时延。 |
准入控制器和Webhook
可观测性展示
功能解析
名称 | PromQL | 说明 |
准入控制器时延[admit] | histogram_quantile($quantile, sum by(operation, name, le, type, rejected) (irate(apiserver_admission_controller_admission_duration_seconds_bucket{type="admit"}[$interval])) ) | 使用到的admit类型的Admission Controller名称、操作、是否拒绝以及相应的执行时间。 指标Bucket的阈值为 |
准入控制器时延[validate] | histogram_quantile($quantile, sum by(operation, name, le, type, rejected) (irate(apiserver_admission_controller_admission_duration_seconds_bucket{type="validate"}[$interval])) ) | 使用到的validate类型的Admission Controller名称、操作、是否拒绝以及相应的执行时间。 指标Bucket的阈值为 |
准入Webhook时延[admit] | histogram_quantile($quantile, sum by(operation, name, le, type, rejected) (irate(apiserver_admission_webhook_admission_duration_seconds_bucket{type="admit"}[$interval])) ) | 使用到的admit类型的Webhook名称、操作、是否拒绝以及相应的执行时间。 指标Bucket的阈值为 |
准入Webhook时延[validating] | histogram_quantile($quantile, sum by(operation, name, le, type, rejected) (irate(apiserver_admission_webhook_admission_duration_seconds_bucket{type="validating"}[$interval])) ) | 使用到的admit类型的Webhook名称、操作、是否拒绝以及相应的执行时间。 指标Bucket的阈值为 |
准入Webhook请求QPS | sum(irate(apiserver_admission_webhook_admission_duration_seconds_count[$interval]))by(name,operation,type,rejected) | 准入Webhook的请求QPS。 |
客户端分析
可观测性展示
功能解析
名称 | PromQL | 说明 |
按Client维度分析QPS | sum(irate(apiserver_request_total{client!=""}[$interval])) by (client) | 按Client维度分析QPS。用于分析访问API Server的客户端以及QPS。 |
按Verb+Resource+Client维度分析QPS | sum(irate(apiserver_request_total{client!="",verb=~"$verb", resource=~"$resource"}[$interval]))by(verb,resource,client) | 按Verb+Resource+Client维度分析QPS。 |
按Verb+Resource+Client维度分析LIST请求QPS(无resourceVersion字段) | sum(irate(apiserver_request_no_resourceversion_list_total[$interval]))by(resource,client) |
|
常见指标异常
如果组件的常见指标异常,请对照下文的情况说明排查是否为预期内情况。
读/写请求成功率
情况说明
正常情况 | 异常情况 | 说明 |
读请求成功率和写请求成功率接近100%。 | 读请求成功率和写请求成功率维持在较低百分比,例如小于90%。 | 存在较多非200返回值请求。 |
推荐解决方案
查看面板,定位非2xx返回值的读请求QPS和非2xx返回值的写请求 QPS中导致非200返回值请求类型和资源。请评估该类请求是否符合预期,并随之采取措施进行优化。
例如,如果有GET/deployment 404,表示存在GET Deployment返回404的请求,会导致读请求成功率降低,请判断是否为预期行为。
GET/LIST读请求时延和写请求时延
情况说明
正常情况 | 异常情况 | 说明 |
GET读请求时延、LIST读请求时延、写请求时延与访问的集群资源数量和集群规模项关联,没有固定的正常与异常的时间分界,只要不影响业务即在接受范围内。 例如,如果访问的某种资源量越大,那么LIST请求时间就会越长。一般情况下,GET读请求时延、写请求时延小于1s,LIST读请求时延小于5s,为正常现象。 |
| 请求的响应时延过长时,需要排除集群资源数量多、Webhook调用慢等因素的影响。 |
推荐解决方案
- 查看面板,定位GET读请求时延、LIST读请求时延、写请求时延中导致非200返回值的请求类型和资源,并才去解决措施。
请求延时指标apiserver_request_duration_seconds_bucket
的最大阈值是60s,超过60s的请求都会统计为60s。而登录Pod的请求POST pod/exec
、读取日志的请求会建立长链接,该类请求时间通常会超过60s。问题定位时可忽略该类请求。 - 参见准入Webhook时延,分析是否由于Webhook执行较慢,导致API Server请求延时长。
在处理读/写请求数量和请求限流速率
情况说明
正常情况 | 异常情况 | 说明 |
通常情况下,在处理读请求数量 、在处理写请求数量小于100, 请求限流速率为0,为正常现象。 |
| 当前在处理请求的队列积压时,需要排除短时请求量涌入导致处理延时、Webhook调用慢等因素的影响。超过队列长度时,API Server会限流,导致请求限流速率大于0,影响集群稳定性。 |
推荐解决方案
- 查看QPS和时延和客户端分析,分析请求中占比位于头部的请求,评估是否符合预期。如果请求为实际业务发起,您可以判断是否需降低请求量。
- 参见准入Webhook时延,分析是否因为Webhook执行慢导致API Server请求处理慢。
- 如果持续出现请求限流速率大于0,请提交工单获取技术支持。
准入Webhook时延
情况说明
正常情况 | 异常情况 | 说明 |
准入Webhook时延小于0.5s。 | 持续出现准入Webhook时延大于0.5s。 | Webhook响应慢会影响API Server的响应时延。 |
推荐解决方案
排查Webhook日志等信息,判断是否符合预期。如果不需要某个Webhook,请卸载。