k8s-列出在集群中运行的容器镜像

本篇文字中,你将使用kubectl来获取集群中运行的所有的Pods,并且格式化输出。

列出所有namespaces中的容器

  • 使用 kubectl get pods --all-namespaces命令获取所有namespace中的Pods
~> kubectl get pods --all-namespaces
NAMESPACE     NAME                          READY     STATUS    RESTARTS   AGE
kube-system   kube-addon-manager-minikube   1/1       Running   2          18h
kube-system   kube-dns-v20-8rz57            3/3       Running   6          18h
kube-system   kubernetes-dashboard-n4gb6    1/1       Running   2          18h

因为我本地的集群中defaultnamespace中没有任何运行的容器,所以只会列出kube-systemnamespace中的。

  • 使用-o jsonpath = {.. image}格式化输出以仅包括容器镜像名称列表。 这将递归地解析出从返回的json的image字段。
    • 可以参看参看资料中的jsonpath reference来学习如何使用json path
  • 使用标准工具格式化输出: tr, sort, uniq
    • 使用tr 使用新行替换空格
    • 使用sort排序结果
    • 使用uniq聚合镜像计数
kubectl get pods --all-namespaces -o jsonpath="{..image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

上述命令将递归返回所有返回的项目的所有名为image的字段。
作为替代,可以使用到Pod内的image的绝对路径。 这确保在甚至重复字段名称中检索正确的字段,例如。 许多字段在给定项目中称为名称:

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

jsonpath解释如下:

  • .items[*]: 对于每个返回值
  • .spec: 获取spec
  • .containers[*]: 对于每一个容器
  • .image: 获取image

注意:当按名称获取单个Pod时, kubect get pod nginx',应该省略路径的.items [*]`部分,因为返回单个Pod而不是项目列表。

列出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="{..image}" -l app=nginx

使用pod 的namespace列出容器

要仅定位特定命名空间中的pod,请使用namespace。 以下只匹配kube-system命名空间中的Pods。

kubectl get pods --namespace kube-system -o jsonpath="{..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}}"

参考资料

本文版权归作者所有,禁止一切形式的转载,复制等操作
赞赏

微信赞赏支付宝赞赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注