导读:本期聚焦于公主创作的《Kubernetes 控制面指标监控与健康检查怎么做?核心组件状态排查详解》,敬请观看详情。apiserver 响应突然变慢、scheduler 不再调度 Pod、etcd 写入延迟飙升,这些问题往往都指向同一个方向:控制面出了状况。控制面是整个集群的大脑,一旦它不稳定,上层所有工作负载都会受到影响。本文围绕 kube-apiserver、kube-scheduler、kube-controller-manager 和 etcd 四大核心组件展开,介绍它们各自暴露的关键 Prometheus 指标含义、/healthz 与 /readyz 探活的正确用法、常见异常指标的判断阈值,以及如何搭建一套可持续的控制面监控方案,帮助你快速定位集群级故障根因。

Kubernetes 控制面承载着集群的全部决策逻辑:kube-apiserver 负责接收所有 API 请求,etcd 保存集群状态数据,kube-scheduler 决定 Pod 运行在哪个节点上,kube-controller-manager 则持续驱动集群向期望状态收敛。这四个组件中任何一个出现异常,都可能导致集群层面的问题,例如 Pod 无法调度、Service 无法更新、节点状态滞留等。因此,掌握控制面的指标采集与健康检查方法,是集群运维和故障排查中非常关键的一环。本文将从组件指标、健康探活、常见异常判断和监控方案搭建四个方面详细展开。

Kubernetes 控制面指标监控与健康检查怎么做?核心组件状态排查详解

一、控制面组件暴露了哪些关键指标

Kubernetes 的每个控制面组件都内置了 Prometheus 格式的指标端点,默认通过 HTTPS 端口暴露。kube-apiserver 使用 6443 端口的 /metrics 路径,kube-scheduler 和 kube-controller-manager 在启用身份认证后也提供同样的端点。要查看这些指标,最简单的方式是直接请求对应端点:

# 查看 apiserver 指标(需要认证)
kubectl get --raw /metrics | head -20

# 或者通过端口转发访问 scheduler 指标
kubectl -n kube-system port-forward pod/kube-scheduler-master 10259:10259
curl -k https://127.0.0.1:10259/metrics

kube-apiserver 最重要的指标集中在请求延迟和错误率上。apiserver_request_duration_seconds 是一个直方图指标,按 verb、resource 等维度拆分了 API 请求的处理耗时;apiserver_request_total 统计各类请求的总量,配合 code 标签可以计算出 5xx 错误率;apiserver_request_queue_duration_seconds 反映请求在队列中排队的时间,如果这个值持续升高,说明 apiserver 处理能力已经饱和,通常是 etcd 慢或者流量过大导致的。

etcd 的核心指标包括 etcd_server_slow_apply_total(慢 apply 操作次数)、etcd_disk_wal_fsync_duration_seconds(WAL 文件 fsync 延迟)和 etcd_disk_backend_commit_duration_seconds(后端提交延迟)。官方建议 WAL fsync 的 P99 延迟应低于 50ms,后端提交延迟 P99 应低于 100ms,超过这个水平说明磁盘 IO 已经成为瓶颈,需要更换更快的存储或排查 IO 争用。

对于 kube-scheduler,重点关注 scheduler_schedule_attempts_total,它按 result 标签区分调度成功和失败。失败原因又通过 reason 细分为 unschedulable、error 等,如果 unschedulable 的增长率持续不为零,说明有 Pod 因为资源不足或亲和性约束无法被调度。kube-controller-manager 的关键指标是 workqueue_depthworkqueue_retries_total,前者反映各控制器工作队列的积压深度,后者统计重试次数,这两个值异常升高往往意味着控制器卡住或 API 写入失败。

二、健康检查端点的正确用法

除了指标,控制面组件还提供了专门的健康检查端点。kube-apiserver 暴露了 /healthz/livez/readyz 三类探活路径。/livez 用于存活探针,判断进程是否存活;/readyz 用于就绪探针,判断组件是否已经可以对外提供服务;/healthz 则是较老的综合健康端点。三者背后的检查项可以通过 /readyz?verbose 参数查看明细:

# 查看就绪检查的详细结果
kubectl get --raw '/readyz?verbose'

# 输出示例
# [+]ping ok
# [+]log ok
# [+]etcd ok
# [+]poststarthook/start-apiserver-identity-controller ok
# ...
# readyz check passed

其中 etcd 检查项非常关键,apiserver 的就绪状态直接依赖与 etcd 的连通性。如果 etcd 集群不可用,apiserver 会自动将自己置为未就绪,负载均衡器(如 kube-apiserver 前面的 HAProxy 或云厂商 LB)就会把流量摘除,避免请求打到一台无法正常工作的 apiserver 上。这也是多 apiserver 高可用部署能自动故障转移的基础。

对于 kubelet 而言,控制面组件的静态 Pod 配置中通常会写入存活探针。以 kubeadm 部署的集群为例,kube-apiserver 的静态 Pod 清单位于 /etc/kubernetes/manifests/kube-apiserver.yaml,探针配置大致如下:

livenessProbe:
  failureThreshold: 8
  httpGet:
    path: /livez
    port: 6443
    scheme: HTTPS
  initialDelaySeconds: 10
  periodSeconds: 10
  timeoutSeconds: 15
readinessProbe:
  failureThreshold: 3
  httpGet:
    path: /readyz
    port: 6443
    scheme: HTTPS
  periodSeconds: 1
  timeoutSeconds: 15

注意 failureThreshold 的设置:apiserver 的存活探针允许连续 8 次失败才重启,周期 10 秒加上超时 15 秒,意味着组件最多可以忍受约 3 分钟的异常而不被强制重启。这个容忍度是刻意设计的,因为重启 apiserver 的代价很高,会中断所有 API 连接。如果你自定义了探针参数,不建议把 failureThreshold 调得太小,否则 etcd 短暂抖动就会引发 apiserver 反复重启,反而加剧故障。

三、常见异常场景与指标判断

掌握了指标和探活端点后,更重要的是能在故障发生时快速判断哪个组件出了问题。第一种典型场景是 API 请求变慢。这时应先看 apiserver_request_duration_seconds 的 P99 值,如果 LIST 类请求延迟很高,再结合 etcd_disk_backend_commit_duration_seconds 判断是否为 etcd 磁盘瓶颈。常见的根因是集群中存在大量对象(比如几万个 Pod 或 Endpoint),大范围的 LIST all-namespaces 请求会拖慢整个 etcd。

第二种场景是 Pod 一直处于 Pending 状态。排查顺序应该是:先执行 kubectl describe pod 查看 Events 中的调度失败原因,再检查 scheduler_schedule_attempts_total{result="unschedulable"} 的增长情况。如果调度器本身没有报错但 Pod 长时间无人处理,则要确认 scheduler 进程是否正常,可以通过其 10259 端口的 /healthz 端点确认。还有一种容易被忽视的情况是 scheduler 与 apiserver 之间的连接断开,此时 scheduler 进程存活但无法工作,表现为所有新建 Pod 都无人调度。

第三种场景是节点状态长时间不更新、Deployment 扩容无响应,这通常是 controller-manager 的问题。查看 workqueue_depth 是否持续大于零且不下降,配合 rest_client_requests_total{code="5xx"} 判断是否为写 API 失败导致控制器反复重试。此外还可以用一条 PromQL 快速发现无主 Pod:

# 过去5分钟内没有任何调度成功的集群告警
increase(scheduler_schedule_attempts_total{result="scheduled"}[5m]) == 0

etcd 相关的告警规则建议至少配置以下几条:WAL fsync P99 超过 500ms 持续 5 分钟、leader 变更次数 etcd_server_leader_changes_seen_total 在短时间内超过 3 次、以及 etcd 集群成员数低于预期值。leader 频繁切换是大集群最危险的前兆,往往伴随整个控制面的间歇性不可用,必须优先处理磁盘和网络问题。

四、搭建可持续的控制面监控方案

生产环境中不应该依赖手工 curl 去检查控制面状态,而是要用 Prometheus 加 Grafana 建立常态化的监控体系。kube-prometheus-stack 是目前最主流的方案,它内置了 etcd、kube-apiserver、kube-scheduler 和 kube-controller-manager 的 ServiceMonitor 和告警规则。部署时只需要确认各组件的 metrics 端口已被 Service 暴露,Prometheus 就能自动发现并抓取。

使用 kubeadm 部署的集群中,控制面组件以静态 Pod 形式运行在 master 节点上,kube-prometheus-stack 提供的 kube-prometheus-stack-self-monitoring 相关配置已经包含了对这些端点的抓取。如果是二进制部署,需要手动创建 Service 并打上合适的标签:

apiVersion: v1
kind: Service
metadata:
  name: kube-scheduler-prometheus-discovery
  namespace: kube-system
  labels:
    app.kubernetes.io/name: kube-scheduler
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: https-metrics
    port: 10259
    targetPort: 10259
    protocol: TCP

指标采集起来之后,建议在 Grafana 中关注几块核心面板:apiserver 请求 QPS 与错误率、请求延迟 P99 分布、etcd 磁盘延迟、scheduler 调度吞吐与延迟、以及各组件 workqueue 深度。这些面板组合起来,基本可以覆盖控制面 90% 以上的故障场景。社区 ID 为 15760 的 Grafana 面板专门用于 etcd 监控,可以直接导入使用。

最后要强调一点:控制面监控本身也有失效的可能,例如 Prometheus 与 apiserver 之间的网络中断会造成大面积指标缺失,这种缺失本身就是重要的告警信号。建议为每个控制面组件的 up 指标配置抓取失败告警,同时用集群外的黑盒探测(例如从管理节点定期请求 apiserver 的 /readyz)作为最后一道防线,确保控制面真正不可用时你能第一时间收到通知,而不是在用户报障后才发现问题。

Kubernetes控制面组件健康检查修改时间:2026-09-02 08:36:41

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。