3. 瓶颈识别方法论:升级前资源审计的步骤、关键指标(CPU、内存、Pod数量、PVC存储)的采集与分析

集群升级前,资源审计是识别瓶颈、规避升级失败的核心前置动作。缺乏审计的升级如同“盲飞”——你可能在升级过程中遭遇 Pod 驱逐失败、节点压力超限、控制面组件 OOM 等连锁故障。本节将系统化拆解审计步骤与关键指标采集方法。

3.1 资源审计四步法

审计不是一次性快照,而是一个从“全局扫描”到“风险定位”的递进过程。推荐按以下四个步骤执行:

  1. 步骤一:集群级容量摸底 —— 获取集群总可分配资源(Allocatable)与当前请求量(Requests)的比值,判断整体水位。
  2. 步骤二:节点级压力扫描 —— 逐节点检查 CPU/Memory 的 Allocatable - Requests - Reserved 余量,标记压力节点。
  3. 步骤三:工作负载级细粒度分析 —— 按 Namespace/Deployment/StatefulSet 统计资源使用率与 Limit 配置,识别“资源黑洞”。
  4. 步骤四:存储与对象计数审计 —— 检查 PVC 容量、PV 绑定状态、Pod 总数与 Endpoint 数量,避免控制面过载。
关键原则: 审计数据应取自最近 7 天的峰值时段(如业务高峰期的 95 分位值),而非平均值。平均值会掩盖瞬时压力,导致升级期间资源争抢。
资源审计四步法流程 资源审计四步法流程 步骤一 集群级容量摸底 步骤二 节点级压力扫描 步骤三 工作负载级分析 步骤四 存储与对象计数审计 输出:资源审计报告 包含集群水位、节点压力列表、高风险工作负载、存储与对象计数瓶颈 审计数据源 kubectl top node / kubectl describe node / Prometheus + kube-state-metrics / 自定义审计脚本

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 扩容受阻
关键指标采集架构 关键指标采集架构 数据源层 kube-apiserver | kubelet / cAdvisor | Prometheus + kube-state-metrics | CSI 驱动 采集层 kubectl 命令 | PromQL 查询 | 自定义审计脚本(Python/Bash) | Kubernetes Metrics API CPU 指标 分配率 / 使用率 内存指标 分配率 / 超配比 Pod 数量指标 密度 / 总数 PVC 存储指标 使用率 / 绑定状态 输出:资源审计报告(含瓶颈清单与风险等级)

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 团队介入。这能有效避免“人肉审计”的遗漏和延迟。