本文將介紹如何使用kubectl列舉K8S集群中運行的Pod內的容器鏡像。
注意:本文針對K8S的版本號為v1.9,其他版本可能會有少許不同。
0x00 准備工作
需要有一個K8S集群,並且配置好了kubectl
命令行工具來與集群通信。如果未准備好集群,那么你可以使用Minikube創建一個K8S集群,或者你也可以使用下面K8S環境二者之一:
如果需要查看K8S版本信息,可以輸入指令kubectl version
。
在本練習中,我們將使用kubectl獲取集群中運行的所有Pod,並以指定格式輸出各Pod中運行的容器。
0x01 列舉所有命名空間中的容器
- 使用命令
kubectl get pods --all-namespaces
獲取所有命名空間中的所有Pod。 - 使用
-o jsonpath={..image}
格式化輸出,使其僅僅包含容器鏡像名稱,這將遞歸解析返回的json對象中的image字段。- 獲取更多關於如何使用jsonpath的信息,參見jsonpath reference。
- 使用標准工具
tr
、sort
和uniq
格式化輸出。- 使用
tr
以新行替換空格 - 使用
sort
對結果排序 - 使用
uniq
統計鏡像數量
- 使用
kubectl get pods --all-namespaces -o jsonpath="{..image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c
上述命令會對所有返回的項目,遞歸地返回所有名為image
的字段。
此外,另一種方法是使用image
字段在Pod內的絕對路徑。這能夠保證獲取正確的字段,即使該字段名稱在Pod中重復多次,例如,在一個給定的項目中,可能會有很多字段名稱都是name
:
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}"
上述的jsonpath按以下方式解析:
.items[*]
:針對每一個返回的值.spec
:獲取spec.containers[*]
:針對每個容器.image
:獲取鏡像
注意:當通過名稱獲取單個Pod時,例如:kubectl get pod nginx
,那么路徑中的.items[*]
部分將會省略,因為返回的是單個Pod,而不是多個Pod的列表。
0x02 通過Pod列舉容器
我們可以使用range
操作進一步控制輸出格式,以此來逐個迭代每一個元素:
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
sort
0x03 列舉Pod標簽過濾的容器
如果目標是那些匹配特定標簽的Pod,那么可以使用-l
標記。下面指令僅僅匹配含有標簽app=nginx
的Pod:
kubectl get pods --all-namespaces -o=jsonpath="{..image}" -l app=nginx
0x04 列舉Pod命名空間過濾的容器
如果目標是那些匹配特定命名空間的Pod,那么可以使用--namespace
標記。下面指令僅僅匹配存在於kube-system
命名空間中的Pod:
kubectl get pods --namespace kube-system -o jsonpath="{..image}"
0x05 使用go-template列舉容器
作為jsonpath的另一個選擇,Kubectl支持使用go-template來格式化輸出內容:
kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}"
0x06 參考內容
*英文原文:https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/ *