在kubernetes中列出每个命名空间的pod



我的集群中有几个名称空间,我想要一个类似的日志

NAMESPACE            NAME                                          PODS  
MY_NAMESPACE         my_ns6446f67599-25g7f                         10   

您也可以尝试这一行:

kubectl get pods --all-namespaces | awk '{print $1}' | sort | uniq -c | sort -k1 -n -r

哪个将产生:

136 some-ns
133 kube-system
119 other-ns

解释一下:

  • kubectl get pods --all-namespaces将在第一列中列出所有具有命名空间的pod
  • CCD_ 2将";过滤掉";作为命名空间的第一列
  • sort将按字母顺序对名称空间的名称进行排序
  • uniq -c将计算每个命名空间出现的次数,并将计数聚合为第一列(例如,136 some-ns意味着some-ns出现136次(
  • sort -k1 -n -r这一个将从出现最多(即具有最多pod(的命名空间排序到出现最少的命名空间。-k1表示我使用第一列进行排序,-n表示我使用数字比较,-r表示我正在进行反向排序

您可以使用--all-namespaces标志来获取pod。

kubectl get pods --all-namespaces

从您的输出中,您似乎正在尝试打印replicaset,因为输出中有一个POD计数列。

kubectl get replicaset --all-namespaces

如果您想限制结果列,我们可以使用--0 custom-columns=参数,如下所示。

$ kubectl get replicaset --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,PODS:.status.replicas     
NAMESPACE            NAME                                          PODS  
MY_NAMESPACE         my_ns6446f67599-25g7f                         10  

此解决方案结合了kubectl get podskubectl get namespaces的json输出,以便还显示未部署pod的命名空间。

kubectl get pods -o json --all-namespaces | jq --argjson ns "$(kubectl get namespaces -o json)" '.items | group_by(.metadata.namespace) | map({namespace: .[].metadata.namespace, count: . | length}) | . += ($ns.items | map({namespace: .metadata.name, count: 0})) | unique_by(.namespace) | sort_by(.count)'

该解决方案提供了一个json对象数组,这些对象按pod的数量升序排序,并且可以很容易地进行扩展以获得所需的输出。

";魔术;当我们将包含名称空间的$ns变量的内容添加到计数为0的数组末尾时,就会发生这种情况。如果以前已经找到了命名空间(这意味着它包含pod(,unique_by将丢弃这些条目。

注意:该解决方案依赖于jq的unique_by函数来丢弃具有相同键值的对象的第二次出现,对于文档来说,这是不允许的,但它恰好是以这种方式实现的。

相关内容

最新更新