如何用Bash命令汇总Kubernetes中top pods的CPU和内存数值?
解决
k top pods -A输出的CPU/内存求和问题 当然可以用Bash命令完成求和,核心是处理表头行和数值单位两个问题,你之前的命令无效主要有三个原因:
- 没跳过表头行,表头字符串转数值为0
- 列位置选错了(CPU/内存不是第1列)
- 带单位的字符串直接累加会被awk识别为0
先看典型输出结构
k top pods -A的输出大概是这样:
NAMESPACE NAME CPU(cores) MEMORY(bytes) kube-system coredns-7f6cbbb7b8-2x7nr 1m 12Mi kube-system etcd-k8s-master 20m 300Mi default my-app-5f7d6c89d4-9zqzk 5m 80Mi
CPU在第3列(单位多为m,毫核),内存在第4列(单位可能是Ki/Mi/Gi)。
1. CPU求和(统一为毫核)
跳过表头,去掉m单位后累加:
k top pods -A | awk 'NR>1 {sub(/m$/,"",$3); total+=$3} END {print total "m (" total/1000 " cores)"}'
NR>1:跳过第一行表头sub(/m$/,"",$3):移除第3列末尾的m单位- 最后输出总毫核数,同时换算成核心数方便阅读
2. 内存求和(统一转换为Mi)
内存单位不统一,需要先转换为同一单位再累加:
k top pods -A | awk 'NR>1 { val = $4 if (val ~ /Gi$/) { sub(/Gi$/,"",val); total += val*1024 } else if (val ~ /Mi$/) { sub(/Mi$/,"",val); total += val } else if (val ~ /Ki$/) { sub(/Ki$/,"",val); total += val/1024 } else { total += val } } END { printf "%.2f Mi\n", total }'
- 自动识别
Gi/Mi/Ki单位,统一转为Mi计算 - 用
printf保留两位小数,输出更整洁
为什么你之前的命令没输出?
你的awk '{s+=$1}END{print s}'命令:
- 第1列是
NAMESPACE,全是字符串,awk会把字符串转为0累加,最终结果是0,可能你误以为无输出 - 就算跳过表头,第1列还是命名空间,不是CPU/内存数值,自然得不到正确结果
内容的提问来源于stack exchange,提问作者Ann Flus
相关产品推荐
相关产品推荐

