您如何干净地列出kubernetes容器中的所有容器?


82

我正在寻找在运行测试后收集日志的脚本中列出吊舱中的所有容器。 kubectl describe pods -l k8s-app=kube-dns返回很多信息,但是我只是在寻找像这样的返回:

etcd
kube2sky
skydns

我看不到格式化描述输出的简单方法。还有其他命令吗?(我猜想最坏的情况是总是解析describe的输出)。

Answers:


57

您可以使用get带有--output-o)标志的支持的输出模板,并选择其中一种。

就拿jsonpath例如, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}给你etcd kube2sky skydns

其他受支持的输出输出模板是go-template,go-template-file,jsonpath-file。有关如何使用jsonpath模板,请参见http://kubernetes.io/docs/user-guide/jsonpath/。有关如何使用go模板的信息,请参见https://golang.org/pkg/text/template/#pkg-overview

更新:检查此文档以获取其他示例命令以列出容器图像:https : //kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/


3
如果要查看json输出,请使用kubectl get pods -o json
janetkuo 2015年

19
如果您使用的是特定的广告连播,则命令为kubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
Charles L.

65

回答

kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'

说明

这将获得表示容器的JSON对象。然后,它使用kubectl的JSONpath从pod中提取每个容器的名称。


27

快速破解,避免为单个pod构造JSONpath查询:

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]

这个答案正是它所说的..一个快速的黑客。真的很有用:)当然不能用于脚本之类的东西。它满足要求。
Rakesh N

最新一期也给双方containersinit containers

@Neo我init containers在v1.18.8上看不到这种方式:(
subtleseeker

10

我将一些想法汇总如下:

简单行:

kubectl get po -o jsonpath='{range .items[*]}{"pod: "}{.metadata.name}{"\n"}{range .spec.containers[*]}{"\tname: "}{.name}{"\n\timage: "}{.image}{"\n"}{end}'

拆分(出于可读性考虑):

kubectl get po -o jsonpath='
    {range .items[*]}
    {"pod: "}
    {.metadata.name}
    {"\n"}{range .spec.containers[*]}
    {"\tname: "}
    {.name}
    {"\n\timage: "}
    {.image}
    {"\n"}
    {end}'

@EzLo我不确定我是否更喜欢单行格式。我不喜欢滚动。
肖恩

您可以显示两种选择。如果需要,可以随时改回来。由于使用了代码排版,因此使用代码格式(CTRL + K)通常比引用(CTRL + Q)更好。
EzLo

有没有一种方法可以让我以这种格式列出每个容器的容器名称?
山姆·托马斯

为避免滚动和手动搜索的需要,请将其传送到less或传送到viCOMMAND | lessvi<(COMMAND)
Sergey Smolnikov,

在堆栈溢出时滚动@SergeySmolnikov
Shawn

7

如果您想清楚地输出每个Pod中的哪些容器

kubectl get po -l k8s-app=kube-dns \
   -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name

2

如果您将其json用作输出格式,则kubectl get可以获得的大量详细信息pod。使用json类似的处理器,jq您可以轻松选择或过滤您感兴趣的某些零件。

要列出容器的容器,jq查询如下所示:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq --raw-output '.items[].spec.containers[].name'

如果要查看有关一个特定容器的所有详细信息,请尝试以下操作:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq '.items[].spec.containers[] | select(.name=="etcd")'

1

我用它来显示豆荚上的图像版本。

kubectl get pods  -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{end}{end}' && printf '\n'

这只是对脚本的一小部分修改,添加了新行以新行上开始下一个控制台命令,在每行末尾删除了逗号,仅列出了我的Pod,没有服务Pod(例如,--all-namespaces选项被删除)。


0

使用以下命令查看特定容器的所有信息

kubectl get pod <pod name> -n <namespace name> -o yaml

0

要查看特定容器中所有容器的详细信息以及配置映射,请使用以下命令: kubectl describe pod/<pod name> -n <namespace name>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.