kubectl技巧之通過jsonpath擷取屬性

2022-01-11 00:43:42 字數 2547 閱讀 6627

系列目錄

前面一節我們介紹了使用go-template擷取屬性,go-template功能非常強大,可以定義變數,使用流程控制等,這是jsonpath所不具備的.然而,jsonpth使用的時候更為靈活.通過上一節我們發現,我們想要找到某個具體屬性,必須從最外層一層層向內找到具體屬性,這對於巢狀層次非常深的yaml物件來說操作是非常繁瑣的.而使用jsonpath只需要知道頂層物件,然後可以省略中間的物件,遞迴查詢直接找到我們想要的屬性,這在很多時候對我們在不清楚物件的層次但是清楚知道某個屬性名稱的時候獲取這個屬性的值是非常有幫助的.並且jsonpath可以使用下標索引陣列物件,這在實際工作中也是非常有幫助的(比如雖然pod裡可以包含多個containers,但是很多時候乙個pod裡只有乙個container,使用go-template我們為了找到這個物件需要寫乙個遍歷表示式,而使用jsonpath可以直接取第0個物件,省去了寫迴圈的麻煩),還有一點很重要的是jsonpath是乙個標準,這對於熟悉jsonpath的開發者來說使用起來方便很多.

jsonpath模板使用一對花括號({})把jsonpath表示式包含在裡面(go-template是雙花括號).除了標準jsonpath語法外,kubernetes jsonpath模板還額外支援以下語法:

$操作符是可選的因為表示式預設總是從根節點開始選擇

物件通過它的string()函式列印輸出出來

假如有以下json字串

,

"status":,

"addresses":}},

,"status":,

"addresses":[,]

}}

],"users":[},}

]}

function

description

example

result

text

the plain text

kind is

kind is list

@the current object

the same as input

. or

child operator

or list

..recursive descent

127.0.0.1 127.0.0.2 myself e2e

*wildcard. get all objects

[127.0.0.1 127.0.0.2]

[start:end :step]

subscript operator

myself

[,]union operator

127.0.0.1 127.0.0.2 map[cpu:4] map[cpu:8]

?()filter

secret

range, end

iterate list

[, ]

[127.0.0.1, map[cpu:4]] [127.0.0.2, map[cpu:8]]

「quote interpreted string

127.0.0.1 127.0.0.2

使用jsonpath示例

kubectl get pods -o json

kubectl get pods -o=jsonpath=''

kubectl get pods -o=jsonpath=''

kubectl get pods -o=jsonpath=''

kubectl get pods -o=jsonpath=''

如果物件是集合型別,需要使用range關鍵字開始,以end關鍵字結果,同前面一節go-template類似.

我們通過以下示例來看如何通過jsonpath簡單地獲取到容器所在節點名稱

[centos@k8s-master ~]$ kubectl get po consul-0 -ojsonpath=''

k8s-node1

[centos@k8s-master ~]$

當然以上也可以通過grep來獲取到同樣的資訊,並且對於很多熟悉linux命令的童鞋來說更為方便,如果僅僅是檢視.grep確實更為方便,但是通過jsonpath是準確地獲取到了乙個屬性的值,而grep則是擷取的包含這個關鍵字的一行,如果我們要把獲取的值作為下乙個命令的的輸入值時,通過grep獲取的結果往往是需要處理的.例如通過grep獲取到的結果如下

"k8s-node1",[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|grep nodename

"nodename": "k8s-node1",

這裡想要準備的獲取結果,產生要擷取第二列值,然後再去掉引號,操作起來不如jsonpath方便.尤其在不同環境如果輸出的格式不一樣的話,通過字串擷取得到的結果可能是錯誤的.

kubectl原始碼分析之rollout undo

課程內容 各種k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括開發測試環境部署k8s,和生產環境部署k8s。介紹主要的k8s資源的使用配置和命令。包括configmap,pod,service,replicaset,namespa...

kubectl原始碼分析之auth can i

課程內容 各種k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括開發測試環境部署k8s,和生產環境部署k8s。介紹主要的k8s資源的使用配置和命令。包括configmap,pod,service,replicaset,namespa...

kubectl原始碼分析之kustomize

istio多集群探秘,部署了50次多集群後我得出的結論 istio防故障利器,你知道幾個,istio新手不要讀,太難!istio業務許可權控制,原來可以這麼玩 istio實現非侵入壓縮,微服務之間如何實現壓縮 不懂envoyfilter也敢說精通istio系列 http rbac 不要只會用auth...