系列目錄html
前面兩節咱們由淺入深介紹了很多kubernetes管理比較經常使用的命令.本節咱們經過案例講解一些須要更爲複雜的操做才能完成的命令.linux
前面講到過,kubernetes的deployment和pod的命令上有關聯關係,咱們能夠經過查看deployment的名稱,而後記下來,而後再查找全部的pod經過grep輸入deploy的名稱爲關鍵字進行過濾.redis
好比集羣中有如下deployment編程
[centos@k8s-master ~]$ kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE easymock-dep 1/1 1 1 21h helloworld 1/1 1 1 88m redis-cache 0/3 3 0 6h5m sagent 3/3 3 3 2d1h stodagent 3/3 3 3 6d23h trackingapi-gateway-dep 1/1 1 1 28d
若是咱們想要找helloworld所控制的pod,咱們就能夠經過如下命令來達到效果json
[centos@k8s-master ~]$ kubectl get pod|grep helloworld helloworld-66fc98fd57-lc7tm 1/1 Running 0 89m
可是這種匹配多是不許確的,若是僅僅是查看可能沒問題,可是在編程環境中這樣作顯然不是好的辦法.前面咱們提到過先經過kubectl get deploy helloworld -ojson
而後經過jq
工具拿到selector,而後使用kubectl get pod -l=查找到的標籤
.這裏標籤須要咱們手動輸入,由於選擇器裏過濾到的結果是"key":"value"
格式,而-l接受的格式爲key=value
形式,固然咱們也能夠經過簡單的命令轉換以上兩種格式.可是選擇器裏也可能包含多個標籤(以下面示例),這樣咱們經過簡單命令很難處理了.centos
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq .spec.selector.matchLabels { "app": "helloworld", "version": "1.0" }
下面咱們一步步講解如何經過可編程的方式根據以上信息選擇名爲helloworld
的deployment所控制的全部podapi
首先,以上的鍵app
和version
都是由用戶定義的,而且不知道共有多少個,咱們無法直接經過.屬性名
的方式獲取到它,咱們能夠經過jq的to_entries
把它轉爲鍵值數組,數組是能夠遍歷的.操做以下:數組
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq '.spec.selector.matchLabels|to_entries' [ { "key": "app", "value": "helloworld" }, { "key": "version", "value": "1.0" } ]
這樣數組裏的全部對象都包含兩個鍵值,且鍵是固定的(分別爲key和value),這樣key咱們就都全知道了.下面咱們把它們組裝成app=helloworld
這樣形式,以便kubectl get po
的-l
參數可用bash
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value)"' "app=helloworld" "version=1.0"
以上的操做有一點很關鍵那就是使用to_entries
函數把對象轉爲數組.後面管道跟.[]
獲取數組對象.後面咱們把結果放在""
把結果拼接爲字符串這裏\
爲jq的語法,在字符串裏使用""能夠把後面跟的括號內的內容識別爲命令,而不是普通字符串.app
這樣基本知足要求了,可是有多個label時,-l
接收的參數形式爲lable1=value1,label2=value2
這樣形式的.所以咱們要刪除這兩個字符串的換行符,把它們合併到一行,而且中間加一個逗號.
以上字符串外面都包了一層引號(
""
),雖然-l
變量也能夠接收帶引號的,可是也能夠不要引號,jq裏經過參數-r(aw)
來獲取原始字符串,要把結果合併爲一行則使用-j(oin)
,改造後的命令以下
[centos@k8s-master ~]$ kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"' app=helloworld,version=1.0,
以上結果基本上達到預期效果,只是最後面多了一個逗號,咱們能夠接一個sed管道把它去掉
kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'|sed "s/.$//" app=helloworld,version=1.0
咱們把它賦值給一個變量,而後在選擇pod的時候使用它
[centos@k8s-master ~]$ label=$( kubectl get deploy helloworld -ojson|jq -r -j '.spec.selector.matchLabels|to_entries|.[]|"\(.key)=\(.value),"'|sed "s/.$//") [centos@k8s-master ~]$ kubectl get pod -l=$label NAME READY STATUS RESTARTS AGE helloworld-66fc98fd57-lc7tm 1/1 Running 0 3h22m
把集羣中全部的pod所有列出來很是容易.使用kubectl get pod --all-namespace
便可.重要的是咱們要循環遍歷全部的pod,把它們的名稱和標籤信息過濾出來展現.
前面咱們說過,在使用kubectl get pod
時若是使用-o=name
即可以只列出pod的名稱.它並非簡單地把kubectl get po
命令展現的名稱過濾出來,而是經過資源類型/資源名稱
的方式展現.好比有個pod名稱叫做consul-0
,使用kubectl get pod -o=name
展現出來它的名稱爲pod/consul-0
,這樣咱們就能夠直接使用kubectl get
來獲取到它
[centos@k8s-master ~]$ kubectl get pod/consul-0 NAME READY STATUS RESTARTS AGE consul-0 1/1 Running 0 3d2h
k8s除了支持kubectl get+資源類型+資源名稱外,還支持
kubectl get 資源類型/資源名稱
這種形式.雖然平時咱們不常常這樣寫,可是有特定場景下很是有用.
這樣,咱們就能夠遍歷kubectl get pod -o=name
的結果,在循環中取出每一個pod的編排信息,而後從中過濾出咱們想要的信息(即pod的標籤信息),操做和上面獲取matchLabels
有不少相似的地方.
關鍵代碼以下:
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"'; done app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-0 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-1 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-2 app=easymock pod-template-hash=84767b6f75 app=helloworld pod-template-hash=d5d5c5866 version=1.0 app=helloworld pod-template-hash=d5d5c5866 version=1.0 app=helloworld ...
以上循環獲取到的每個pod的名稱,而後遍歷他們,取出它們的.metadata.labels
字段,後面是對鍵值的從新組裝,和上面獲取deploy下的pod一節的操做相似.
從輸出結果中能夠看出,咱們只輸出的全部pod的標籤,這樣可讀性是很是差的,咱們也沒法肯定某一個標籤歸屬於哪個pod.咱們須要把它們的名字也輸出:
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"'; done Labels for pod/consul-0 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-0 Labels for pod/consul-1 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-1 Labels for pod/consul-2 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-2 Labels for pod/easymock-dep-84767b6f75-l84r4 app=easymock pod-template-hash=84767b6f75 Labels for pod/helloworld-d5d5c5866-24nzr app=helloworld pod-template-hash=d5d5c5866 version=1.0 ...
這查比前面清析一些了,可是仍然不是十分容易識別,咱們在遍歷的時候每一個item結束後輸出一個空行,這樣把不一樣的結果用空行隔離開來,可讀性更高.
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"';printf "\n"; done Labels for pod/consul-0 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-0 Labels for pod/consul-1 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-1 Labels for pod/consul-2 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-2 Labels for pod/easymock-dep-84767b6f75-l84r4 app=easymock pod-template-hash=84767b6f75
這樣基本ok了,咱們使用grep把名稱着色顯示,這樣在屏幕上的輸出可讀性就更高了.
[centos@k8s-master ~]$ for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item"|grep --color -E '[^/]+$'; kubectl get "$item" --output=json | jq -r '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"';printf "\n"; done Labels for pod/consul-0 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-0 Labels for pod/consul-1 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-1 Labels for pod/consul-2 app=consul controller-revision-hash=consul-744777c4bd statefulset.kubernetes.io/pod-name=consul-2
你們從上面文本中可能並看不出差異,可是若是是在linux終端就能夠看到pod的名稱都被着色顯示了.