type
status
date
slug
summary
tags
category
icon
password
1. 需求
需要获取一份列表,包含k8s集群所有pod的资源请求和限制,这是明细表,用来评判pod请求资源的合理性。
不建议查询pod的字段信息,那样列表过于臃肿,可以查询deployment的字段,拿到replica字段。需要注意的是,deployment的container是list,故多容器的场景下,需要留意命令查出的信息是否有缺失。
2. 实现
2.1 基础实现
使用了jsonpath
说明:
不支持 JSONPath 正则表达式。如需使用正则表达式进行匹配操作,你可以使用如
jq
之类的工具。两次range循环,第一个range获取
.items[*]
,第二个range获取.spec.template.spec.containers[*]
。如果只有第一个range,那只会取第一个container的值。kubectl -n $ns get deployment -o=jsonpath='{range .items[*]}{.metadata.name}{","}{.spec.replicas}{","}{range .spec.template.spec.containers[*]}{.name}{","}{.resources.requests.cpu}{","}{.resources.limits.cpu}{","}{.resources.requests.memory}{","}{.resources.limits.memory}{"\n"}{end}{end}'
发现的问题:多容器时只有第一个容器行带有
.metadata.name
,如下,只有第一行带有.metadata.name
和.spec.replicas
demo-deployment-app-frontend,1,demo-container-app-frontend,200m,500m,200Mi,200Mi demo-filebeat-app-frontend,300m,500m,200Mi,200Mi
说明:
demo-deployment-app-frontend
是.metadata.name
- 一个pod内含两个容器:
demo-container-app-frontend
和demo-filebeat-app-frontend
2.2 优化
利用awk合并行的功能,
awk -F, '/demo-deployment/{T=$1;S=$2;print;next;}{print T","S","$0;}’
说明:匹配
demo-deployment
取出$1 $2字段并赋值,同时打印。不带demo-deployment
的行就跳过赋值,最后合并显示。结果样例:demo-deployment-app-frontend,1,demo-container-app-frontend,200m,500m,200Mi,200Mi demo-deployment-app-frontend,1,demo-filebeat-app-frontend,300m,500m,200Mi,200Mi