#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_k8s_resource_skew.sh
# 功能描述: 自动比对 K8s 节点的真实物理 CPU 负载与账面 Requests 分配率 (纯只读)
# 依赖工具: kubectl, awk (需集群已安装 metrics-server)
# ==============================================================================
set -o pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
echo -e "${BLUE}================================================================================================${PLAIN}"
echo -e "${BLUE} K8S 节点资源账实背离度 (真实负载 vs 账面分配) 自动化巡检 ${PLAIN}"
echo -e "${BLUE}================================================================================================${PLAIN}"
# 1. 检查指标采集基础组件
if ! kubectl top nodes &>/dev/null; then
echo -e "${RED}[FATAL] 无法获取真实负载指标,请确认集群已安装并正常运行 metrics-server。${PLAIN}"
exit 1
fi
# 修复了 printf 表头的 \% 和 \vert{} 乱码
printf "${YELLOW}%-25s | %-18s | %-26s | %s${PLAIN}\n" "节点名称 (Node)" "物理 CPU 实际使用" "账面 CPU 已分配 (Requests)" "调度健康度诊断"
echo -e "------------------------------------------------------------------------------------------------"
# 获取所有节点名称
NODES=$(kubectl get nodes -o jsonpath='{.items[*].metadata.name}')
for node in $NODES; do
# 提取真实物理 CPU 使用率 (%)
REAL_CPU_PCT=$(kubectl top node "$node" --no-headers 2>/dev/null | awk '{print $3}' | tr -d '%')
# 提取账面 CPU Requests 申请率 (%)
ALLOC_CPU_PCT=$(kubectl describe node "$node" 2>/dev/null | grep -A 5 "Allocated resources" | awk '$1 == "cpu" {print $3}' | tr -d '(%)')
# 处理空白或非数字情况
if [[ ! "$REAL_CPU_PCT" =~ ^[0-9]+$ ]]; then REAL_CPU_PCT=0; fi
if [[ ! "$ALLOC_CPU_PCT" =~ ^[0-9]+$ ]]; then ALLOC_CPU_PCT=0; fi
# 诊断逻辑判定
if [ "$REAL_CPU_PCT" -gt 85 ] && [ "$ALLOC_CPU_PCT" -lt 40 ]; then
DIAGNOSIS="${RED}[高危倾斜] 物理负载极高但账面空闲!未配 Requests 的业务易引发节点过载!${PLAIN}"
elif [ "$REAL_CPU_PCT" -lt 20 ] && [ "$ALLOC_CPU_PCT" -gt 80 ]; then
DIAGNOSIS="${YELLOW}[配额虚占] 物理负载极低但账面已满!高 requests 闲置业务阻断新 Pod 调度。${PLAIN}"
else
DIAGNOSIS="${GREEN}[正常] 账面分配与实际物理负载基本相符。${PLAIN}"
fi
# 格式化输出对齐 (%b 支持解析颜色转义序列)
# 修复了末尾分配率参数的 \% 乱码
printf "%-25s | %-18s | %-26s | %b\n" "$node" "${REAL_CPU_PCT}%" "${ALLOC_CPU_PCT}%" "$DIAGNOSIS"
done
echo -e "\n${BLUE}================================================================================================${PLAIN}"
echo -e "${BLUE}排障建议:针对标红的高危节点,请立刻排查并执行 cordon 隔离,强制业务 Pod 规范配置 requests 参数。${PLAIN}"
echo -e "${BLUE}架构演进:建议部署 Koordinator 或 Trimaran 等动态负载调度插件接管原生 kube-scheduler。${PLAIN}"
echo -e "${BLUE}================================================================================================${PLAIN}"