3. Kubernetes 控制面组件:kube-apiserver、kube-controller-manager、kube-scheduler、etcd 的监控要点

在 Kubernetes 控制面弹性伸缩场景中,控制面组件自身的健康与性能直接决定了扩缩容决策的时效性与准确性。Prometheus 监控必须覆盖四个核心组件:kube-apiserver、kube-controller-manager、kube-scheduler 和 etcd。每个组件都有其独特的指标语义和故障模式,本节将逐一拆解其监控要点。

3.1 控制面组件监控架构总览

下图展示了 Prometheus 对 Kubernetes 控制面组件的采集架构。每个组件通过 /metrics 端点暴露指标,Prometheus 使用 kubernetes-service-endpoints 或 kubernetes-pods 服务发现自动抓取。

控制面组件 Prometheus 采集架构 Prometheus Server kube-apiserver :6443/metrics kube-controller-manager :10257/metrics kube-scheduler :10259/metrics etcd :2379/metrics 采集方式说明 • kube-apiserver:通过 Service 或 Pod 服务发现,使用 HTTPS 证书认证 • kube-controller-manager / kube-scheduler:默认绑定 127.0.0.1,需修改 --bind-address • etcd:需启用 --metrics-basic 或 --metrics-extensive 参数暴露指标 • 建议使用 Prometheus Operator 的 ServiceMonitor 或 PodMonitor 自动管理采集目标
采集配置要点:在弹性伸缩场景中,务必确保 Prometheus 对控制面组件的采集间隔 ≤ 15s(默认 30s 可能延迟发现请求积压)。对于 kube-controller-manager 和 kube-scheduler,如果使用 kubeadm 部署,需在静态 Pod 清单中添加 --bind-address=0.0.0.0 参数。

3.2 kube-apiserver 监控要点

kube-apiserver 是控制面的流量入口,所有扩缩容请求(如 scale、patch、update)都经过它。监控重点在于请求延迟、错误率和队列积压。

3.2.1 核心指标清单

指标名称 类型 监控意义 告警阈值建议
apiserver_request_duration_seconds Histogram 按 verb、resource、subresource 统计请求延迟,P99 超过 1s 表示性能瓶颈 P99 > 5s 告警
apiserver_request_total Counter 请求总数,按 code 区分,5xx 比例突增表示服务异常 5xx 比例 > 1% 告警
apiserver_current_inflight_requests Gauge 当前正在处理的请求数,接近 max-inflight 限制时触发限流 > 80% 容量告警
apiserver_longrunning_gauge Gauge 长时间运行的请求(如 watch),过多会耗尽连接池 > 100 告警
workqueue_depth Gauge APIServer 内部工作队列深度,持续增长表示处理能力不足 > 1000 告警

3.2.2 弹性伸缩场景中的故障模式

  • 请求积压导致扩缩容延迟:当 apiserver_current_inflight_requests 持续接近上限时,新的 scale 请求被排队,HPA 或 Cluster Autoscaler 的决策无法及时下发。
  • watch 连接泄漏:大量 apiserver_longrunning_gauge 连接未正常关闭,导致 APIServer 内存持续增长,最终 OOM。
  • etcd 慢查询传导:APIServer 的 P99 延迟突增往往由 etcd 慢查询引起,需联动监控 etcd 指标。
排查命令示例:
# 查看 APIServer 当前 inflight 请求分布
kubectl get --raw /metrics | grep apiserver_current_inflight_requests

# 按 verb 和 resource 分析 P99 延迟
histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket{verb=~"CREATE|UPDATE|PATCH"}[5m])) by (le, resource))

3.3 kube-controller-manager 监控要点

kube-controller-manager(KCM)负责运行各种控制器,包括 Deployment Controller、ReplicaSet Controller、HorizontalPodAutoscaler Controller 等。在弹性伸缩中,HPA Controller 和 Node Lifecycle Controller 的响应速度至关重要。

3.3.1 核心指标清单

指标名称 类型 监控意义 告警阈值建议
workqueue_depth{name="horizontalpodautoscaler"} Gauge HPA 控制器工作队列深度,积压表示 HPA 处理延迟 > 50 告警
workqueue_adds_total{name="horizontalpodautoscaler"} Counter HPA 事件入队速率,突降可能表示 informer 异常 速率降为 0 告警
controller_runtime_reconcile_total Counter 控制器调谐次数,按 controller 和 result 区分 error 比例 > 5% 告警
controller_runtime_reconcile_time_seconds Histogram 调谐耗时,P99 超过 10s 表示控制器逻辑阻塞 P99 > 30s 告警
rest_client_request_duration_seconds Histogram KCM 访问 APIServer 的请求延迟,反映 APIServer 响应能力 P99 > 2s 告警

3.3.2 弹性伸缩场景中的故障模式

  • HPA 控制器队列积压:当 workqueue_depth{name="horizontalpodautoscaler"} 持续增长时,HPA 无法及时处理指标变化,导致扩缩容滞后。
  • ReplicaSet 控制器调谐失败:controller_runtime_reconcile_total{controller="replicaset", result="error"} 突增,可能导致 Pod 创建/删除卡住。
  • informer 与 APIServer 断连:workqueue_adds_total 速率降为 0,表示控制器无法收到资源变更事件。
常见陷阱:KCM 默认的 --horizontal-pod-autoscaler-sync-period 为 15s,如果 Prometheus 采集间隔大于该值,可能漏掉 HPA 的快速决策变化。建议将采集间隔设为 10s 或更短。

3.4 kube-scheduler 监控要点

kube-scheduler 负责将新创建的 Pod 分配到合适的节点。在弹性伸缩场景中,调度延迟直接影响 Pod 的就绪时间,进而影响扩缩容的生效速度。

3.4.1 核心指标清单

指标名称 类型 监控意义 告警阈值建议
scheduler_pod_scheduling_duration_seconds Histogram Pod 从创建到调度成功的总延迟,P99 超过 5s 表示调度瓶颈 P99 > 10s 告警
scheduler_queue_incoming_pods_total Counter 进入调度队列的 Pod 速率,突增表示大量 Pod 等待调度 速率突增 10 倍告警
scheduler_pending_pods Gauge 当前等待调度的 Pod 数量,持续增长表示调度器处理能力不足 > 100 告警
scheduler_preemption_attempts_total Counter 抢占尝试次数,频繁抢占表示资源紧张 速率 > 1/min 告警
scheduler_unschedulable_pods Gauge 无法调度的 Pod 数量,需结合原因标签排查 > 0 告警

3.4.2 弹性伸缩场景中的故障模式

  • 调度延迟导致扩容生效慢:HPA 触发扩容后,新 Pod 长时间处于 Pending 状态,scheduler_pod_scheduling_duration_seconds P99 升高。
  • 节点资源不足导致调度失败:scheduler_unschedulable_pods 持续 > 0,且原因标签为 InsufficientMemory 或 InsufficientCPU,说明集群资源已耗尽。
  • 调度队列积压:scheduler_pending_pods 突增,同时 scheduler_queue_incoming_pods_total 速率正常,说明调度器处理速度跟不上 Pod 创建速度。
调度延迟分析 PromQL:
# 按优先级类查看 P99 调度延迟
histogram_quantile(0.99, sum(rate(scheduler_pod_scheduling_duration_seconds_bucket[5m])) by (le, priority))

# 查看无法调度的 Pod 原因分布
sum by (reason) (scheduler_unschedulable_pods)

3.5 etcd 监控要点

etcd 是 Kubernetes 控制面的持久化存储,所有控制面组件的读写操作最终都依赖 etcd。etcd 的性能直接决定了整个控制面的响应速度,尤其在弹性伸缩场景中,频繁的 Pod 创建/删除事件会产生大量 etcd 写入。

3.5.1 核心指标清单

指标名称 类型 监控意义 告警阈值建议
etcd_server_leader_changes_seen_total Counter Leader 变更次数,频繁变更表示集群不稳定 > 1/min 告警
etcd_disk_wal_fsync_duration_seconds Histogram WAL 日志 fsync 延迟,反映磁盘写入性能 P99 > 100ms 告警
etcd_db_total_size_in_bytes Gauge 数据库总大小,接近配额时触发告警 > 2GB 告警(默认配额 8GB)
etcd_request_duration_seconds Histogram 请求延迟,按 operation 区分,P99 超过 100ms 表示性能问题 P99 > 500ms 告警
etcd_network_client_traffic_in_bytes Counter 客户端网络流量,突增表示 APIServer 请求量增大 突增 5 倍告警

3.5.2 弹性伸缩场景中的故障模式

  • 磁盘 I/O 瓶颈:大规模扩缩容时,大量 Pod 事件写入 etcd,etcd_disk_wal_fsync_duration_seconds P99 升高,导致写入延迟增大,APIServer 响应变慢。
  • 数据库空间不足:频繁的 Pod 创建/删除会产生大量历史版本,etcd_db_total_size_in_bytes 快速增长,接近配额时 etcd 会拒绝写入。
  • Leader 频繁切换:网络抖动或磁盘慢导致心跳超时,etcd_server_leader_changes_seen_total 突增,集群进入选举状态,期间无法提供服务。
优化建议:在弹性伸缩频繁的集群中,建议启用 etcd 的 --auto-compaction-mode=periodic --auto-compaction-retention=1h 定期压缩历史版本,避免数据库无限增长。同时使用 SSD 磁盘并确保 etcd_disk_wal_fsync_duration_seconds P99 < 10ms。

3.6 控制面组件监控指标对比总结

下表从延迟敏感度、队列深度、错误率和资源消耗四个维度对比四个组件的监控重点:

组件 延迟敏感度 队列深度指标 错误率指标 资源消耗指标
kube-apiserver 极高(P99 > 1s 即影响扩缩容) apiserver_current_inflight_requests apiserver_request_total{code=~"5.."} 内存、goroutine 数
kube-controller-manager 高(调谐延迟 > 10s 导致控制器滞后) workqueue_depth{name="horizontalpodautoscaler"} controller_runtime_reconcile_total{result="error"} 内存、informer 缓存大小
kube-scheduler 高(调度延迟 > 5s 影响 Pod 就绪) scheduler_pending_pods scheduler_unschedulable_pods 内存、调度队列大小
etcd 极高(P99 > 100ms 即影响全局) 无直接队列指标,关注 etcd_request_duration_seconds etcd_server_leader_changes_seen_total 磁盘 I/O、DB 大小、网络流量
关键告警联动:当 etcd 的 etcd_request_duration_seconds P99 超过 500ms 时,APIServer 的 apiserver_request_duration_seconds 必然同步升高,同时 KCM 和 Scheduler 的 rest_client_request_duration_seconds 也会恶化。建议设置级联告警:etcd 延迟告警触发后,自动抑制 APIServer 和 KCM 的衍生告警,避免告警风暴。

3.7 控制面组件监控的 Prometheus 配置示例

以下是一个使用 Prometheus Operator ServiceMonitor 采集控制面组件的配置片段:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kube-apiserver
  namespace: monitoring
spec:
  endpoints:
  - port: https
    scheme: https
    tlsConfig:
      caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
      certFile: /etc/prometheus/secrets/etcd-certs/client.crt
      keyFile: /etc/prometheus/secrets/etcd-certs/client.key
    bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/
    interval: 10s
    scrapeTimeout: 8s
  selector:
    matchLabels:
      component: apiserver
      provider: kubernetes
---
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: kube-controller-manager
  namespace: monitoring
spec:
  podMetricsEndpoints:
  - port: metrics
    interval: 10s
    scrapeTimeout: 8s
  selector:
    matchLabels:
      component: kube-controller-manager
  namespaceSelector:
    matchNames:
    - kube-system
采集间隔选择:控制面组件建议使用 10s 采集间隔,与 HPA 的默认同步周期(15s)匹配,确保 Prometheus 能在 HPA 每次决策周期内至少采集到 1 个完整数据点。如果集群规模较大(> 1000 节点),可适当放宽到 15s 以降低 Prometheus 自身负载。