【问题标题】:How do you cleanly list all the containers in a kubernetes pod?您如何干净地列出 kubernetes pod 中的所有容器?
【发布时间】:2016-02-28 16:43:38
【问题描述】:

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

etcd
kube2sky
skydns

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

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    回答

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

    说明

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果要查看json输出,请使用kubectl get pods -o json
      • 如果您正在使用特定的 pod,则命令为 kubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
      • OP 是针对一个特定的 pod
      【解决方案3】:

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

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

      【讨论】:

      • 这个答案正是它所说的......快速破解。真的很有用:) 当然不能在脚本之类的东西中使用。它满足要求。
      • 最新的还给containersinit containers
      • @Neo 我在 v1.18.8 上看不到 init containers :(
      • 我喜欢这个。唯一的缺点是它不适用于具有单个容器的 pod。它只是转储一个容器的日志。
      【解决方案4】:

      我将一些想法汇总如下:

      简单线:

      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) 更好,因为代码的排版。
      • 有没有办法以这种格式列出每个容器的 pod 名称?
      • 为了避免滚动和手动搜索 - 将其通过管道传送到 lessviCOMMAND | lessvi<(COMMAND)
      • 滚动堆栈溢出@SergeySmolnikov
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        如果您使用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")'
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            使用以下命令:

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                【解决方案10】:

                我使用它在 pod 上显示图像版本。

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

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

                【讨论】:

                  【解决方案11】:

                  如何列出所有 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
                  

                  【讨论】:

                    【解决方案12】:

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

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

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

                    【讨论】:

                      【解决方案13】:

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

                      kubectl 日志 -c -n

                      【讨论】:

                      • 注意:非常简短的答案和/或回帖者的问题可能应该是 cmets。你只需要 50 个代表点就可以在一个问题下发表评论 - 你能把它移到那里吗?
                      • 我收到响应错误:预期的“日志 [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]”。 POD 或 TYPE/NAME 是 logs 命令的必需参数。有关帮助和示例,请参阅“kubectl logs -h”
                      猜你喜欢
                      • 2020-10-15
                      • 2019-07-21
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-09-14
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多