当前位置: 首页 > news >正文

在运维工作中,如何一键式统计整个k8s集群cpu、内存总大小?总使用率?还剩余多少?

  • ✅ CPU 和内存:总容量(Total)
  • ✅ CPU 和内存:已请求资源(Used for Scheduling)
  • ✅ CPU 和内存:剩余可用资源(Available)

1、脚本功能说明

  • 基于 kubectl describe nodes 解析数据
  • 支持 m(millicores)、KiMiGi 单位自动转换
  • 输出清晰:总大小、已用、剩余、使用率
  • 无需额外依赖,只需 kubectl 配置好上下文

2、一键统计脚本(保存为 k8s-resource-summary.sh

#!/bin/bash# k8s-resource-summary.sh
# 一键统计 K8s 集群 CPU 和内存:总量、已用、剩余set -euo pipefailecho "📊 正在统计 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" ]; thenecho "❌ 错误:无法获取节点列表,请检查 kubectl 配置。"exit 1
fiecho "✅ 共发现 $(echo $nodes | wc -w) 个节点:$nodes"
echo# 遍历每个节点
for node in $nodes; doecho "🔍 节点: $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"* ]]; thencpu_cap_num=$(echo "$cpu_cap" | sed 's/m//')cpu_cap_cores=$(echo "scale=3; $cpu_cap_num / 1000" | bc -l)elsecpu_cap_cores=$cpu_capfi# 转换 Memory 容量为 MiBif [[ "$mem_cap" == *"Ki"* ]]; thenmem_cap_mib=$(echo "$mem_cap" | sed 's/Ki//' | awk '{print $1/1024}')elif [[ "$mem_cap" == *"Mi"* ]]; thenmem_cap_mib=$(echo "$mem_cap" | sed 's/Mi//')elif [[ "$mem_cap" == *"Gi"* ]]; thenmem_cap_mib=$(echo "$mem_cap" | sed 's/Gi//' | awk '{print $1*1024}')elsemem_cap_mib=0fi# 获取 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"* ]]; thencpu_req_cores=$(echo "$(echo "$cpu_req_val" | sed 's/m//') / 1000" | bc -l)elsecpu_req_cores=$cpu_req_valfi# 提取 Memory Requests 并转为 MiBmem_req_val=$(echo "$mem_req_line" | awk '{print $2}' | sed 's/(.*%)//')if [[ "$mem_req_val" == *"Ki"* ]]; thenmem_req_mib=$(echo "$mem_req_val" | sed 's/Ki//' | awk '{print $1/1024}')elif [[ "$mem_req_val" == *"Mi"* ]]; thenmem_req_mib=$(echo "$mem_req_val" | sed 's/Mi//')elif [[ "$mem_req_val" == *"Gi"* ]]; thenmem_req_mib=$(echo "$mem_req_val" | sed 's/Gi//' | awk '{print $1*1024}')elsemem_req_mib=0fi# 累加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))%"echoecho "内存总容量:     $(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、使用方法

  1. 保存脚本

    nano k8s-resource-summary.sh
    

    粘贴上述内容并保存。

  2. 添加可执行权限

    chmod +x k8s-resource-summary.sh
    
  3. 运行脚本

    ./k8s-resource-summary.sh
    

4、示例输出

📊 正在统计 Kubernetes 集群资源使用情况...
--------------------------------------------------
✅ 共发现 2 个节点:node-1 node-2🔍 节点: node-1CPU 容量: 2.000 cores内存容量: 4096.00 MiBCPU 已请求: 0.800 cores内存已请求: 1536.00 MiB🔍 节点: node-2CPU 容量: 4.000 cores内存容量: 8192.00 MiBCPU 已请求: 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,可能影响统计,请确保节点正常。

http://www.zskr.cn/news/26137.html

相关文章:

  • Giants Shoulder - Hyrix: LPDDR5 Commands New Features - 实践
  • 国内开发者如何选择代码托管平台?深度解析主流平台优劣势
  • 2025年中国国际健康营养博览会(NHNE):深度盘点全球展品与政策风向
  • 2025年10月中国遗产继承律师推荐榜:北京盈科陈珊珊领衔五强对比
  • 2025年10月小红书代理商实力榜:五家对比评测与避坑指南
  • P1725 琪露诺 解题笔记
  • 【电商行业案例】基于Vaadin全栈Java框架,打造百万级订单的B2B电商SaaS平台
  • 【触想智能】什么是人脸识别一体机,人脸识别一体机主要应用于哪些领域?
  • WPF使用MediaCapture开发相机应用(二、相机预览优化)
  • 自己动手做一款ChatExcel数据分析系统,智能分析 Excel 数据
  • 2025年10月无缝钢管推荐榜:五强对比评测与采购指南
  • 实用指南:构建AI智能体:五十二、反应式智能体:AI世界的条件反射,真的可以又快又稳
  • 微信小程序使用formdata采用multipart方式上传文件
  • 中国项目管理工具市场迎来技术驱动新纪元:Gitee引领双核协作革命
  • 中国企业DevOps工具链选型指南:政务、出海与跨国协作的实战解析
  • 数字媒体技术-培优讲练-知识点总结
  • Jmeter解决响应乱码的问题
  • 实用指南:计算机毕业设计Python农作物产量预测分析 农作物爬虫 农产品可视化 农产品推荐系统 机器学习 深度学习 大数据毕业设计(源码+LW文档+PPT+详细讲解)
  • 告别客服焦虑!用PandaWiki打造724小时AI在线客服
  • Jmeter解决临界部分控制器,锁限流的问题
  • Docker Compose v2.35.1 更新!
  • 【完整源码+数据集+部署教程】医疗设备显示器图像分割系统: yolov8-seg-C2f-SCConv - 详解
  • 2025 年容器 / 结构 / 不锈钢 / 金属 / 过滤器铆焊厂家推荐北京大疆实业:精密制造与全链条服务的实践样本
  • 2025年10月销量第一证明机构推荐榜:尚普与华信人权威对比
  • 国产代码托管平台Gitee的崛起:为何越来越多人选择它而非GitHub?
  • 2025年10月留香沐浴露对比榜:蓝蕨经典香型与四款热门香型横评
  • 2025 最新土工膜生产厂家推荐榜权威发布:聚焦 50 年寿命与 28MPa 强度,涵盖防渗 / HDPE / 复合等全品类标杆企业
  • 使用rabbitmq 进行任务调度
  • byte[](字节数组)
  • 【转】[C#] 要从接口取时间,单个订单查询和批量查询,写一个接口还是两个接口合适?