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

Cha*_* L. 59 kubernetes

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

etcd
kube2sky
skydns
Run Code Online (Sandbox Code Playgroud)

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

jan*_*kuo 46

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

  • 如果您正在使用特定的pod,则命令为`kubectl get pods kube-dns-q2oh6 -o jsonpath = {.spec.containers [*].name} (13认同)
  • 如果要查看json输出,请使用`kubectl get pods -o json`. (3认同)

Cor*_*ein 40

回答

kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'
Run Code Online (Sandbox Code Playgroud)

说明

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

  • 对于那些想要在特定命名空间中运行此命令的人,请不要忘记在此命令中添加“--namespace”或“-n”。对于 ie (`kubectl -n YOUR_NAMESPACE get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'`) (5认同)

Paw*_*ski 24

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

kubectl get pod -o="custom-columns=NAME:.metadata.name,INIT-CONTAINERS:.spec.initContainers[*].name,CONTAINERS:.spec.containers[*].name"
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)


Bor*_*ard 17

快速入侵以避免为单个pod构建JSONpath查询:

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个。唯一的缺点是它不适用于具有单个容器的 Pod。它只是转储一个容器的日志。 (3认同)
  • 请注意,如果 pod 具有注释“kubectl.kubernetes.io/default-container”(或已弃用的注释“kubectl.kubernetes.io/default-logs-container”),则此快速破解不起作用...然后获取默认容器的日志。 (2认同)

小智 13

我将一些想法汇总为以下内容:

简单线:

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

拆分(为了可读性):

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


Bin*_*lin 11

要在单独的行中获取输出(初始化和非初始化容器):

kubectl get pods POD_NAME_HERE -o jsonpath='{range .spec.initContainers[*]}{.name}{"\n"}{end}{range .spec.containers[*]}{.name}{"\n"}{end}'
Run Code Online (Sandbox Code Playgroud)

输出:基础容器
sidecar-0
sidecar-1
sidecar-2


Gon*_*ora 5

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

kubectl get po -l k8s-app=kube-dns \
   -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name
Run Code Online (Sandbox Code Playgroud)


San*_*ora 5

使用以下命令:

kubectl get pods -o=custom-columns=PodName:.metadata.name,Containers:.spec.containers[*].name,Image:.spec.containers[*].image
Run Code Online (Sandbox Code Playgroud)