【K8S學習筆記】Part2:獲取K8S集群中運行的所有容器鏡像


本文將介紹如何使用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字段。
  • 使用標准工具trsortuniq格式化輸出。
    • 使用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/ *


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM