如何用kubectl jsonpath按容器拆分Pod资源请求/限制输出?
解决Kubectl输出Pod容器资源请求/限制时每行对应单个容器的问题
你需要调整kubectl jsonpath的循环嵌套逻辑,把Pod的命名空间和名称放到容器的循环体内,这样每个容器都会单独生成一行包含所属Pod信息的记录。
修正后的命令
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{range .spec.containers[*]}{@.metadata.namespace}{","}{@.metadata.name}{","}{.name}{","}{@.resources.requests.cpu}{","}{@.resources.requests.memory}{","}{@.resources.limits.cpu}{","}{@.resources.limits.memory}{"\n"}{end}{end}'
命令说明
- 外层
{range .items[*]}遍历集群内所有Pod - 内层
{range .spec.containers[*]}遍历当前Pod下的每个容器 - 每次遍历容器时,先输出Pod的命名空间、Pod名称,再输出当前容器的名称和资源请求/限制参数,最后换行
- 移除了原命令中多余的转义引号,直接用英文逗号分隔字段更简洁
示例输出
kube-system,metrics-server-5f8d84558d-g926z,metrics-server-vpa,5m,30Mi,100m,300Mi kube-system,metrics-server-5f8d84558d-g926z,metrics-server,46m,63Mi,46m,63Mi
可选优化:处理空资源配置
如果存在容器未设置requests或limits的情况,可以用jsonpath默认值语法避免输出空值,比如:
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{range .spec.containers[*]}{@.metadata.namespace}{","}{@.metadata.name}{","}{.name}{","}{@.resources.requests.cpu:''}{","}{@.resources.requests.memory:''}{","}{@.resources.limits.cpu:''}{","}{@.resources.limits.memory:''}{"\n"}{end}{end}'
这里{@.resources.requests.cpu:''}表示如果该字段不存在,就输出空字符串。
内容的提问来源于stack exchange,提问作者eak3
相关产品推荐
相关产品推荐

