4. 集群生命周期阶段划分:创建、扩缩容、升级、备份恢复、销毁阶段的监控要点
K8s 集群的生命周期并非单一运行态,而是由多个具有不同风险特征和监控目标的阶段组成。SRE 需要针对每个阶段制定差异化的延迟水位与异常事件监控策略,才能实现全生命周期的可观测性覆盖。
核心原则:每个阶段都需关注“控制面延迟”和“工作负载扰动”两个维度。控制面延迟反映 API Server、etcd、调度器、控制器管理器的响应能力;工作负载扰动反映 Pod 重建、流量切换、数据迁移对业务的影响。
4.1 阶段总览与监控维度矩阵
下表列出五个生命周期阶段的关键监控维度、典型指标及异常事件类型:
| 阶段 | 核心监控对象 | 延迟水位关键指标 | 典型异常事件 |
|---|---|---|---|
| 创建 | API Server、etcd、CNI、CoreDNS | API 请求延迟 P99、etcd 写入延迟、Pod 启动延迟 | 节点注册失败、CNI 分配 IP 超时、kubelet 证书未就绪 |
| 扩缩容 | Cluster Autoscaler、HPA、调度器、节点池 | 扩缩容决策延迟、节点就绪延迟、Pod 调度延迟 | 节点创建失败、资源不足导致 Pending、缩容驱逐卡死 |
| 升级 | kube-apiserver、kube-scheduler、kube-controller-manager、kubelet、kube-proxy | 组件重启恢复时间、API 请求错误率、节点 Drain 延迟 | 版本兼容性错误、Pod 驱逐超时、控制面组件 CrashLoopBackOff |
| 备份恢复 | etcd 快照、Velero、存储后端 | 快照完成时间、恢复 RTO、数据一致性校验延迟 | 快照损坏、恢复后集群状态不一致、RBAC 丢失 |
| 销毁 | 节点、PV/PVC、Service、Ingress Controller | 资源回收延迟、DNS 记录清理延迟、流量 draining 完成时间 | PV 残留、SLB 未解绑、Finalizer 阻塞删除 |
4.2 创建阶段监控要点
集群创建阶段是基础设施从零到一的过程,控制面组件首次启动、网络插件初始化、节点注册等步骤最容易出现配置错误和依赖超时。
- API Server 就绪探测:监控
apiserver_request_duration_seconds的 P99 延迟,创建阶段应 < 1s;若持续 > 5s,通常表明 etcd 连接异常或证书问题。 - etcd 集群健康:通过
etcd_server_leader_changes_seen_total检测 leader 频繁切换;通过etcd_disk_wal_fsync_duration_seconds监控磁盘 I/O 延迟,创建阶段 WAL fsync 延迟应 < 10ms。 - 节点注册延迟:监控
kubelet_node_status_condition{condition="Ready"}从节点启动到 Ready 的时间,超过 5 分钟应告警。 - CNI 与 DNS 就绪:创建阶段需验证 CoreDNS Pod 启动时间 < 30s,且
coredns_dns_request_duration_secondsP99 < 100ms。
实战建议:在集群创建脚本中嵌入 Prometheus 黑盒探测,持续 5 分钟每 10s 检查一次 API Server 健康端点,若连续 3 次失败则终止创建流程并输出诊断日志。
4.3 扩缩容阶段监控要点
扩缩容阶段的核心风险在于资源供给延迟和调度积压,尤其是云上节点池扩容时,云商 API 限流、镜像拉取慢、节点初始化脚本失败都会导致延迟水位飙升。
- Cluster Autoscaler 决策延迟:监控
cluster_autoscaler_function_duration_seconds,正常应 < 30s;若超过 2 分钟,需检查云商 API 调用是否被限流。 - 节点就绪延迟:从云商实例创建到 kubelet 上报 Ready 的端到端时间,建议告警阈值:虚拟机节点 > 10 分钟,裸金属节点 > 20 分钟。
- Pod 调度延迟:监控
scheduler_e2e_scheduling_duration_secondsP99,扩缩容期间应 < 5s;若持续 > 30s,表明调度器积压或节点亲和性冲突。 - 缩容驱逐事件:通过 Event 对象监控
Evicted事件,关注是否有 Pod 因 PDB 限制导致驱逐卡死超过 5 分钟。
避坑提示:缩容时若节点上存在非控制器管理的 Pod(如 static Pod、DaemonSet 之外的独立 Pod),kubelet 会拒绝驱逐,导致节点 Terminating 状态持续数小时。务必在缩容前通过
kubectl get pods --field-selector=status.phase!=Running,status.phase!=Succeeded 检查残留 Pod。
4.4 升级阶段监控要点
升级是集群生命周期中风险最高的操作,控制面组件滚动重启、kubelet 版本变更、API 资源版本废弃都可能导致服务中断。监控必须覆盖升级前、升级中、升级后三个阶段。
| 子阶段 | 监控指标 | 异常事件 | 告警阈值 |
|---|---|---|---|
| 升级前检查 | API Server 版本、etcd 版本、节点 kubelet 版本 | 版本不兼容、废弃 API 使用 | 存在已废弃的 API 版本即告警 |
| 控制面升级 | apiserver_request_total{code=~"5.."} 错误率 |
API Server CrashLoopBackOff、etcd 成员变更失败 | 错误率 > 1% 持续 1 分钟 |
| 节点 Drain | kubelet_drain_duration_seconds |
Pod 驱逐超时、PDB 阻止驱逐 | 单节点 Drain 时间 > 10 分钟 |
| 节点升级 | kubelet_node_status_condition{condition="Ready"} |
kubelet 启动失败、容器运行时版本不匹配 | 节点升级后 15 分钟未 Ready |
| 升级后验证 | 核心组件 Pod 重启次数、API 请求延迟 P99 | 组件 CrashLoop、延迟突增 > 3 倍基线 | 重启次数 > 3 次 / 5 分钟 |
4.5 备份恢复阶段监控要点
备份恢复阶段的可观测性常被忽视,但 etcd 快照损坏或恢复后 RBAC 丢失可能导致整个集群不可用。监控应覆盖备份作业本身和恢复演练两个场景。
- etcd 快照完整性:每次备份后执行
etcdctl snapshot status检查快照哈希和版本,通过 Prometheus 自定义 exporter 上报etcd_snapshot_integrity{result="pass|fail"}。 - 备份作业延迟:监控 Velero 或 etcd 备份 Job 的完成时间,与历史基线对比,若超过基线 2 倍则告警。
- 恢复 RTO 监控:从触发恢复操作到 API Server 返回 200 的端到端时间,生产环境 RTO 目标通常 < 30 分钟。
- 恢复后一致性校验:恢复完成后自动执行
kubectl get nodes、kubectl get pods --all-namespaces,对比恢复前后的资源数量偏差。
关键指标:备份成功率 = 成功备份次数 / 总备份次数 × 100%,目标 99.9%;恢复成功率 = 成功恢复演练次数 / 总演练次数 × 100%,目标 100%。
4.6 销毁阶段监控要点
集群销毁阶段的风险在于资源残留和依赖清理不彻底,尤其是云上负载均衡器、持久化存储卷、DNS 记录等外部资源可能成为孤儿资源,产生持续费用或安全风险。
- 资源回收延迟:监控
kubectl get pv中Released状态的 PV 数量,若销毁后 30 分钟仍有残留,表明回收策略未生效或 Finalizer 阻塞。 - SLB/ELB 解绑延迟:通过云商 API 监控负载均衡器实例的删除状态,若集群删除后 15 分钟仍未解绑,需人工介入。
- DNS 记录清理:检查 ExternalDNS 或 CoreDNS 中集群相关域名记录是否已移除,避免域名指向已销毁的 IP。
- Namespace 终结状态:监控
kubectl get ns中Terminating状态的 Namespace,若超过 10 分钟未完成,通常存在 Finalizer 未移除。
高危场景:当集群销毁脚本未按顺序执行(先删负载均衡,再删节点,最后删控制面)时,云商 API 可能因依赖关系返回错误,导致部分资源残留。建议在销毁脚本中嵌入幂等清理步骤,每次执行前先查询残留资源列表。
4.7 阶段间延迟水位对比与告警策略
不同阶段的延迟水位基线差异很大,不能使用统一的告警阈值。下表给出各阶段的推荐告警阈值和评估周期:
| 阶段 | 指标 | Warning 阈值 | Critical 阈值 | 评估窗口 |
|---|---|---|---|---|
| 创建 | API Server 请求延迟 P99 | > 2s | > 5s | 5 分钟 |
| 扩缩容 | 节点就绪延迟 | > 8 分钟 | > 15 分钟 | 单次操作 |
| 升级 | API 错误率 | > 0.5% | > 2% | 1 分钟 |
| 备份恢复 | 备份完成时间 | > 基线 1.5x | > 基线 3x | 单次作业 |
| 销毁 | 资源残留数量 | > 0 个 | > 5 个 | 30 分钟 |
通过将生命周期阶段标签(lifecycle_phase)注入 Prometheus 指标,可以在告警规则中区分阶段上下文,避免误告警。例如:
# Prometheus 告警规则示例
- alert: NodeProvisionDelay
expr: |
max by (node) (time() - kubelet_node_status_condition{condition="Ready",status="true"})
* on (node) group_left(lifecycle_phase) kube_node_labels
> 600
for: 1m
labels:
severity: critical
annotations:
summary: "节点 {{ $labels.node }} 在 {{ $labels.lifecycle_phase }} 阶段就绪延迟超过 10 分钟"
以上监控要点覆盖了集群从创建到销毁的完整生命周期,SRE 团队应针对每个阶段编写独立的 Grafana 仪表盘和告警规则,并在阶段切换时自动调整监控上下文,实现全生命周期的可观测性闭环。