­

分享幾個超級實用的插件和工具,輕鬆提高工作效率

  • 2019 年 12 月 25 日
  • 筆記

這篇文章主要分享幾個個人認為比較有用的工具,不用費腦,僅供參考 🙂

Kubectl插件

關於kubectl插件

kubectl插件其實就是以 kubectl-為前綴的任意·可執行文件,比如執行:

ln -s /bin/echo /usr/local/bin/kubectl-echo

此時就相當於安裝了個 echo的kubectl插件,kubectl插件可以通過 kubectl + 插件名執行, kubectl xxx其實就是相當於運行 kubectl-xxx

比如要運行我們的 echo插件,只需執行如下命令:

# kubectl echo "HelloWorld!"  HelloWorld!

通過 kubectl plugin list可列出當前PATH目錄下所有插件:

# kubectl plugin list  The following compatible plugins are available:    /root/.krew/bin/kubectl-grep  /root/.krew/bin/kubectl-krew  /root/.krew/bin/kubectl-ns  /root/.krew/bin/kubectl-ssh_jump  /root/.krew/bin/kubectl-whoami  /usr/local/bin/kubectl-echo

所以要實現自己的插件,只需要把最終的可執行文件命名為 kubectl-xxxx,然後放到PATH包含任意目錄即可,但注意無法覆蓋kubectl已有的子命令,如果與kubectl現有的子命令相同,則會優先執行內置子命令,因此插件不會被執行。

krew

首先要介紹的就是krew,krew是一個Kubernetes的包管理工具,它的功能就是提供簡單的方法下載、檢索、管理其他插件,類似作業系統的apt、yum、brew等工具,其命名也似乎模仿的brew工具。

安裝krew的官方腳本如下:

(    set -x; cd "$(mktemp -d)" &&    curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/download/v0.3.2/krew.{tar.gz,yaml}" &&    tar zxvf krew.tar.gz &&    ./krew-"$(uname | tr '[:upper:]' '[:lower:]')_amd64" install       --manifest=krew.yaml --archive=krew.tar.gz  )

安裝完後就可以使用krew搜索、安裝其他插件了,本文接下來介紹的大多數插件都可以使用krew直接安裝。

# kubectl krew search whoami  NAME    DESCRIPTION                                         INSTALLED  whoami  Show the subject that's currently authenticated...  yes  # kubectl krew install ns

krew在krew index項目中維護支援的插件列表以及下載路徑,目前所有插件都是在github中發布下載,但由於眾所周知的原因,中國從github下載速度非常慢?。

為了提高下載速度,寫了個腳本使用axel下載替換原來的下載方式,提速至少10倍以上?:

腳本可以在我的github中下載fast-krew。

kubectx / kubens

kubectx用於快速切換Kubernetes context,而kubens則用於快速切換namespace,我認為二者強大之處在於可以結合fzf使用。任何工具只要和fzf結合,都會很強大?。

如切換到 kube-system namespace:

kubectl ns kube-system

如果不指定namespace,則調用fzf互動式選擇:

如上黃色的namespace表示當前namespace,通過方向鍵移動箭頭選擇需要切換的目標namespace,切換context也一樣,由於測試環境只有一個admin,因此只有一個選項。

debug

我們知道容器的最佳實踐是只運行單個應用進程,因此為了精簡鏡像,我們通常在構建鏡像時只包含進程運行所需要包和程式,但這樣其實也給排查故障帶來問題,尤其是網路問題,想抓個包實在太麻煩。

我們常規的做法是先手動進入Pod所在的Node節點,然後找到對應的網路namespace,參考我之前的文章淺聊幾種主流Docker網路的實現原理,最後切換到容器的網路namespace中進行抓包,特別麻煩。

為了解決這個問題,社區中也提供了許多插件方案,

kubectl-debug通過EphemeralContainers的方式在運行的Pod中增加一個debugger的容器,然後通過kubectl exec進入該容器進行調試。

ksniff工具主要用於容器抓包,其實現方式是把本地靜態的tcpdump工具拷貝到容器的/tmp目錄,然後就可以通過kubectl exec進入容器運行tcpdump工具了。

但我覺得最好用的還是中國PingCAP公司開源的debug工具,其實現原理是在目標Node節點上創建一個 DebugAgentPod,創建的Debug Pod會在目標Node上創建一個新的容器,這個容器會加入到目標Pod的各個Namespace中,於是就可以進入這個新的容器進行調試了,這個新的容器目前使用的默認鏡像是 nicolaka/netshoot,這個鏡像裡面包含netstat、ip、tcpdump等各種網路調試工具,真是太方便了。

更多關於debug設計和用法可參考作者的文章簡化Pod故障診斷: kubectl-debug 介紹。

如下是我的一個演示動畫:

grep

基於name搜索資源,資源包括DaemonSets、Pods、Deployments、Nodes等,如搜索名字中帶 web的所有Pods:

# kubectl grep pod web  NAMESPACE   NAME    READY   STATUS    RESTART   AGE  default     web-0   1/1     Running   0         37h  default     web-1   1/1     Running   0         37h  default     web-2   1/1     Running   0         37h

在所有的namespaces搜索名字帶 virt的Deployments:

# kubectl grep deployment virt  --all-namespaces  NAMESPACE   NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE  kubevirt    virt-api          2         2         2            2           5h32m  kubevirt    virt-controller   2         2         2            2           5h32m  kubevirt    virt-operator     2         2         2            2           5h49m

iexec

exec命令的功能增強版本,我們知道exec必須指定Pod的名稱,如果一個Pod有多個容器,則還需要指定容器名稱,而使用exec則可以通過Pod模糊查詢然後互動式選擇,如果Pod中包含多個容器,也可以通過互動式選擇。

比如我創建的Deployment有如下5個nginx Pod:

[root@ip-192-168-193-172 ~ (⎈ |kubernetes-# kubectl get pod  NAME                     READY   STATUS    RESTARTS   AGE  nginx-6984d55cb6-b7zgp   2/2     Running   0          5m23s  nginx-6984d55cb6-bd8nf   2/2     Running   0          5m23s  nginx-6984d55cb6-dljzx   2/2     Running   0          5m23s  nginx-6984d55cb6-gn94v   2/2     Running   0          5m23s  nginx-6984d55cb6-kcj62   2/2     Running   0          5m23s

使用iexec可以直接運行如下命令:

kubectl iexec nginx

結果如下:

我們知道通過Deployment創建的Pod,Pod的命名格式為Deployment名字+加上Deployment的一段hash + Replica的一段hash,我們通常只記得Deployment的名字,而不知道Pod的名字,通過iexe只需要輸入Deployment名字即可,通過互動式選擇Pod,非常方便。

doctor

和brew doctor類似的工具,用於檢查Kubernetes的健康狀況以及掃描Kubernetes集群中的異常資源,比如etcd member狀態、Node狀態、孤兒endppoint等。

# kubectl doctor  ---   TriageReport:  - Resource: Endpoints    AnomalyType: Found orphaned endpoints!    Anomalies:    - kube-controller-manager    - kube-scheduler    - virt-controller    - virt-operator

access-matrix

查看許可權矩陣,比如查看針對Pod的API操作許可權:

df-pv

kubectl目前只能獲取pv的空間大小,而無法顯示pv的真實使用情況,但其實kubelet summary API從1.8版本開始就已經有這些數據了,但官方kubectl工具還無法直接顯示這些數據。

df-pv插件通過讀取的summay API獲取pv的使用量:

resource-capacity/view-allocations

查看Node節點的CPU和記憶體使用情況:

如果要查看更詳細,細粒度到每個Pod,則可以使用view-allocations插件:

tail

我們知道kubectl的logs命令查看日誌需要指定pod名稱,如果一個pod還有多個容器,還需要指定容器名稱,而tail插件支援同時查看多個pod的日誌,支援通過Deployment、ReplicaSet等資源類型過濾日誌。

Kubernetes實用命令行工具

kube-ps1 / kube-tmux

kube-ps1腳本即修改PS1環境變數,實現把Kubernetes的context資訊如cluster名稱、namespace等顯示在bash/zsh的命令提示符中:

而kube-tmux則把資訊顯示在tmux:

kube-shell / kube-prompt

kube-shell和kube-prompt都是基於kubectl實現的互動式shell,支援命令自動補全、關鍵字高亮等功能。

其中kube-shell基於Python實現,使用起來和ipython差不多。

不過實測kube-shell命令補全功能不是很全,比如 --all-namespaces這個參數就補全不了,並且也不支援資源的自動補全。註:圖中的灰色 --all-namespaces參數不是自動補全,而是類似fish的歷史命令提示。

因此更推薦使用 kube-prompt,kube-prompt支援資源的自動補全:

不過個人認為kubectl自帶的命令自動補全功能已經夠用了:

source <(kubectl completion bash)

如果需要頻繁切換kubectl shell和OS shell,個人覺得使用OS shell + kubectl自動補全反而效率更高。

終極工具k9s

最後介紹一個終極Kubernetes命令行工具k9s,看它的logo就很形象,就是用來管理k8s資源的:

k9s是基於curses實現的終端UI互動式Kubernetes資源管理工具,操作有點類似vim,支援命令模式,支援alias、插件、自定義主題等功能,通過k9s能夠互動式進行資源的增刪改查、查看pod日誌、exec等:

如上通過命令模式輸入 :deploy進入Deployment頁面,然後按快捷鍵 s修改Replicas數量,回車進入該Deployment Pod列表,可以通過j、k鍵移動游標選擇Pod,快捷鍵 l查看Pod日誌, s通過exec進入Pod shell,非常方便。