Kubernetes CKA課程筆記 47

Troubleshooting — kubectl Format Output

ZONGRU Li
Nov 12, 2021

上一篇學會了如何在Pod之中Debug

本篇則是要學會如何使用kubectlDebug Cluster components

考量到真正K8s系統在使用時

Cluster內可能會有上百個Pods,Services,Deployments…元件

單純地使用kubectl get指令可能無法匯出容易參考的資訊,例如:

  1. 多個PodsNode中的IP位置
  2. 多個PodsService Accounts
  3. Creation time,ImageContainer名稱

上述資訊可能需要使用到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}'

或是我想印出所有Podname,可以使用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}'

{“\t”}為區隔,{“\n”}為換行

再試著增加startTime:

在json格式的status下會看到startTime

kubectl get pod -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\t"}{.status.startTime}{"\n"}{end}'

獲得所有Pod的名稱,IP位置,啟動時間

如上的指令不太容易組得出來,所以方便點的使用方式是寫script檔執行

例如:

貼入剛剛的指令儲存:

記得改執行權限:

chmod u+x pod_name_ip_created_at.sh

試著執行該sh:

接著如果不曉得的人可能會疑惑其欄位的定義,這時候可能需要增加欄位名稱

link

例如執行以下:

kubectl get pod -o custom-columns=POD_NAME:.metadata.name,POD_IP:.status.podIP,CREATED_AT:.status.startTime

如圖,輸出就帶有欄位,方便辨識!

由以上範例,就能有更方便的方式進行Debug工作!

並且更方便的方式取得必要的資訊

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet