Kubernetes 列出集群中所有運(yùn)行容器的鏡像

2022-06-15 13:42 更新

列出集群中所有運(yùn)行容器的鏡像

本文展示如何使用 kubectl 來(lái)列出集群中所有運(yùn)行 Pod 的容器的鏡像

在開(kāi)始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

要獲知版本信息,請(qǐng)輸入 ?kubectl version?。

在本練習(xí)中,你將使用 kubectl 來(lái)獲取集群中運(yùn)行的所有 Pod,并格式化輸出來(lái)提取每個(gè) Pod 中的容器列表。

列出所有命名空間下的所有容器

  • 使用 ?kubectl get pods --all-namespaces? 獲取所有命名空間下的所有 Pod
  • 使用 ?-o jsonpath={.items[*].spec.containers[*].image}? 來(lái)格式化輸出,以僅包含容器鏡像名稱。 這將以遞歸方式從返回的 json 中解析出 ?image ?字段。
  • 使用標(biāo)準(zhǔn)化工具來(lái)格式化輸出:?tr?, ?sort?, ?uniq?
    • 使用 ?tr ?以用換行符替換空格
    • 使用 ?sort ?來(lái)對(duì)結(jié)果進(jìn)行排序
    • 使用 ?uniq ?來(lái)聚合鏡像計(jì)數(shù)
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

上面的命令將遞歸獲取所有返回項(xiàng)目的名為 ?image ?的字段。

作為替代方案,可以使用 Pod 的鏡像字段的絕對(duì)路徑。這確保即使字段名稱重復(fù)的情況下也能檢索到正確的字段,例如,特定項(xiàng)目中的許多字段都稱為 ?name?:

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

jsonpath 解釋如下:

  • ?.items[*]?: 對(duì)于每個(gè)返回的值
  • ?.spec?: 獲取 spec
  • ?.containers[*]?: 對(duì)于每個(gè)容器
  • ?.image?: 獲取鏡像

說(shuō)明: 按名字獲取單個(gè) Pod 時(shí),例如 ?kubectl get pod nginx?,路徑的 ?.items[*]? 部分應(yīng)該省略, 因?yàn)榉祷氐氖且粋€(gè) Pod 而不是一個(gè)項(xiàng)目列表。

按 Pod 列出容器鏡像

可以使用 ?range ?操作進(jìn)一步控制格式化,以單獨(dú)操作每個(gè)元素。

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

列出以標(biāo)簽過(guò)濾后的 Pod 的所有容器

要獲取匹配特定標(biāo)簽的 Pod,請(qǐng)使用 -l 參數(shù)。以下匹配僅與標(biāo)簽 ?app=nginx? 相符的 Pod。

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

列出以命名空間過(guò)濾后的 Pod 的所有容器 

要獲取匹配特定命名空間的 Pod,請(qǐng)使用 namespace 參數(shù)。以下僅匹配 ?kube-system? 命名空間下的 Pod。

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

使用 go-template 代替 jsonpath 來(lái)獲取容器

作為 jsonpath 的替代,Kubectl 支持使用 go-templates 來(lái)格式化輸出:

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)