Kubernetes CKA課程筆記 47
上一篇學會了如何在Pod之中Debug
本篇則是要學會如何使用kubectl來Debug Cluster components
考量到真正K8s系統在使用時
Cluster內可能會有上百個Pods,Services,Deployments…元件
單純地使用kubectl get指令可能無法匯出容易參考的資訊,例如:
- 多個Pods在Node中的IP位置
- 多個Pods的Service Accounts
- Creation time,Image 與 Container名稱
上述資訊可能需要使用到kubectl describe指令來取得
但其實還有另一種輸出格式可以取得依樣資訊的是:
kubectl .... -o json
亦即kubectl輸出json格式的各種屬性資訊
輸出json,會看到資訊量非常龐大,但內容太長也難以閱讀
更別提如果Pods有上百個時,資訊根本瀏覽不完!
或是像取得Node資訊:
所以可能挑著我們需要的關鍵屬性(或說欄位)來輸出就好
這時就需要"JSONPath"一種Json用的Query語言
就如同XPath之於XML一樣
並且kubectl有支援JSONPath,使用方式如下:
kubectl get pod -o jsonpath=’{起始為點的json路徑}’
在往下層:
kubectl get pod -o jsonpath='{.items[0].metadata}'
甚至只看metadata裡面的name:
kubectl get pod -o jsonpath='{.items[0].metadata.name}'
或是我想印出所有Pod的name,可以使用wildcard*號:
kubectl get pod -o jsonpath='{.items[*].metadata.name}'
如上圖,輸出都擠成一團,所以可以再改造增加newline
加入range(to iterate lists)語法,但會稍難:
kubectl get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'
甚至進階不只name,另外輸出podIP:
kubectl get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'
再試著增加startTime:
kubectl get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\t"}{.status.startTime}{"\n"}{end}'
如上的指令不太容易組得出來,所以方便點的使用方式是寫script檔執行
例如:
貼入剛剛的指令儲存:
記得改執行權限:
chmod u+x pod_name_ip_created_at.sh
試著執行該sh:
接著如果不曉得的人可能會疑惑其欄位的定義,這時候可能需要增加欄位名稱
例如執行以下:
kubectl get pod -o custom-columns=POD_NAME:.metadata.name,POD_IP:.status.podIP,CREATED_AT:.status.startTime
由以上範例,就能有更方便的方式進行Debug工作!
並且更方便的方式取得必要的資訊