3. 瓶颈识别方法论:升级前资源审计的步骤、关键指标(CPU、内存、Pod数量、PVC存储)的采集与分析
集群升级前,资源审计是识别瓶颈、规避升级失败的核心前置动作。缺乏审计的升级如同“盲飞”——你可能在升级过程中遭遇 Pod 驱逐失败、节点压力超限、控制面组件 OOM 等连锁故障。本节将系统化拆解审计步骤与关键指标采集方法。
3.1 资源审计四步法
审计不是一次性快照,而是一个从“全局扫描”到“风险定位”的递进过程。推荐按以下四个步骤执行:
- 步骤一:集群级容量摸底 —— 获取集群总可分配资源(Allocatable)与当前请求量(Requests)的比值,判断整体水位。
- 步骤二:节点级压力扫描 —— 逐节点检查 CPU/Memory 的
Allocatable - Requests - Reserved余量,标记压力节点。 - 步骤三:工作负载级细粒度分析 —— 按 Namespace/Deployment/StatefulSet 统计资源使用率与 Limit 配置,识别“资源黑洞”。
- 步骤四:存储与对象计数审计 —— 检查 PVC 容量、PV 绑定状态、Pod 总数与 Endpoint 数量,避免控制面过载。
关键原则: 审计数据应取自最近 7 天的峰值时段(如业务高峰期的 95 分位值),而非平均值。平均值会掩盖瞬时压力,导致升级期间资源争抢。
3.2 关键指标采集与分析方法
审计的核心是四个维度的指标:CPU、内存、Pod 数量、PVC 存储。每个维度都有其独特的采集命令、阈值判断逻辑和风险模式。
3.2.1 CPU 指标
| 指标项 | 采集命令/来源 | 关键阈值(参考) | 风险说明 |
|---|---|---|---|
| 节点 CPU 分配率 | kubectl describe node → Allocated resources |
> 80% 为警告,> 90% 为高风险 | 升级时 kubelet 与系统组件争抢 CPU |
| CPU Requests 总量 | kubectl get pods -A --no-headers | awk '{sum+=$2} END {print sum}' |
接近节点 Allocatable | 调度器无法为升级预留资源 |
| CPU 使用率峰值 | PromQL: rate(node_cpu_seconds_total{mode!="idle"}[5m]) |
> 85% 持续 10 分钟 | 节点过载,Pod 驱逐后可能雪崩 |
审计技巧: 使用
kubectl top node 获取实时 CPU 使用率,但注意该命令只反映瞬时值。建议结合 Prometheus 历史数据,取最近 7 天每天业务高峰期的 P95 值作为审计基准。
3.2.2 内存指标
| 指标项 | 采集命令/来源 | 关键阈值(参考) | 风险说明 |
|---|---|---|---|
| 节点内存分配率 | kubectl describe node → Allocated resources |
> 85% 为警告,> 95% 为高风险 | OOM Killer 可能触发,导致 Pod 被强制终止 |
| 内存 Limit 超配比 | kubectl get pods -A -o json | jq '.items[].spec.containers[].resources.limits.memory' |
Limit / Requests > 3 倍 | 超配过高,节点内存压力下 Limit 无法保障 |
| 系统预留内存 | kubectl describe node → System Reserved |
< 5% 总内存 | 系统组件(kubelet、容器运行时)可能无内存可用 |
3.2.3 Pod 数量指标
| 指标项 | 采集命令/来源 | 关键阈值(参考) | 风险说明 |
|---|---|---|---|
| 节点 Pod 密度 | kubectl get pods -A --field-selector spec.nodeName=<node> | wc -l |
接近节点 maxPods(通常 110/250) | 升级时 Pod 迁移无空闲槽位 |
| 集群 Pod 总数 | kubectl get pods -A --no-headers | wc -l |
接近集群 Pod CIDR 容量 | IP 地址耗尽,新 Pod 无法调度 |
| Endpoint 数量 | kubectl get endpoints -A --no-headers | wc -l |
> 5000 需关注 | 控制面 etcd 与 API Server 压力增大 |
3.2.4 PVC 存储指标
| 指标项 | 采集命令/来源 | 关键阈值(参考) | 风险说明 |
|---|---|---|---|
| PVC 使用率 | kubectl get pvc -A -o json | jq '.items[].status.capacity.storage' |
> 80% 需扩容 | 升级期间存储扩容可能失败,导致 Pod 挂载异常 |
| PV 绑定状态 | kubectl get pv → STATUS 列 |
存在 Pending 或 Failed 的 PV | 存储后端故障,升级后 PVC 无法绑定 |
| 存储类配额 | 云厂商或 CSI 驱动提供 | 接近配额上限 | 升级时无法创建新 PV,StatefulSet 扩容受阻 |
3.3 审计脚本示例
以下是一个简化的 Bash 审计脚本片段,用于快速采集节点级 CPU 和内存分配率:
#!/bin/bash
# cluster-audit.sh — 升级前资源审计快速扫描
echo "=== 节点资源分配率审计 ==="
kubectl get nodes --no-headers | awk '{print $1}' | while read node; do
alloc_cpu=$(kubectl describe node $node | grep "cpu" | head -1 | awk '{print $2}')
alloc_mem=$(kubectl describe node $node | grep "memory" | head -1 | awk '{print $2}')
req_cpu=$(kubectl describe node $node | grep "cpu" | tail -1 | awk '{print $2}')
req_mem=$(kubectl describe node $node | grep "memory" | tail -1 | awk '{print $2}')
echo "Node: $node | CPU Alloc: $alloc_cpu | CPU Req: $req_cpu | Mem Alloc: $alloc_mem | Mem Req: $req_mem"
done
echo ""
echo "=== Pod 数量统计 ==="
kubectl get pods -A --no-headers | wc -l
echo "=== PVC 状态检查 ==="
kubectl get pvc -A | grep -v "Bound"
注意: 审计脚本应在非生产环境或维护窗口执行,避免对 API Server 造成过大压力。对于大规模集群(节点数 > 100),建议使用 Prometheus 批量查询而非逐节点
describe。
3.4 审计结果解读与瓶颈判定
采集到指标后,需要根据以下规则判定瓶颈等级:
- 红色瓶颈(必须修复): 节点 CPU/Memory 分配率 > 90%,或 Pod 数量达到节点 maxPods 的 95%,或 PVC 使用率 > 90%。升级前必须扩容或迁移。
- 橙色瓶颈(建议修复): 节点 CPU/Memory 分配率 80%~90%,或内存 Limit 超配比 > 4 倍,或集群 Pod 总数接近 CIDR 容量的 80%。建议在升级窗口前优化。
- 黄色关注(持续监控): 节点分配率 70%~80%,或存在少量 Pending PVC。升级期间需重点观察,但不必阻塞升级。
实战建议: 将审计结果输出为 JSON 格式,集成到 CI/CD 流水线中。在升级前自动触发审计,若发现红色瓶颈则阻断升级流程,并通知 SRE 团队介入。这能有效避免“人肉审计”的遗漏和延迟。