在运维工作中,如何一键式统计整个k8s集群cpu、内存总大小?总使用率?还剩余多少?
- ✅ CPU 和内存:总容量(Total)
- ✅ CPU 和内存:已请求资源(Used for Scheduling)
- ✅ CPU 和内存:剩余可用资源(Available)
1、脚本功能说明
- 基于
kubectl describe nodes解析数据 - 支持
m(millicores)、Ki、Mi、Gi单位自动转换 - 输出清晰:总大小、已用、剩余、使用率
- 无需额外依赖,只需
kubectl配置好上下文
2、一键统计脚本(保存为 k8s-resource-summary.sh)
#!/bin/bash
# k8s-resource-summary.sh
# 一键统计 K8s 集群 CPU 和内存:总量、已用、剩余
set -euo pipefail
echo "📊 正在统计 Kubernetes 集群资源使用情况..."
echo "--------------------------------------------------"
# 初始化变量
total_cpu_capacity=0
total_mem_capacity=0
total_cpu_requests=0
total_mem_requests=0
# 获取所有节点名称
nodes=$(kubectl get nodes -o jsonpath='{.items[*].metadata.name}')
if [ -z "$nodes" ]; then
echo "❌ 错误:无法获取节点列表,请检查 kubectl 配置。"
exit 1
fi
echo "✅ 共发现 $(echo $nodes | wc -w) 个节点:$nodes"
echo
# 遍历每个节点
for node in $nodes; do
echo "🔍 节点: $node"
# 获取 Capacity(总容量)
cpu_cap=$(kubectl get node "$node" -o jsonpath='{.status.capacity.cpu}' 2>/dev/null || echo 0)
mem_cap=$(kubectl get node "$node" -o jsonpath='{.status.capacity.memory}' 2>/dev/null || echo 0)
# 转换 CPU 容量为 cores(支持 m 和纯数字)
if [[ "$cpu_cap" == *"m"* ]]; then
cpu_cap_num=$(echo "$cpu_cap" | sed 's/m//')
cpu_cap_cores=$(echo "scale=3; $cpu_cap_num / 1000" | bc -l)
else
cpu_cap_cores=$cpu_cap
fi
# 转换 Memory 容量为 MiB
if [[ "$mem_cap" == *"Ki"* ]]; then
mem_cap_mib=$(echo "$mem_cap" | sed 's/Ki//' | awk '{print $1/1024}')
elif [[ "$mem_cap" == *"Mi"* ]]; then
mem_cap_mib=$(echo "$mem_cap" | sed 's/Mi//')
elif [[ "$mem_cap" == *"Gi"* ]]; then
mem_cap_mib=$(echo "$mem_cap" | sed 's/Gi//' | awk '{print $1*1024}')
else
mem_cap_mib=0
fi
# 获取 Allocatable Resources 中的 Requests(调度已分配)
requests=$(kubectl describe node "$node" | grep -A5 "Allocated resources:" | grep "cpu\|memory" | head -2)
cpu_req_line=$(echo "$requests" | grep "cpu")
mem_req_line=$(echo "$requests" | grep "memory")
# 提取 CPU Requests(如 100m 或 0.1)
cpu_req_val=$(echo "$cpu_req_line" | awk '{print $2}' | sed 's/(.*%)//')
if [[ "$cpu_req_val" == *"m"* ]]; then
cpu_req_cores=$(echo "$(echo "$cpu_req_val" | sed 's/m//') / 1000" | bc -l)
else
cpu_req_cores=$cpu_req_val
fi
# 提取 Memory Requests 并转为 MiB
mem_req_val=$(echo "$mem_req_line" | awk '{print $2}' | sed 's/(.*%)//')
if [[ "$mem_req_val" == *"Ki"* ]]; then
mem_req_mib=$(echo "$mem_req_val" | sed 's/Ki//' | awk '{print $1/1024}')
elif [[ "$mem_req_val" == *"Mi"* ]]; then
mem_req_mib=$(echo "$mem_req_val" | sed 's/Mi//')
elif [[ "$mem_req_val" == *"Gi"* ]]; then
mem_req_mib=$(echo "$mem_req_val" | sed 's/Gi//' | awk '{print $1*1024}')
else
mem_req_mib=0
fi
# 累加
total_cpu_capacity=$(echo "$total_cpu_capacity + $cpu_cap_cores" | bc -l)
total_mem_capacity=$(echo "$total_mem_capacity + $mem_cap_mib" | bc -l)
total_cpu_requests=$(echo "$total_cpu_requests + $cpu_req_cores" | bc -l)
total_mem_requests=$(echo "$total_mem_requests + $mem_req_mib" | bc -l)
echo " CPU 容量: ${cpu_cap_cores} cores"
echo " 内存容量: $(printf "%.2f" $mem_cap_mib) MiB"
echo " CPU 已请求: ${cpu_req_cores} cores"
echo " 内存已请求: $(printf "%.2f" $mem_req_mib) MiB"
echo
done
# 计算剩余
remaining_cpu=$(echo "$total_cpu_capacity - $total_cpu_requests" | bc -l)
remaining_mem=$(echo "$total_mem_capacity - $total_mem_requests" | bc -l)
# 格式化输出
format_float() {
printf "%.2f" "$1"
}
echo "📈 集群资源汇总:"
echo "--------------------------------------------------"
echo "CPU 总容量: $(format_float $total_cpu_capacity) cores"
echo "CPU 已请求: $(format_float $total_cpu_requests) cores"
echo "CPU 剩余: $(format_float $remaining_cpu) cores"
echo "CPU 使用率: $(format_float $(echo "$total_cpu_requests * 100 / $total_cpu_capacity" | bc -l))%"
echo
echo "内存总容量: $(format_float $total_mem_capacity) MiB ($(format_float $(echo "$total_mem_capacity / 1024" | bc -l)) GiB)"
echo "内存已请求: $(format_float $total_mem_requests) MiB ($(format_float $(echo "$total_mem_requests / 1024" | bc -l)) GiB)"
echo "内存剩余: $(format_float $remaining_mem) MiB ($(format_float $(echo "$remaining_mem / 1024" | bc -l)) GiB)"
echo "内存使用率: $(format_float $(echo "$total_mem_requests * 100 / $total_mem_capacity" | bc -l))%"
echo
echo "✅ 统计完成!"
3、使用方法
-
保存脚本:
nano k8s-resource-summary.sh粘贴上述内容并保存。
-
添加可执行权限:
chmod +x k8s-resource-summary.sh -
运行脚本:
./k8s-resource-summary.sh
4、示例输出
📊 正在统计 Kubernetes 集群资源使用情况...
--------------------------------------------------
✅ 共发现 2 个节点:node-1 node-2
🔍 节点: node-1
CPU 容量: 2.000 cores
内存容量: 4096.00 MiB
CPU 已请求: 0.800 cores
内存已请求: 1536.00 MiB
🔍 节点: node-2
CPU 容量: 4.000 cores
内存容量: 8192.00 MiB
CPU 已请求: 1.200 cores
内存已请求: 2048.00 MiB
📈 集群资源汇总:
--------------------------------------------------
CPU 总容量: 6.00 cores
CPU 已请求: 2.00 cores
CPU 剩余: 4.00 cores
CPU 使用率: 33.33%
内存总容量: 12288.00 MiB (12.00 GiB)
内存已请求: 3584.00 MiB (3.50 GiB)
内存剩余: 8704.00 MiB (8.50 GiB)
内存使用率: 29.17%
✅ 统计完成!
5、注意事项
- 需要安装
bc工具(用于浮点计算):# Ubuntu/Debian sudo apt-get install bc # CentOS/RHEL sudo yum install bc - 脚本基于
requests(调度分配),不是limits或实际使用量(kubectl top)。 - 如果节点 NotReady,可能影响统计,请确保节点正常。

浙公网安备 33010602011771号