JQ筛选特定容器CPU值问题:如何仅获取mysql容器的CPU限制值
精准筛选指定Pod中特定容器的CPU限制值
你的语法误区
你当前命令中对容器数组的筛选逻辑错误:
.spec.containers | select(.[].name=="sidecar" | not )
.[].name会遍历所有容器的名称,返回一个布尔值数组(示例中会返回[true, false]),| not会将整个数组的结果取反得到[false, true],但select()是对整个容器数组进行判断,只要数组存在满足条件的元素,就会保留完整数组。因此最终你还是拿到了包含sidecar和mysql的全部容器,后续遍历数组时,sidecar容器因无resources.limits.cpu字段输出null,mysql容器输出目标值2100m。
正确命令及解释
方法一:遍历容器时直接筛选
jq -r --arg _NAME "mysql-innodb-cluster-0" '.items[] | select(.metadata.name == $_NAME) | .spec.containers[] | select(.name == "mysql") | .resources.limits.cpu' /tmp/test.json
每一步作用:
.items[]:遍历List中的所有Pod条目select(.metadata.name == $_NAME):筛选出名称匹配的目标Pod.spec.containers[]:遍历该Pod下的所有容器select(.name == "mysql"):精准筛选出名为mysql的容器.resources.limits.cpu:提取该容器的CPU限制值
方法二:先过滤容器数组再取值
也可以用map()先过滤容器数组,再提取目标值:
jq -r --arg _NAME "mysql-innodb-cluster-0" '.items[] | select(.metadata.name == $_NAME) | .spec.containers | map(select(.name == "mysql"))[0].resources.limits.cpu' /tmp/test.json
map(select(.name == "mysql")):将容器数组过滤为仅包含mysql容器的数组[0]:取过滤后数组的第一个(也是唯一一个)元素.resources.limits.cpu:提取CPU限制值
两种方法执行后都会输出预期结果:2100m
内容的提问来源于stack exchange,提问作者user3008410
相关产品推荐
相关产品推荐

