前提條件
- 您必須有一個K8S集群
- 可參考 安裝Kubernetes單Master節點集群
- kubectl 版本不低於 1.14,可參考 安裝kubectl
- 在執行 kubectl 命令的機器上任意位置創建一個空白目錄用於本例子的執行。本文假設后續所有命令的當前目錄都是此時創建的這個目錄。
# 查看所有名稱空間總的容器
-
執行命令,獲取所有名稱空間中的所有 Pod
kubectl get pods --all-namespaces
使用 -o jsonpath={..image} 參數,輸出結果將格式化為只包含容器鏡像名字的形式。該參數將遞歸地查找 JSON 數據中所有 image 字段,例如:
kubectl get pods --all-namespaces -o jsonpath={..image}
- 了解如何使用 jsonpath
使用工具 tr、sort、uniq 格式化輸出結果
- 使用
tr將空格替換為新的行 - 使用
sort對結果排序 - 使用
uniq對鏡像使用計數
kubectl get pods --all-namespaces -o jsonpath="{..image}" |tr -s '[[:space:]]' '\n' |sort |uniq -c
- 此命令將遞歸返回所有
image字段。
此外,也可以用 Pod 中 image 字段的絕對路徑來查找容器的鏡像名字,可以規避 image 字段重復出現的情況。
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}"
Jsonpath 的解析如下:
.items[*]:每一個返回值.spec: 獲取 spec.containers[*]: 每一個 container.image:獲取 image
注意
如果通過名字查找 Pod,例如 kubectl get pod nginx,由於返回結果只有一個 Pod,此時,.items[*] 這一部分應該從 jsonpath 中移除。
# 按Pod查找容器
輸出結果可以通過 rannge 操作遍歷
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' | sort
# 按Pod的label查找容器
使用 -l 參數,可以查找指定標簽的 Pod,下面的例子中只查找帶有 app=nginx 標簽的 Pod:
kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=nginx
# 按名稱空間查找容器
使用 --namespace 參數,可以查找指定名稱空間下的 Pod,下面的例子只查找 kube-system 名稱空間中的 Pod:
kubectl get pods --namespace kube-system -o jsonpath="{..image}"
# 使用go-template羅列容器
除了 jsonpath 之外,kubectl 支持使用 go-template
格式化輸出結果:
kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}"
