GPU 在我的 k8s 集群中资源有限,我想在整个集群中轻松定位这些 pod。
$ kubectl get pods -A -o jsonpath="{.items[*].spec['containers'][*].resources.requests}"
{"cpu":"2","memory":"20Gi","nvidia.com/gpu":"1"} {"cpu":"10m","memory":"40Mi"} {"cpu":"1","memory":"2Gi"}
对于这种情况,我如何找到这些资源的 Pod 列表
nvidia.com/gpu==1
我希望得到类似的输出
POD NAMESPACE GPU RESOURCE
aab abc 1
aab abb 2
我想可能是
--field-selector
或sed/awk
谢谢。
我认为你不能使用
kubectl
的 JSONPath 来做到这一点。
你可以使用任意数量的工具,但是,我对处理 JSON 的偏好是
jq
,它的优点是,一旦你学会了,例如jq
,你可以在任何需要处理JSON的地方使用它。
我无权访问集群,但我欺骗了 JSON 输出(希望正确),您应该能够使用:
FILTER
=
["Pod","Namespace","GPU"],
(
.items[]
|.metadata as $metadata
|.spec.containers[]
|.resources.requests as $requests
|select($r|has("nvidia.com/gpu"))
|[
$metadata.name,
$metadata.namespace,
.name,
$requests["nvidia.com/gpu"]
]
)|@tsv
kubectl get pods --all-namespaces --output=json \
jq -r "${FILTER}"
@tsv
将数组转换为表格(制表符分隔)["Pod",...]
items[].metadata
绑定到变量 $metadata
.resources.requests
绑定到 $request
$requests
的内容过滤
nvidia.com/gpu
$metadata
name
和 namespace
值.
) 范围的 name
(即容器的名称)$requests
字段的值nvidia.com/gpu