列出集群中运行的所有容器镜像

本页面介绍如何使用 kubectl 列出集群中运行的所有 Pod 的容器镜像。

准备工作

您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在本教程中使用一个至少有两个节点且不充当控制平面主机的集群。如果您还没有集群,可以使用 minikube 创建一个,或者使用以下 Kubernetes 游乐场之一:

要检查版本,请输入 kubectl version

在本练习中,您将使用 kubectl 获取集群中运行的所有 Pod,并格式化输出以提取每个 Pod 的容器列表。

列出所有命名空间中的所有容器镜像

  • 使用 kubectl get pods --all-namespaces 获取所有命名空间中的所有 Pod。
  • 使用 -o jsonpath={.items[*].spec['initContainers', 'containers'][*].image} 将输出格式化,使其仅包含容器镜像名称列表。这将递归地从返回的 JSON 中解析出 image 字段。
  • 使用标准工具格式化输出:trsortuniq
    • 使用 tr 将空格替换为换行符。
    • 使用 sort 对结果进行排序。
    • 使用 uniq 汇总镜像计数。
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec['initContainers', 'containers'][*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

jsonpath 的解释如下:

  • .items[*]:针对每个返回值
  • .spec:获取规范
  • ['initContainers', 'containers'][*]:针对每个容器
  • .image:获取镜像

按 Pod 列出容器镜像

可以使用 range 操作单独迭代元素来进一步控制格式。

kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
sort

通过 Pod 标签过滤列出容器镜像

要仅定位与特定标签匹配的 Pod,请使用 -l 标志。以下内容仅匹配标签与 app=nginx 匹配的 Pod。

kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx

通过 Pod 命名空间过滤列出容器镜像

要仅定位特定命名空间中的 pod,请使用 namespace 标志。以下内容仅匹配 kube-system 命名空间中的 Pod。

kubectl get pods --namespace kube-system -o jsonpath="{.items[*].spec.containers[*].image}"

使用 go-template 而不是 jsonpath 列出容器镜像

作为 jsonpath 的替代方案,kubectl 支持使用 go-templates 来格式化输出。

kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}"

后续步骤

参考

上次修改时间:2023 年 6 月 19 日下午 3:16 PST:更新 list-all-running-container-images.md (512b71177c)