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 服务发现自动抓取。
--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,表示控制器无法收到资源变更事件。
--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_secondsP99 升高。 - 节点资源不足导致调度失败:
scheduler_unschedulable_pods持续 > 0,且原因标签为InsufficientMemory或InsufficientCPU,说明集群资源已耗尽。 - 调度队列积压:
scheduler_pending_pods突增,同时scheduler_queue_incoming_pods_total速率正常,说明调度器处理速度跟不上 Pod 创建速度。
# 按优先级类查看 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_secondsP99 升高,导致写入延迟增大,APIServer 响应变慢。 - 数据库空间不足:频繁的 Pod 创建/删除会产生大量历史版本,
etcd_db_total_size_in_bytes快速增长,接近配额时 etcd 会拒绝写入。 - Leader 频繁切换:网络抖动或磁盘慢导致心跳超时,
etcd_server_leader_changes_seen_total突增,集群进入选举状态,期间无法提供服务。
--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_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