kubernetes集羣管理命令(二)

系列目錄html

上一節咱們介紹了一些基本的命令,這一節咱們介紹一些更爲複雜的命令.node

pod排序

使用kubectl get pod獲取pod資源默認是以名稱排序的,有些時候咱們可能但願按其它順序排序.好比說咱們想要按照節點來排序.以即可以看到不一樣的節點上都運行着哪些pod.linux

這個需求可使用linux命令很簡單實現.使用kubectl get pod加上-owide參數就能夠顯示pod所在的節點.咱們再使用linux sort命令就能夠對結果按照特定字段排序了.如下示例是按節點排序後的結果git

[centos@k8s-master ~]$ kubectl get pod -owide|sort -k 7
sagent-b4dd8b5b9-5m2jc                     1/1     Running   0          15h     10.244.5.17   k8s-node1   <none>           <none>
consul-0                                   1/1     Running   0          2d17h   10.244.2.27   k8s-node2   <none>           <none>
consul-2                                   1/1     Running   0          2d17h   10.244.2.28   k8s-node2   <none>           <none>
stodagent-6f47976ccb-8fzmv                 1/1     Running   0          2d17h   10.244.2.23   k8s-node2   <none>           <none>
stodagent-6f47976ccb-vf7kx                 1/1     Running   0          2d17h   10.244.2.22   k8s-node2   <none>           <none>
trackingapi-gateway-dep-79bb86bb57-x9xzp   1/1     Running   0          2d17h   10.244.2.24   k8s-node2   <none>           <none>
sagent-b4dd8b5b9-6mmst                     1/1     Running   0          15h     10.244.6.6    k8s-node3   <none>           <none>
sagent-b4dd8b5b9-zq649                     1/1     Running   0          15h     10.244.7.7    k8s-node4   <none>           <none>
stodagent-6f47976ccb-j7m8b                 1/1     Running   0          2d17h   10.244.3.6    k8s-node5   <none>           <none>
consul-1                                   1/1     Running   0          2d17h   10.244.3.13   k8s-node5   <none>           <none>
easymock-dep-84767b6f75-l84r4              1/1     Running   0          15h     10.244.8.8    k8s-node6   <none>           <none>
NAME                                       READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES

咱們能夠看到,已經以節點名稱來排序的,這裏不太優雅的是標題被排在了最後面.可是無傷大雅.github

其實kubectl get命令有一個--sort-by參數.咱們能夠經過它來指定要按照資源的哪個字段來排序,而不侷限於展現出的字段.如下是使用--sort-by參數按節點名稱排序後的結果.redis

[centos@k8s-master ~]$ kubectl get pod --sort-by='{.spec.nodeName}' -owide
NAME                                       READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
sagent-b4dd8b5b9-5m2jc                     1/1     Running   0          15h     10.244.5.17   k8s-node1   <none>           <none>
consul-0                                   1/1     Running   0          2d17h   10.244.2.27   k8s-node2   <none>           <none>
stodagent-6f47976ccb-8fzmv                 1/1     Running   0          2d17h   10.244.2.23   k8s-node2   <none>           <none>
consul-2                                   1/1     Running   0          2d17h   10.244.2.28   k8s-node2   <none>           <none>
stodagent-6f47976ccb-vf7kx                 1/1     Running   0          2d17h   10.244.2.22   k8s-node2   <none>           <none>
trackingapi-gateway-dep-79bb86bb57-x9xzp   1/1     Running   0          2d17h   10.244.2.24   k8s-node2   <none>           <none>
sagent-b4dd8b5b9-6mmst                     1/1     Running   0          15h     10.244.6.6    k8s-node3   <none>           <none>
sagent-b4dd8b5b9-zq649                     1/1     Running   0          15h     10.244.7.7    k8s-node4   <none>           <none>
consul-1                                   1/1     Running   0          2d17h   10.244.3.13   k8s-node5   <none>           <none>
stodagent-6f47976ccb-j7m8b                 1/1     Running   0          2d17h   10.244.3.6    k8s-node5   <none>           <none>
easymock-dep-84767b6f75-l84r4              1/1     Running   0          15h     10.244.8.8    k8s-node6   <none>           <none>

除了展現出來的字段外,咱們還能夠按照沒有展現出來的字段進行排序.好比咱們能夠按照startTime來排序,看看哪些pod運行的時間較長.編程

[centos@k8s-master ~]$ kubectl get pod --sort-by='{.status.startTime}'
NAME                                       READY   STATUS             RESTARTS   AGE
stodagent-6f47976ccb-vf7kx                 1/1     Running            0          2d18h
stodagent-6f47976ccb-j7m8b                 1/1     Running            0          2d18h
stodagent-6f47976ccb-8fzmv                 1/1     Running            0          2d18h
trackingapi-gateway-dep-79bb86bb57-x9xzp   1/1     Running            0          2d18h
consul-0                                   1/1     Running            0          2d18h
consul-1                                   1/1     Running            0          2d17h
consul-2                                   1/1     Running            0          2d17h
sagent-b4dd8b5b9-5m2jc                     1/1     Running            0          16h
sagent-b4dd8b5b9-zq649                     1/1     Running            0          16h
sagent-b4dd8b5b9-6mmst                     1/1     Running            0          16h
easymock-dep-84767b6f75-l84r4              1/1     Running            0          15h
redis-cache-f87d8488c-v4zjx                0/1     ErrImagePull       0          57s
redis-cache-f87d8488c-4d9dl                0/1     ImagePullBackOff   0          57s
redis-cache-f87d8488c-kxc89                0/1     ImagePullBackOff   0          57s

看了之後輸出內容之後,你們可能一頭霧水,以上究竟是不是按啓動時間排序的?如何直接地看到是按啓動時間排序的呢?其實實際上確實是按照啓動時間排序了,爲民展現此示例,我剛剛不久啓動了三個沒法運行的redis實例,它們被排在了最下面.json

咱們能不能把startTime字段也輸出出來呢,這樣就能夠直接地看到輸出時間了,是否是按這個時間排序的也就一目瞭然了.答案是確定的.centos

自定義顯示字段

前面一節咱們遇到一個問題,咱們有一個需求把pod的startTime顯示出來.其實這個需求是能夠實現的,kubectl get的輸入格式參數-o(或--output)接收一個custom-columns自定義列的格式.咱們能夠經過它來實現自定義輸出格式.api

格式爲: -o=custom-columns=列名:字段值,列名:字段值

其中字段值是經過資源的定義文件選擇出來的.

如下示例咱們展現出pod的name和startTime

[centos@k8s-master ~]$  kubectl get pod --sort-by=.status.startTime  -o=custom-columns=name:.metadata.name,startTime:.status.startTime
name                                       startTime
stodagent-6f47976ccb-vf7kx                 2019-05-14T07:19:05Z
stodagent-6f47976ccb-j7m8b                 2019-05-14T07:19:05Z
stodagent-6f47976ccb-8fzmv                 2019-05-14T07:19:05Z
trackingapi-gateway-dep-79bb86bb57-x9xzp   2019-05-14T07:19:06Z
consul-0                                   2019-05-14T07:19:28Z
consul-1                                   2019-05-14T07:25:06Z
consul-2                                   2019-05-14T07:25:16Z
sagent-b4dd8b5b9-5m2jc                     2019-05-16T09:20:17Z
sagent-b4dd8b5b9-zq649                     2019-05-16T17:09:37Z
sagent-b4dd8b5b9-6mmst                     2019-05-16T17:19:59Z
easymock-dep-84767b6f75-l84r4              2019-05-16T18:00:07Z
redis-cache-f87d8488c-v4zjx                2019-05-17T01:21:54Z
redis-cache-f87d8488c-4d9dl                2019-05-17T01:21:54Z
redis-cache-f87d8488c-kxc89                2019-05-17T09:11:11Z

這樣就能夠一目瞭解地看到它們是按時間前後順序排序的.可是咱們能夠看到,命令變得有點複雜了,若是想要和像默認輸出同樣把那些字段都展現出來,是否是須要定義更多的自定義輸出字段,能不能在默認的輸出字段後面追加自定義字段呢.答案是否認的,目前沒法作到.有用戶建議增長--extra-columns參數在默認輸出的基礎上增長額外輸出字段.可是截至目前這個pr尚未合併.待正式發佈可有還須要等待數月.

按時間排序kubernetes裏的事件資源

有時候爲了排查錯誤,咱們可能須要查看kubernetes裏的事件資源,咱們能夠按照時間順序以方便查看

kubectl get events --sort-by=.metadata.creationTimestamp

分別使用go-template,jsonpath,yq,jq來獲取一個pod裏的鏡像

如下咱們使用四個示例來展現如何獲取一個叫做consul-0的pod的image(你們可使用任意一個pod來作練習)

一句話,條條大路通羅馬,只要能熟悉掌握其中一種方法即可以完成咱們平常工做中的任務,你們沒必要把全部工具都掌握,根據實際狀況和本身知識體系來選擇.

使用to-template獲取

命令以下

[centos@k8s-master ~]$ kubectl get pod consul-0 -ogo-template='{{range .spec.containers}}{{.image}}{{end}}'
consul:latest

range函數用來遍歷集合對象.end用於結束遍歷

使用jsonpath

kubectl get pod consul-0 -ojsonpath='{range .spec.containers[*]}{.image}{end}'
consul:latest

這裏和上面的go-template很是相似,不一樣的是數組對象後面要跟中括號[]以代表是數組,中括號裏帶上星號(*)表示索引全部.

jsonpath與go-template不一樣的是,jsonpath除了可使用星號*號索引全部的集羣元素之外,還可使用數字索引(同其它編程語言同樣,0表明第一個元素)或者範圍索引(例如[0:1],[:1])

以上命令都不夠簡潔.使用jsonpath還有一種更爲簡潔的方法,那就是遞歸查找,這樣能夠在不知道文檔的詳細結構可是知道具體的屬性名的時候進行查找.示例以下

[centos@k8s-master ~]$ kubectl get pod consul-0 -ojsonpath='{..image}'
consul:latest consul:latest

同上面相比,這裏的結果裏多出了一條記錄.其實這是由於status字段裏的containerStatuses字段裏也有image屬性.咱們能夠經過如下命令來進一步縮小查找範圍

[centos@k8s-master ~]$ kubectl get pod consul-0 -ojsonpath='{.spec..image}'
consul:latest

使用yq工具

[centos@k8s-master ~]$ kubectl get po consul-0 -oyaml|yq r - spec.containers[*].image
- consul:latest

使用jq工具

示例以下:

[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq .spec.containers[].image
"consul:latest"

yq也可使用遞歸查詢方式,只不不是特別優雅,而且限制也很是大,只適合簡單查看

[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '..|.image?'
null
null
null
null
null
"consul:latest"
null
null
null
null
null
null
null
null
null
null
null
"consul:latest"
null
null
null

以上輸出了不少null影響觀看,咱們可使用grep管道把它們過濾掉

[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '..|.image?'|grep -v null
"consul:latest"
"consul:latest"

對象輸出

以上示例咱們僅僅輸出了某一個字段的值,可是若是在可編程環境中使用,咱們須要的可能不只僅是普通的數值,也有多是更爲複雜的對象相似,常見的爲json對象.這裏咱們介紹如何使用jq工具把結果輸出爲對象類型

如下示例咱們把image的名稱和image鏡像的名稱作爲一個json對象輸出

[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '{name:.spec.containers[0].name,image:.spec.containers[0].image}'
{
  "name": "consul",
  "image": "consul:latest"
}

以上僅輸出了一個對象,若是咱們想要輸出的是數組對象呢,這裏有些處理技術,請看如下示例:

[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq .status.conditions
[
  {
    "lastProbeTime": null,
    "lastTransitionTime": "2019-05-14T07:19:28Z",
    "status": "True",
    "type": "Initialized"
  },
  {
    "lastProbeTime": null,
    "lastTransitionTime": "2019-05-14T07:25:06Z",
    "status": "True",
    "type": "Ready"
  },
  {
    "lastProbeTime": null,
    "lastTransitionTime": "2019-05-14T07:25:06Z",
    "status": "True",
    "type": "ContainersReady"
  },
  {
    "lastProbeTime": null,
    "lastTransitionTime": "2019-05-14T07:19:28Z",
    "status": "True",
    "type": "PodScheduled"
  }
]

咱們要把如下結果從新組裝,保存爲僅包含lastTransitionTime的集羣類型

如下是一種常見的錯誤操做方法:

[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '.status.conditions[]|{lastTransitionTime:.lastTransitionTime}'
{
  "lastTransitionTime": "2019-05-14T07:19:28Z"
}
{
  "lastTransitionTime": "2019-05-14T07:25:06Z"
}
{
  "lastTransitionTime": "2019-05-14T07:25:06Z"
}
{
  "lastTransitionTime": "2019-05-14T07:19:28Z"
}

咱們能夠看到,咱們其實是取到了多個對象,可是它們並非一個數組,想要獲取一個數組對象,正確的操做以下:

[centos@k8s-master ~]$ kubectl get po consul-0 -ojson|jq '[.status.conditions[]|{lastTransitionTime:.lastTransitionTime}]'
[
  {
    "lastTransitionTime": "2019-05-14T07:19:28Z"
  },
  {
    "lastTransitionTime": "2019-05-14T07:25:06Z"
  },
  {
    "lastTransitionTime": "2019-05-14T07:25:06Z"
  },
  {
    "lastTransitionTime": "2019-05-14T07:19:28Z"
  }
]

你們仔細看看其中的差異在哪裏

原文出處:https://www.cnblogs.com/tylerzhou/p/11058476.html

相關文章
相關標籤/搜索