分享幾個超級實用的插件和工具,輕鬆提高工作效率
- 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節點上創建一個 DebugAgent
Pod,創建的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,非常方便。