iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 21
0
DevOps

從題目中學習k8s系列 第 21

【從題目中學習k8s】-【Day21】第十三題 - JSON PATH


title: 【從題目中學習k8s】-【Day21】第十三題 - JSON PATH
description: 以無比的恆毅力堅持30天鍊成鐵人--連續30天,一天發表一篇IT技術文章

【從題目中學習k8s】-【Day21】第十三題 - JSON PATH

tags: DevOps CICD K8s Docker

Question

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

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可以將回傳的資訊過濾,只印出特定的資訊並可依照我們的需求調整輸出格式。那要怎麼結合JSON PATH QUERY和kubectl使用呢?有以下幾個步驟:

  1. 首先,確認要使用的kubectl命令為何
## 例如
$ kubectl get po
  1. 確認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

  1. 根據需求定義JSON PATH QUERY條件
    例如我要看到這個Pod內的Container的VolumemountPath為何,需要找到mountPath的所在的階層,可以根據第2步驟的結果找到,目標為:
    $.spec.containers[*].volumeMounts[*].mountPath

    containers[*]是因為containers是array格式,*代表選取Pod內所有container
    $: start sign

  2. 結合步驟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,將結果輸出到目標檔案就行了

Answer

$ 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的用法,筆者覺得這類題目還滿有趣的,很多變化,有時間大家可以自己玩玩看哦~ 好啦,今天就到這囉~ 謝謝大家~

參考資料

kubectl Cheat Sheet

使用 JSONPath 解析 JSON 完整內容詳解

Thank you!

You can find me on

  • george4908090@gmail.com

上一篇
【從題目中學習k8s】-【Day20】第十二題 - RBAC
下一篇
【從題目中學習k8s】-【Day22】第十四題 - ConfigMap
系列文
從題目中學習k8s31

尚未有邦友留言

立即登入留言