你如何清楚地列出 kubernetes pod 中的所有容器?

How do you cleanly list all the containers in a kubernetes pod?

我希望在 运行 测试后收集日志的脚本中列出 pod 中的所有容器。 kubectl describe pods -l k8s-app=kube-dns return 有很多信息,但我只是在寻找 return 比如:

etcd
kube2sky
skydns

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

您可以使用 get 并选择带有 --output (-o) 标志的受支持输出模板之一。

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

其他支持的output输出模板有go-template、go-template-file、jsonpath-file。请参阅 http://kubernetes.io/docs/user-guide/jsonpath/ for how to use jsonpath template. See https://golang.org/pkg/text/template/#pkg-overview 了解如何使用 go 模板。

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

如果您使用 json 作为 kubectl get you get plenty details of a pod. With json processors like jq 的输出格式,则很容易 select 或过滤您感兴趣的某些部分。

要列出 pod 的容器,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")'

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

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

回答

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

说明

这会获取表示广告连播的 JSON 对象。然后它使用 kubectl 的 JSONpath 从 pod 中提取每个容器的名称。

避免为单个 pod 构造 JSONpath 查询的快速技巧:

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

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

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

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

我把一些想法归纳如下:

简单的行:

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}'

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

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

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

使用以下命令:

kubectl get pods -o=custom-columns=PodName:.metadata.name,Containers:.spec.containers[*].name,Image:.spec.containers[*].image

了解 pod 中容器的最简单方法:

kubectl logs -c -n

如何列出所有 pods

的初始容器和非初始容器
kubectl get pod -o="custom-columns=NAME:.metadata.name,INIT-CONTAINERS:.spec.initContainers[*].name,CONTAINERS:.spec.containers[*].name"

输出如下所示:

NAME                                      INIT-CONTAINERS   CONTAINERS
helm-install-traefik-sjts9                <none>            helm
metrics-server-86cbb8457f-dkpqm           <none>            metrics-server
local-path-provisioner-5ff76fc89d-vjs6l   <none>            local-path-provisioner
coredns-6488c6fcc6-zp9gv                  <none>            coredns
svclb-traefik-f5wwh                       <none>            lb-port-80,lb-port-443
traefik-6f9cbd9bd4-pcbmz                  <none>            traefik
dc-postgresql-0                           init-chmod-data   dc-postgresql
backend-5c4bf48d6f-7c8c6                  wait-for-db       backend

要在单独的行中获取输出:

kubectl get pods POD_NAME_HERE -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'

输出: base-container
sidecar-0
sidecar-1
sidecar-2

有关 pod 的整体详细信息,请尝试使用以下命令来获取容器详细信息

kubectl describe pod <podname>