【发布时间】:2016-02-28 16:43:38
【问题描述】:
我希望在运行测试后收集日志的脚本中列出 pod 中的所有容器。 kubectl describe pods -l k8s-app=kube-dns 返回很多信息,但我只是在寻找类似的返回:
etcd
kube2sky
skydns
我没有看到格式化描述输出的简单方法。还有其他命令吗? (我猜最坏的情况总是解析 describe 的输出)。
【问题讨论】:
标签: kubernetes
我希望在运行测试后收集日志的脚本中列出 pod 中的所有容器。 kubectl describe pods -l k8s-app=kube-dns 返回很多信息,但我只是在寻找类似的返回:
etcd
kube2sky
skydns
我没有看到格式化描述输出的简单方法。还有其他命令吗? (我猜最坏的情况总是解析 describe 的输出)。
【问题讨论】:
标签: kubernetes
kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'
这将获取代表 pod 的 JSON 对象。然后它使用 kubectl 的 JSONpath 从 pod 中提取每个容器的名称。
【讨论】:
您可以使用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/。参见https://golang.org/pkg/text/template/#pkg-overview 了解如何使用 go 模板。
更新:查看此文档以获取列出容器图像的其他示例命令:https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/
【讨论】:
kubectl get pods -o json。
kubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
避免为单个 pod 构建 JSONpath 查询的快速技巧:
$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]
【讨论】:
containers和init containers
init containers :(
我将一些想法汇总如下:
简单线:
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}'
【讨论】:
less 或 vi:COMMAND | less 或 vi<(COMMAND)
如果您想清楚地输出每个 Pod 中的哪些容器
kubectl get po -l k8s-app=kube-dns \
-o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name
【讨论】:
如果您使用json 作为kubectl get 的输出格式,您将获得pod 的大量详细信息。使用json 处理器,如jq,可以轻松选择或过滤您感兴趣的某些部分。
要列出 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 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 get pod <pod name> -n <namespace name> -o yaml
【讨论】:
我使用它在 pod 上显示图像版本。
kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{end}{end}' && printf '\n'
这只是对 here 脚本的一个小修改,添加新行以在新行上启动下一个控制台命令,删除每行末尾的逗号并仅列出我的 pod,没有服务 pod(例如 @987654323 @ 选项被移除)。
【讨论】:
如何列出所有 pod 的初始化和非初始化容器
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}'
输出:
基础容器
边车-0
边车-1
sidecar-2
【讨论】:
了解 pod 中容器的最简单方法:
kubectl 日志 -c -n
【讨论】: