如何提升Kubernetes生產(chǎn)力?我有5個實用技巧分享給你
在觀察和閱讀很多其它人操作 Kubernetes 和 Istio 的過程中,我了解到了他們?yōu)榱诉M一步提高生產(chǎn)力,在搭建環(huán)境以及使用各類工具、技巧和訣竅過程中積累的經(jīng)驗。本文總結了我每天都會使用的 5 個技巧和工具,它們進一步提高了我操作 Kubernetes 和 Istio 時的生產(chǎn)力。
1. 在 Kubernetes 上下文之間切換
如果同時運行本地 Kubernetes 實例以及一個或多個云端 Kubernetes 實例,那么你可能時不時就需要在不同上下文之間切換。Kubernetes CLI(kubectl)提供了用于在不同上下文之間執(zhí)行操作的命令,例如:
current-contextget-contextsrename-contextdelete-contextset-context – use-context
對于想要切換到的 Kubernetes 上下文,如果知道它的名稱,那么可以使用如下的命令:
- kubectl use-context [CONTEXT-NAME]
但如果需要操作多個集群,并且不知道各種上下文的名稱,此時就需要首先列出所有上下文,隨后像這樣運行 use-context 命令:
- $ kubectl get-contexts
- CURRENT NAME CLUSTER AUTHINFO NAMESPACE
- * docker-desktop docker-desktop docker-desktop
- minikube minikube minikube
- cloudc crdambvg43d user-crdambvg43d
- $ kubectl use-context minikube
其實還有更簡單的方法。我用了一款名為 kubectx 的工具,該工具可以列出不同的 Kubernetes 上下文并快速切換。若要列出上下文,可以這樣運行 kubectx:
- $ kubectx
- docker-desktop
- minikub
- cloudc
切換至不同上下文的方法也很簡單:
- $ kubectx [CONTEXT-NAME]
2. 在 Kubernetes 名稱空間之間切換
在操作 Kubernetes 時,處理來自不同名稱空間的資源,這也是一種很常見的做法。例如,你可能希望列出一個名稱空間內的所有 Pod,隨后檢查另一個名稱空間中的服務。此時我的做法是使用 Kubernetes CLI 所支持的 --namespace 標記。例如,若要查看名為 Test 的名稱空間中的所有 Pod,可以運行 kubectl get pods -n test。默認情況下,如果不提供名稱空間標記,將使用默認的 Kubernetes 名稱空間,即 default。
這個默認值可以在 kubeconfig 文件中修改,例如我們可以將默認名稱空間設置為 test、kube-system 或其他任何名稱空間。這樣在查詢資源時就不需要使用 --namespace 標記了。不過更改默認值的命令略微繁瑣:
- $ kubectl config set contexts.my-context.namespace my-namespace
上述命令會更改 my-context 上下文的 Namespace 字段,將其改為 my-namespace。這也意味著,舉例來說,如果切換到 my-context 隨后運行 kubectl get pods,將只能看到 my-namespace 名稱空間下的 Pod。
除了使用 kubectx,我們還可以使用一款名為 kubens 的工具,后者可以幫助我們列出并切換至不同名稱空間。
- $ kubens
- default
- docker
- kube-node-lease
- kube-public
- kube-system
為所選上下文設置默認名稱空間,這也是一種快速簡單的操作:
- $ kubens default
- Context "docker-desktop" modified.
- Active namespace is "default".
3. 為 Kubernetes CLI 設置別名
這是一種非常簡單的技巧。操作 Kubernetes 過程中,我們可能需要頻繁輸入 kubectl,時間一長肯定會對輸入全名的繁瑣過程感到厭倦。雖然每次只需要輸入七個字母,但多次頻繁輸入總歸很麻煩。
此時的技巧是,為 kubectl 設置一個更簡單的別名,例如 k:
- $ alias k=kubectl
- $ k get po
- NAME READY STATUS RESTARTS AGE
- mypod 1/1 Running 18 43h
理想情況下,我們應該將 k=kubectl 這樣的別名保存到 bash_profile 中,這樣每次打開終端后都將自動設置。
4. 在 Kubernetes 集群中運行 terminal
在訪問集群中的服務和 Pod 時,我們需要將其暴露出來,這樣才可以從公網(wǎng)訪問它們,或在本機和集群中運行的服務之間運行 Kube 代理或轉發(fā)端口。
然而有時候我們可能并不想暴露任何服務或轉發(fā)端口,而只需要運行某些非常簡單的 Curl 命令。為此我會通過 Bash profile 加載一個函數(shù),借此在集群內部使用 radial/busyboxplus:curl 鏡像運行一個 Pod,通過這樣的方式就可以訪問終端,進而可以針對集群內部的服務和 IP 運行 Curl 命令。我將這個函數(shù)稱之為 kbash,用法如下:
- $ kbash
- If you don't see a command prompt, try pressing enter.
- [ root@curl:/ ]$
在上述命令提示符下,我可以針對內部的 Kubernetes DNS 名稱或 IP 地址運行 Curl 命令。如果需要退出,只需要運行 exit 即可;如果需要重新連接到該 Pod,則可運行 kbash 連接到現(xiàn)有 Pod。同時我還將這個函數(shù)定義到了自己的 dotfiles 中。
5. 快速打開 Grafana/Jaeger/Kiali
如果打算使用 Istio 服務網(wǎng)格(Service mesh),那么可能還會用到 Grafana/Jaeger/Kiali。訪問這些服務時必需首先獲得 Pod 名稱,隨后針對該 Pod 設置端口轉發(fā),最后才能打開瀏覽器訪問轉發(fā)后的地址。每次需要輸入的命令都很長:
- $ kubectl get pods --namespace istio-system -l "app=grafana" -o jsonpath="{.items[0].metadata.name}"
- grafana-6fb9f8c5c7-hrcqp
- $ kubectl --namespace istio-system port-forward grafana-6fb9f8c5c7-hrcqp 3000:3000
- $ open http://localhost:3000
而更簡單快捷的方法是為每個服務創(chuàng)建函數(shù)或別名。例如,我通過使用 Bash profile 加載的一個文件為 Grafana/Jaeger/Kiali 添加了如下設置:
- #!/bin/bash
- export GRAFANA_POD=$(kubectl get pods --namespace istio-system -l "app=grafana" -o jsonpath="{.items[0].metadata.name}")
- export JAEGER_POD=$(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}')
- export KIALI_POD=$(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}')
- alias grafana="kubectl --namespace istio-system port-forward $GRAFANA_POD 3000:3000 & open http://localhost:3000"
- alias jaeger="kubectl --namespace istio-system port-forward $JAEGER_POD 16686:16686 & open http://localhost:16686"
- alias kiali="kubectl --namespace istio-system port-forward $KIALI_POD 20001:20001 & open http://localhost:20001"
這樣,如果需要打開 Jaeger,只需要運行 jaeger 就可以獲得 Pod 名稱,創(chuàng)建端口轉發(fā)并打開瀏覽器。
如果你在集群中運行了其他什么需要頻繁訪問的服務,也可以用類似方式來設置別名。