DevOps
CICD
K8s
Docker
Use JSON PATH query to retrieve the architecture of all the nodes and store it in a file /opt/outputs/nodes_architecture.txt
The architecture are under the nodeInfo
section under status
of each node.
前幾天我們有提到,當我們需要獲取Node
的資訊的時候,可以透過kubectl get
命令,若需要更詳細的資訊,可以用kubectl get no -o wide
,再再再更詳細,可以透過kubectl describe
,這個命令囊括了所有的資訊。但若我們不想看那麼多訊息,我們只想得到其中的某些資訊,並將它依照特定格式輸出成檔案 (例如這題只需要每個Node
的系統架構),那就需要透過JSON PATH QUERY
了 (筆者這邊先假設大家都具備JSON PATH
的背景知識了,就不再多做介紹,若還不太清楚的讀者們,可以參考這篇教學,寫得很詳盡!)。那要如何使用JSON PATH來QUERY出我們想要的資訊呢?這就要從kubectl
開始講起了...
kubectl
其實就是 kubernetes
的 CLI,用來 read/write K8s的物件。每當我們使用kubectl
命令時,都是向kube-apiserver
發出一個request,kube-apiserver
收到後,會以JSON格式回覆對應的資訊。
例如,使用
kubectl get no
命令,kube-apiserver
即會將Node
的所有資訊以JSON格式回覆給kubectl
當kubectl
收到JSON格式的資訊後,會將它轉換成一個readable的格式並印出。在這個過程中,會省略很多細節的資訊,像是timestamp、annotations等,只印出重要的資訊,例如name、status、role、age、version。
前面提過,若想看到更完整的資訊,可以透過
kubectl describe
命令。
但像這題題目,它要求我們只列出Node
的architecture資訊;或是有時候我們想以特定格式輸出某部分資訊,這時就要透過 JSON PATH QUERY 了!
JSON PATH QUERY可以將回傳的資訊過濾,只印出特定的資訊並可依照我們的需求調整輸出格式。那要怎麼結合JSON PATH QUERY和kubectl
使用呢?有以下幾個步驟:
kubectl
命令為何## 例如
$ kubectl get po
kube-apiserver
針對該命令會回傳的JSON長什麼樣子{
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"annotations": {
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"creationTimestamp\":null,\"labels\":{\"run\":\"jenkins\"},\"name\":\"jenkins\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"jenkins\",\"name\":\"jenkins\",\"resources\":{}}],\"dnsPolicy\":\"ClusterFirst\",\"restartPolicy\":\"Never\"},\"status\":{}}\n"
},
"creationTimestamp": "2020-09-04T08:44:22Z",
"labels": {
"run": "jenkins"
},
"managedFields": [
{
...
...
如果不確定回傳的JSON格式長怎樣,可以先將結果輸出成JSON檔,就可以輕易看到了
例如:kubectl get no -o json > node-json.json
根據需求定義JSON PATH QUERY條件
例如我要看到這個Pod
內的Container的Volume
的mountPath
為何,需要找到mountPath
的所在的階層,可以根據第2步驟的結果找到,目標為:$.spec.containers[*].volumeMounts[*].mountPath
containers[*]
是因為containers是array格式,*
代表選取Pod內所有container$
: start sign
結合步驟2與步驟3將結果輸出
$ kubectl get po jenkins -o jsonpath='{.spec.containers[*].volumeMounts[*].mountPath}'
/var/run/secrets/kubernetes.io/serviceaccount
$
符號在kubectl
可省略,系統會自動帶入
若我要同時輸出兩種資訊,例如node name和cpu,只要用兩個{}
區個即可,例如:
$ kubectl get no -o jsonpath='{.items[*].metadata.name} {"\n"} {.items[*].status.capacity.cpu}'
g8master g8node1 g8node2
4 2 2
若想將欄位名稱也印出,可以透過custom-cloumns
,例如:
$ kubectl get no -o custom-columns=<cloume-name>:<json path>
$ kubectl get no -o custom-columns=NODE:.metadata.name,CPU:status.capacity.cpu,MEMORY:.status.capacity.memory
NODE CPU MEMORY
g8master 4 8152804Ki
g8node1 2 4030620Ki
g8node2 2 4030620Ki
若要根據名稱排序,可以用kubectl內建的--sort-by
,例如:
$ kubectl get no --sort-by=<json path>
$ kubectl get no --sort-by=.status.capacity.memory
NAME STATUS ROLES AGE VERSION
g8node1 Ready worker 62d v1.18.5
g8node2 Ready worker 62d v1.18.5
g8master Ready master 62d v1.18.8
考試的時候如果忘記JSON PATH的寫法,一定要記得可以參考官網 Cheat Sheet ,裡面有一些範例可以參考。
再次證明Cheat Sheet真的很重要,考試前一定要看熟喔 (順便提醒筆者自己XD)
回到題目,前面的介紹都了解的話,這題就很簡單啦,找到architecture的JSON PATH,將結果輸出到目標檔案就行了
$ kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.architecture}' > /opt/outputs/nodes_architecture.txt
$ cat /opt/outputs/nodes_architecture.txt
amd64 amd64 amd64
考試之餘可以利用 JSONPath Online Evaluator 這個網站來練習JSON Path 該怎麼使用哦~
今天介紹了JOSN PATH
搭配kubectl
的用法,筆者覺得這類題目還滿有趣的,很多變化,有時間大家可以自己玩玩看哦~ 好啦,今天就到這囉~ 謝謝大家~
You can find me on