文档

kube-apiserver组件监控

更新时间:

本文主要介绍kube-apiserver组件的指标清单、对应大盘的使用指导以及常见指标异常的问题解析。

指标清单

指标是组件对外透出状态和参数的方式之一,kube-apiserver组件使用的指标清单如下。

指标清单

类型

解释

apiserver_request_duration_seconds_bucket

Histogram

该指标用于统计APIServer客户端对APIServer的访问时延。对APIServer不同请求的时延分布。请求的维度包括Verb、Group、Version、Resource、Subresource、Scope、Component和Client。

Histogram Bucket的阈值为:{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60},单位:秒。

apiserver_request_total

Counter

对APIServer不同请求的计数。请求的维度包括Verb、Group、Version、Resource、Scope、Component、HTTP contentType、HTTP code和Client。

apiserver_request_no_resourceversion_list_total

Counter

对APIServer的请求参数中未配置ResourceVersion的LIST请求的计数。请求的维度包括Group、Version、Resource、Scope和Client。用来评估quorum read类型LIST请求的情况,用于发现是否存在过多quorum read类型LIST以及相应的客户端,以便优化客户端请求行为。

apiserver_current_inflight_requests

Gauge

APIServer当前处理的请求数。包括ReadOnly和Mutating两种。

apiserver_dropped_requests_total

Counter

限流丢弃掉的请求数。HTTP返回值是429 'Try again later'

apiserver_admission_controller_admission_duration_seconds_bucket

Gauge

准入控制器(Admission Controller)的处理延时。标签包括准入控制器名字、操作(CREATE、UPDATE、CONNECT等)、API资源、操作类型(validate或admit)和请求是否被拒绝(true或false)。

Bucket的阈值为:{0.005, 0.025, 0.1, 0.5, 2.5},单位:秒。

apiserver_admission_webhook_admission_duration_seconds_bucket

Gauge

准入Webhook(Admission Webhook)的处理延时。标签包括准入控制器名字、操作(CREATE、UPDATE、CONNECT等)、API资源、操作类型(validate或admit)和请求是否被拒绝(true或false)。

Bucket的阈值为:{0.005, 0.025, 0.1, 0.5, 2.5},单位:秒。

apiserver_admission_webhook_admission_duration_seconds_count

Counter

准入Webhook(Admission Webhook)的处理请求统计。标签包括准入控制器名字、操作(CREATE、UPDATE、CONNECT等)、API资源、操作类型(validate或admit)和请求是否被拒绝(true或false)。

cpu_utilization_core

Gauge

CPU使用量,单位:核(Core)。

cpu_utilization_ratio

Gauge

CPU使用率=CPU使用量/内存资源上限,百分比形式。

memory_utilization_byte

Gauge

内存使用量,单位:字节(Byte)。

memory_utilization_ratio

Gauge

内存使用率=内存使用量/内存资源上限,百分比形式。

up

Gauge

服务可用性。

  • 1:表示服务可用。

  • 0:表示服务不可用。

大盘使用指导

大盘基于组件指标和相关PromQL绘制,包括关键指标、概览、资源分析、QPS和时延、准入控制器和Webhook、客户端分析部分。

大盘功能解析如下,常见的使用顺序为:

  1. 查看关键指标,以便快速查看集群关键指标。详细信息,请参见关键指标

  2. 查看概览,以便分析APIServer的响应时延、当前处理请求数和是否有限流发生。详细信息,请参见概览

  3. 查看资源分析,以便查看托管侧组件的资源水位。详细信息,请参见资源分析

  4. 查看QPS和时延,以便通过多维度深入分析QPS、RT。详细信息,请参见QPS和时延

  5. 查看注入控制器和Webhook,以便分析准入控制器和Webhook的QPS、RT。详细信息,请参见注入控制器和Webhook

  6. 查看客户端分析,以便通过客户端多维度分析QPS。详细信息,请参见客户端分析

筛选框

在大盘最上部有两个筛选框。以下筛选框可以配置观测APIServer请求的verb、资源(resource)、分位数(quantile)和面板使用的PromQL的采样时长(interval)。

如果需要观测特定的verb、resource的请求,可以调整verb、resource。如果需要调整分位数,可以调整quantile。以0.9为例,表示大盘上Histogram类型指标的采样值的数量占该类型指标总体采样值的90%。分位数为0.9(简称为P90)的指标可以去除采样值占比小的长尾样本的影响,分位数为0.99(简称为P99)的指标会包含长尾样本的影响。筛选框

以下筛选框可以选择观测的时间段和页面刷新周期。筛选框2

关键指标

  • 可观测性展示100

  • 功能解析

    名称

    PromQL

    说明

    API QPS

    sum(irate(apiserver_request_total[$interval]))

    APIServer总QPS。

    读请求成功率

    sum(irate(apiserver_request_total{code=~"20.*",verb=~"GET|LIST"}[$interval]))/sum(irate(apiserver_request_total{verb=~"GET|LIST"}[$interval]))

    APIServer读请求成功率。

    写请求成功率

    sum(irate(apiserver_request_total{code=~"20.*",verb!~"GET|LIST|WATCH|CONNECT"}[$interval]))/sum(irate(apiserver_request_total{verb!~"GET|LIST|WATCH|CONNECT"}[$interval]))

    APIServer写请求成功率。

    在处理读请求数量

    sum(apiserver_current_inflight_requests{requestKind="readOnly"})

    APIServer当前在处理读请求数量。

    在处理写请求数量

    sum(apiserver_current_inflight_requests{requestKind="mutating"})

    APIServer当前在处理写请求数量。

    请求限流速率

    sum(irate(apiserver_dropped_requests_total[$interval]))

    Dropped Request Rate。

概览

  • 可观测性展示50

  • 功能解析

    名称

    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请求的响应时间,维度包括APIServer Pod、Verb(GET)、Resources(例如Configmaps、Pods、Leases等)、Scope(范围例如Namespace级别、Cluster级别)。

    LIST读请求时延

    histogram_quantile($quantile, sum(irate(apiserver_request_duration_seconds_bucket{verb="LIST"}[$interval])) by (pod_name, verb, resource, scope, le))

    展示LIST请求的响应时间,维度包括APIServer Pod、Verb(GET)、Resources(例如Configmaps、Pods、Leases等)、Scope(范围例如Namespace级别、Cluster级别)。

    写请求时延

    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请求的响应时间,维度包括APIServer Pod、Verb(GET)、Resources(例如Configmaps、Pods、Leases等)、Scope(范围例如Namespace级别、Cluster级别)。

    在处理读请求数量

    apiserver_current_inflight_requests{request_kind="readOnly"}

    在处理读请求数量。

    在处理写请求数量

    apiserver_current_inflight_requests{request_kind="mutating"}

    在处理写请求数量。

    请求限流速率

    sum(irate(apiserver_dropped_requests_total{request_kind="readOnly"}[$interval])) by (name)

    sum(irate(apiserver_dropped_requests_total{request_kind="mutating"}[$interval])) by (name)

    APIServer限流速率 ,No data或者0表示没有限流。

资源分析

  • 可观测性展示资源对象

  • 功能解析

    名称

    PromQL

    说明

    内存使用量

    memory_utilization_byte{container="kube-apiserver"}

    APIServer内存使用量,单位:字节。

    CPU使用量

    cpu_utilization_core{container="kube-apiserver"}*1000

    CPU使用量,单位:毫核。

    内存使用率

    memory_utilization_ratio{container="kube-apiserver"}

    APIServer内存使用率,百分比。

    CPU使用率

    cpu_utilization_ratio{container="kube-apiserver"}

    APIServer CPU使用率,百分比。

    资源对象数量

    • max by(resource)(apiserver_storage_objects)

    • max by(resource)(etcd_object_counts)

    Kubernetes管理资源数量。不同ACK版本指标名称不同:

    • 当ACK为1.22以及以上版本时, 指标名字为apiserver_storage_objects

    • 当ACK为1.22及以下版本时, 指标名字为etcd_object_counts。

QPS和时延

  • 可观测性展示48

  • 功能解析

    名称

    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返回值的读请求QPS。

    非2xx返回值的写请求QPS

    sum(irate(apiserver_request_total{verb!~"GET|LIST|WATCH",verb=~"$verb",resource=~"$resource",code!~"2.*"}[$interval])) by (verb,resource,code)

    统计非2xx返回值的写请求QPS。

    Apiserver对etcd请求时延

    histogram_quantile($quantile, sum(irate(etcd_request_duration_seconds_bucket[$interval])) by (le,operation,type,instance))

    统计Apiserver对etcd请求时延。

准入控制器和Webhook

  • 可观测性展示47

  • 功能解析

    名称

    PromQL

    说明

    准入控制器时延[admit]

    histogram_quantile($quantile, sum by(operation, name, le, type, rejected) (irate(apiserver_admission_controller_admission_duration_seconds_bucket{type="admit"}[$interval])) )

    • 展示使用到的admit类型准入控制器、操作、是否拒绝以及相应的执行时间。

    • 指标Bucket阈值:{0.005、0.025、0.1、0.5、2.5},单位:秒。

    准入控制器时延[validate]

    histogram_quantile($quantile, sum by(operation, name, le, type, rejected) (irate(apiserver_admission_controller_admission_duration_seconds_bucket{type="validate"}[$interval])) )

    • 展示使用到的validate类型准入控制器、操作、是否拒绝以及相应的执行时间。

    • 指标Bucket阈值:{0.005、0.025、0.1、0.5、2.5},单位:秒。

    准入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阈值:{0.005、0.025、0.1、0.5、2.5},单位:秒。

    准入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阈值:{0.005、0.025、0.1、0.5、2.5},单位:秒。

    准入Webhook请求QPS

    sum(irate(apiserver_admission_webhook_admission_duration_seconds_count[$interval]))by(name,operation,type,rejected)

    准入Webhook请求QPS。

客户端分析

  • 可观测性展示45

  • 功能解析

    名称

    PromQL

    说明

    按Client维度分析QPS

    sum(irate(apiserver_request_total{client!=""}[$interval])) by (client)

    按Client维度分析QPS。用于分析对APIServer访问的客户端以及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)

    • 按Verb+Resource+Client维度分析LIST请求QPS(无resourceVersion字段)。

    • 可以分析对APIServer的全部LIST请求中、击穿到etcd的部分LIST请求,帮助识别以及优化APIServer客户端的LIST行为。

常见指标异常

读/写请求成功率

正常情况

异常情况

说明

建议

读请求成功率写请求成功率接近100%。

读请求成功率写请求成功率维持在较低百分比,例如小于90%。

存在较多非200返回值请求。

  • 查看面板:非2xx返回值的读请求QPS非2xx返回值的写请求 QPS中导致非200返回值请求类型和资源。例如:如果有GET/deployment 404,表示存在GET deployment返回404的请求,会导致读请求成功率降低。

  • 定位该类非200请求是否符合预期。

GET/LIST读请求时延和写请求时延

正常情况

异常情况

说明

建议

GET读请求时延LIST读请求时延写请求时延与访问的集群资源数量和集群规模有关联,没有固定的正常与异常的时间分界,只要不影响业务就可以接受。比如,如果访问的某种资源量越大,那么LIST请求时间就会越长。一般情况下,GET读请求时延写请求时延小于1s, LIST读请求时延小于5s,可以认为正常。

  • GET读请求时延写请求时延大于1s。

  • LIST读请求时延大于5s。

请求的响应时延过长,需要排除是资源多、还是Webhook等因素影响。

  • 查看面板:GET读请求时延LIST读请求时延写请求时延中导致非200返回值请求类型和资源。

    说明

    登录Pod的请求POST pod/exec,读取日志的请求GET pod/log会建立长链接,所以该类请求时间通常会超过60s。因为请求延时指标apiserver_request_duration_seconds_bucket的最大阈值是60s,超过60s的请求都会统计为60s。可忽略该类请求,不需要分析。

  • 参见准入Webhook时延,分析是否因为Webhook执行慢导致APIServer请求延时长。

在处理读/写请求数量和请求限流速率

正常情况

异常情况

说明

建议

通常,在处理读请求数量在处理写请求数量小于100, 请求限流速率为0,可以认为正常。

  • 在处理读请求数量在处理写请求数量大于100。

  • 请求限流速率大于0。

当前在处理请求的队列满,需要排除是短时请求量大导致处理跟不上还是Webhook等因素影响。如果超过队列长度,会导致APIServer限流,出现请求限流速率大于0,影响集群稳定性。

  • 查看QPS和时延客户端分析,分析请求中占比位于头部的请求,查看这些请求是否符合预期,如果是业务产生的请求是否可以降低请求量。

  • 参见准入Webhook时延,分析是否因为Webhook执行慢导致APIServer请求处理慢。

  • 如果持续出现请求限流速率大于0,请联系阿里云支持。

内存/CPU使用率

正常情况

异常情况

说明

建议

内存使用率小于80%,CPU使用率小于90%

持续出现内存使用率大于90%,CPU使用率大于90%

  • APIServer负载压力大、资源水位快到极限。

  • 严重的内存资源紧张会导致APIServer OOM。

  • 严重的CPU资源紧张会导致APIServer响应慢、发生非预期异常。

  • 查看QPS和时延客户端分析,分析请求中占比位于头部的请求,查看这些请求是否符合预期,如果是业务产生的请求是否可以降低请求量。

  • 查看集群内K8s资源数量,非常多的资源数量(例如Configmaps、Secrets、PVC等),会导致APIServer资源水位高。

  • 参见控制平面组件访问最佳实践优化对集群的访问方式。

准入Webhook时延

正常情况

异常情况

说明

建议

准入Webhook时延小于0.5s

持续出现准入Webhook时延大于0.5s

Webhook响应慢会影响到APIServer响应时延,需要排查Webhook是否工作正常。

排查Webhook日志等信息,判断是否符合工作预期;如果不需要Webhook,可以卸载掉。

  • 本页导读 (1)
文档反馈