Kubernetes:通過輕量化工具 kubespy 實(shí)時(shí)觀察YAML資源變更

寫在前面
分享一個(gè)小工具 kubespy 給小伙伴
博文內(nèi)容涉及:
工具的簡單介紹
下載安裝
以 kubectl 插件方式使用 Demo
理解不足小伙伴幫忙指正
我所渴求的,無非是將心中脫穎語出的本性付諸生活,為何竟如此艱難呢 ------赫爾曼·黑塞《德米安》

簡單介紹
偶然的機(jī)會看個(gè)這樣一個(gè)小工具,分享給小伙伴,kubespy 可以實(shí)時(shí)觀察 Kubernetes 資源如何變化,運(yùn)行 kubespy,它會持續(xù)觀察和報(bào)告有關(guān) Kubernetes 資源的信息。簡單來講,是一個(gè)可以觀察 資源對象 YAML 文件變化,和一個(gè)可以監(jiān)控 deploy,svc 中 pod 調(diào)度變化的工具。它會把監(jiān)控信息實(shí)時(shí)打印在當(dāng)前終端標(biāo)準(zhǔn)輸出的。

kubespy 可以單獨(dú)使用。也可以整合為 kubectl 插件來使用。kubespy 有 三個(gè)命令:

status : 它實(shí)時(shí)發(fā)出對任意 Kubernetes .status 資源字段所做的所有更改.
changes : 它實(shí)時(shí)發(fā)出對 Kubernetes 資源中任何字段 的所有更改
trace : 它 跟蹤 一個(gè) Kubernetes 資源在 整個(gè)集群中所做的更改,并將它們 聚合成一個(gè)實(shí)時(shí)更新的高級摘要。
下載安裝
具體可以參考文檔:

https://github.com/pulumi/kubespy

二進(jìn)制版本:

https://github.com/pulumi/kubespy/releases

這里網(wǎng)絡(luò)問題,我們直接本地下載

┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$wget https://github.com/pulumi/kubespy/releases/download/v0.6.1/kubespy-v0.6.1-linux-amd64.tar.gz
解壓

┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$tar -zxvf kubespy-v0.6.1-linux-amd64.tar.gz
LICENSE
README.md
kubespy
配置作為 kubectl 插件使用,需要修改原來的插件名字,拷貝到 可執(zhí)行文件目錄處,然后就可以通過 kubectl 命名來調(diào)用,查看版本測試

┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$mv kubespy kubectl-spy
┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$mv kubectl-spy /usr/local/bin/
┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$kubectl spy  version
v0.6.1
命令 Demo
status <apiVersion> <kind> [<namespace>/]<name>,它實(shí)時(shí)發(fā)出對 .status 任意 Kubernetes 資源字段所做的所有更改,作為 JSON diff。



┌──[root@vms81.liruilongs.github.io]-[~]
└─$kubectl delete -n kube-system pods   kube-apiserver-vms81.liruilongs.github.io
pod "kube-apiserver-vms81.liruilongs.github.io" deleted
這里我們刪除一個(gè)靜態(tài) pod 來觀察下 對 .status 對象的狀態(tài)監(jiān)聽

可以看下,整個(gè)過程 pod 狀態(tài)為

-  "phase": "Running",
+  "phase": "Pending",


-  "phase": "Pending",
+  "phase": "Running",
先是創(chuàng)建狀態(tài),然后我刪除 靜態(tài) pod 之后,對應(yīng)的 .status 對象屬性發(fā)現(xiàn)變動(dòng),屬性全部消失,這個(gè)時(shí)候說明 靜態(tài) pod 已經(jīng)被干掉了,然后受 k8s 機(jī)制影響,會周期掃描 靜態(tài) pod 目錄,發(fā)現(xiàn) yaml 文件還在,又會重新拉起 靜態(tài) pod, 在所以對應(yīng)的 .status 字段在一次發(fā)生變動(dòng),屬性添加。

┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$kubectl spy status v1 Pod kube-system/kube-apiserver-vms81.liruilongs.github.io
Watching status of v1 Pod kube-system/kube-apiserver-vms81.liruilongs.github.io
CREATED
{
  .......
  "containerStatuses": [
    {
      "containerID": "docker://3db7e6619f6b2bf4a764bb681394c1bd76369d04cb604c8a26574ba9a860bcf1",
      "image": "registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.2",
      "imageID": "docker-pullable://registry.aliyuncs.com/google_containers/kube-apiserver@sha256:eb4fae890583e8d4449c1e18b097aec5574c25c8f0323369a2df871ffa146f41",
      ...........
      },
      "name": "kube-apiserver",
      "ready": true,
      "restartCount": 2,
      "started": true,
      "state": {
        "running": {
          "startedAt": "2022-12-24T13:56:43Z"
        }
      }
    }
  ],
........
  "startTime": "2022-11-26T05:40:23Z"
}
MODIFIED
MODIFIED
DELETED
ADDED
 {
...............
-  ],
-  "hostIP": "192.168.26.81",
-  "phase": "Running",
+  "phase": "Pending",
-  "podIP": "192.168.26.81",
-  "podIPs": [
-    {
-      "ip": "192.168.26.81"
-    }
-  ],
   "qosClass": "Burstable",
-  "startTime": "2022-11-26T05:40:23Z"
 }

MODIFIED
 {
-  "phase": "Pending",
+  "phase": "Running",
   "qosClass": "Burstable"
+  "conditions": [
.........
+  "startTime": "2022-11-26T05:40:23Z"
 }
changes <apiVersion> <kind> [<namespace>/]<name>,它實(shí)時(shí)發(fā)出對 Kubernetes 資源中 任何字段 的所有更改,作為 JSON diff。即他可以監(jiān)控 yaml 資源的所有字段。

這里我們摘了一段出來, - 代表字段刪除, + 代表字段添加。沒有代表,為創(chuàng)建狀態(tài)

.............
-        "lastTransitionTime": "2022-12-27T20:45:18Z",
+        "lastTransitionTime": "2022-12-27T21:51:59Z",
-        "status": "True",
+        "status": "False",
         "type": "ContainersReady"
+        "message": "containers with unready status: [pause]"
+        "reason": "ContainersNotReady"
       },
       {
         "lastProbeTime": null,
         "lastTransitionTime": "2022-12-27T20:45:17Z",
         "status": "True",
         "type": "PodScheduled"
       }
     ],
     "containerStatuses": [
       {
         "containerID": "docker://23c398096e1e625977d8dab9c267ac49aff457d68930aa6cdacb26644919f763",
         "image": "registry.aliyuncs.com/google_containers/pause:3.5",
         "imageID": "docker-pullable://registry.aliyuncs.com/google_containers/pause@sha256:1ff6c18fbef2045af6b9c16bf034cc421a29027b800e4f9b68ae9b1cb3e9ae07",
         "lastState": {
         },
         "name": "pause",
-        "ready": true,
+        "ready": false,
         "restartCount": 0,
-        "started": true,
+        "started": false,
         "state": {
-          "running": {
-            "startedAt": "2022-12-27T20:45:18Z"
-          }
+          "terminated": {
+            "containerID": "docker://23c398096e1e625977d8dab9c267ac49aff457d68930aa6cdacb26644919f763",
+            "exitCode": 0,
+            "finishedAt": "2022-12-27T21:51:58Z",
+            "reason": "Completed",
+            "startedAt": "2022-12-27T20:45:18Z"
+          }
...................
trace <kind> [<namespace>/]<name>,它“跟蹤”一個(gè)復(fù)雜的 Kubernetes 資源在整個(gè)集群中所做的更改,并將它們聚合成一個(gè)實(shí)時(shí)更新的高級摘要。簡單講,即會實(shí)時(shí)的把當(dāng)前資源的 pod 的信息展示出來。可以清楚的看到 pod 調(diào)度。

下面為 當(dāng)前的 deploy 的 狀態(tài),他會顯示當(dāng)前的 資源是否可用,對應(yīng)的 pod 調(diào)度情況

┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$kubectl spy trace  deployment liruilong
[ADDED apps/v1/Deployment]  liruilong-topo-namespace/liruilong
    Rolling out Deployment revision 1
    ? Deployment is currently available
    ? Rollout successful: new ReplicaSet marked 'available'

ROLLOUT STATUS:
- [Current rollout | Revision 1] [ADDED]  liruilong-topo-namespace/liruilong-744498fcbd
    ? ReplicaSet is available [2 Pods available of a 2 minimum]
       - [Ready] liruilong-744498fcbd-2nbq2
       - [Ready] liruilong-744498fcbd-ffk4n
當(dāng)修改副本數(shù)后

┌──[root@vms81.liruilongs.github.io]-[~/ansible/podtopolog]
└─$kubectl scale deployment liruilong  --replicas=3
deployment.apps/liruilong scaled
可以發(fā)現(xiàn) pod 的實(shí)時(shí)變化。

┌──[root@vms81.liruilongs.github.io]-[~/kubectl-plu]
└─$kubectl spy trace deployment liruilong
[MODIFIED apps/v1/Deployment]  liruilong-topo-namespace/liruilong
    Rolling out Deployment revision 1
    ? Deployment is currently available
    ? Rollout successful: new ReplicaSet marked 'available'

ROLLOUT STATUS:
- [Current rollout | Revision 1] [MODIFIED]  liruilong-topo-namespace/liruilong-744498fcbd
    ? ReplicaSet is available [3 Pods available of a 3 minimum]
       - [Ready] liruilong-744498fcbd-k6b5c
       - [Ready] liruilong-744498fcbd-kf9gq
       - [Ready] liruilong-744498fcbd-2nbq2



博文參考
https://github.com/pulumi/kubespy

https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/

作者:山河已無恙


歡迎關(guān)注微信公眾號 :山河已無恙