如何基于NAME列合并两个kubectl命令的输出列数据
Kubernetes按Pod名称合并实时资源与资源限制输出方案
实现思路
两份输出的公共关联键为NAME列,通过Linux原生命令即可完成字段关联,无需安装额外工具:
- 先分别过滤两份kubectl命令的输出,去掉冗余表头,提取需要的字段
- 以NAME列为键做内连接,匹配两份数据的对应行
- 格式化对齐输出最终结果
操作方法
单条命令直接输出(推荐)
直接通过进程传递两份命令的输出,不生成临时文件,执行后直接得到对齐的合并结果:
# 输出表头 echo -e "NAME\tCPU(cores)\tMEMORY(bytes)\tCPULIM\tMEMLIM" # 关联两份数据并自动对齐列 join \ <(kubectl top pods | tail -n +3 | awk '{print $1, $2, $3}' | sort) \ <(kubectl get pods -o=custom-columns='NAME:metadata.name,CPULIM:spec.containers[*].resources.limits.cpu,MEMLIM:spec.containers[*].resources.limits.memory' | tail -n +3 | awk '{print $1, $2, $3}' | sort) \ | column -t
执行后的输出格式和预期完全一致:
NAME CPU(cores) MEMORY(bytes) CPULIM MEMLIM am-cbkc-plugin-55b9df956f-sh82g 3m 923Mi 1 2Gi amd-apigw-stack-6df456664f-sbdvc 3m 491Mi 550m 4Gi
临时文件分步实现(便于调试)
如果需要中途校验数据准确性,可以先把两份输出存为临时文件再做合并:
# 提取实时资源数据,跳过表头行 kubectl top pods | tail -n +3 | awk '{print $1, $2, $3}' | sort > top_res.tmp # 提取资源限制数据,跳过表头行 kubectl get pods -o=custom-columns='NAME:metadata.name,CPULIM:spec.containers[*].resources.limits.cpu,MEMLIM:spec.containers[*].resources.limits.memory' | tail -n +3 | awk '{print $1, $2, $3}' | sort > limit_res.tmp # 打印表头+合并输出 echo -e "NAME\tCPU(cores)\tMEMORY(bytes)\tCPULIM\tMEMLIM" join top_res.tmp limit_res.tmp | column -t # 清理临时文件 rm *.tmp
注意事项:
- 命令中
tail -n +3是跳过kubectl命令输出的前置空行和表头行,如果你的kubectl版本输出格式有差异,可以先单独执行kubectl命令数清楚表头占几行,调整tail的参数即可- 多容器Pod的CPULIM、MEMLIM字段会按容器顺序用逗号分隔多个值,属于正常输出
- 如果Pod名称包含特殊空白字符,需要调整awk的字段截取规则,适配实际场景
内容的提问来源于stack exchange,提问作者Tom S
相关产品推荐
相关产品推荐

