如何清楚地列出库伯内特豆荚中的所有容器?

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

etcd
kube2sky
skydns

我没有看到一个简单的方法来格式化描述输出。还有别的命令吗?(我想最糟糕的情况总是有解析的输出描述)。

176002 次浏览

您可以使用 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/

如果你使用 json作为 kubectl get的输出格式,你会得到 pod的大量细节。使用像 jq这样的 json处理器,可以很容易地选择或过滤您感兴趣的某些部分。

要列出一个吊舱的容器,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")'

如果你想要一个清晰的输出哪些容器来自每个吊舱

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

解释

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

避免为单个 pod 构造 JSONpath 查询的快速方法:

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

我用这个在吊舱上显示图像版本。

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

这只是对 给你脚本的一个小小的修改,添加了新行来在新行上启动下一个控制台命令,删除了每行末尾的逗号,只列出了我的 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}'

使用下面的命令可以查看特定吊舱的所有信息

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

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

Kubectl log-c-n

如何列出所有 pods 的 init 和非 init 容器

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

产出: 基座容器基座容器
Sidecar-0
Sidecar-1
Sidecar-2

有关吊舱的总体详细信息,请尝试以下命令以获取容器的详细信息

kubectl describe pod <podname>