🗒️kubectl获取deployment的request.cpu
2023-5-15
| 2023-5-17
0  |  0 分钟
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-frontenddemo-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
技术
  • k8s
  • 运维的价值k8s kube-proxy的模式
    目录