如何列出所有在k8s(如gpu)中请求特殊资源的pod

问题描述 投票:0回答:1

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

谢谢。

gpu kubectl
1个回答
0
投票

我认为你不能使用

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}"
说明
  1. @tsv
    将数组转换为表格(制表符分隔)
  2. 我们输出一个数组的数组:
    • 第一个数组是标题
      ["Pod",...]
    • 第二个数组是剩余过滤器的输出
  3. 我们将
    items[].metadata
    绑定到变量
    $metadata
  4. 我们的范围为`items[].spec.containers[]
  5. 然后我们将
    .resources.requests
    绑定到
    $request
  6. 我们仅通过包含
    $requests
     的内容过滤 
    nvidia.com/gpu
  7. 然后我们输出一个数组,其中包括:
    • $metadata
      name
      namespace
    • 当前 (
      .
      ) 范围的
      name
      (即容器的名称)
    • $requests
      字段的值
      nvidia.com/gpu
© www.soinside.com 2019 - 2024. All rights reserved.