使用阿里開源的這款K8s環境本地測試聯調工具,效率高的飛起
在我們系統部署到 k8s集群以后,開發測試模式也會有一定變化,下面是一些常見的問題,如果處理不好,直接影響我們的效率
- 本地服務如何訪問k8s集群里面的服務進行功能測試?
- 本地如何快速訪問k8s集群中資源,比如訪問某個微服務的 swagger?
- 如何把k8s集群里面流量轉發到本地服務,進行功能測試?
- 如何臨時快速部署一個服務到 k8s集群 里面進行功能驗證?
以上問題,我相信大多數開發者都會遇到過,而且常用的方式應該是把服務部署到 k8s中在進行測試,這種方式雖然簡單,但是效率很低,因為我們的系統還在單元測試,遇到的bug會比較多,每次改動都要重新發布,時間都花費在系統打包部署上面了
下面推薦一個阿里開源的k8s工具,它可以幫助我們解決以上問題
KtConnect介紹
圖片
KtConnect(Kt為Kubernetes Toolkit集群工具包的簡寫)由阿里開源,是一款基于k8s環境用于提高本地測試聯調效率的小工具,它提供了本地和測試環境集群的雙向互聯能力
地址:https://github.com/alibaba/kt-connect
特性
- Connect:建立數據代理通道,實現本地服務直接訪問Kubernetes集群內網(包括Pod IP和Service域名)
- Exchange:讓集群服務流量重定向到本地,實現快速驗證本地版本和調試排查問題
- Mesh:創建路由規則重定向特定流量,實現多人協作場景下互不影響的本地調試
- Preview:暴露本地服務到集群,實現無需發布即可在線預覽集成效果
快速體驗
在這篇文檔里,使用一個簡單的示例,來快速演示通過KtConnect完成本地直接訪問集群中的服務、以及將集群中指定服務的請求轉發到本地的過程。
安裝
brew install kt-connect
圖片
部署實例應用
為了便于展示結果,首先在集群中部署一個Tomcat服務并創建一個默認首頁:
kubectl create deployment tomcat --image=tomcat:9 --port=8080
kubectl expose deployment tomcat --port=8080 --target-port=8080
kubectl exec deployment/tomcat -c tomcat -- /bin/bash -c 'mkdir webapps/ROOT; echo "hello world v1" > webapps/ROOT/index.html'
圖片
查詢Pod和服務的IP地址:
kubectl get pod -o wide --selector app=tomcat
kubectl get svc tomcat
圖片
可知Tomcat實例的Pod IP為172.18.25.22,服務的Cluster IP為192.168.220.59,記下待用。
連接集群網絡
使用ktctl connect命令建立從本地到集群的網絡通道,注意該命令需要管理員權限。
sudo ktctl connect
圖片
本地訪問集群資源
輸出以上日志以后,就可以在本地直接訪問集群資源了,可通過瀏覽器或curl命令來驗證:
# 在本地直接訪問PodIP
curl http://172.18.25.22:8080
#在本地訪問ClusterIP
curl http://192.168.220.59:8080
#使用<service>作為域名訪問服務
curl http://tomcat:8080
#使用<servicename>.<namespace>域名訪問服務
curl http://tomcat.default:8080
# 使用集群內完整域名訪問服務
curl http://tomcat.default.svc.cluster.local:8080
圖片
將集群流量轉發到本地
為了驗證集群訪問本地服務的場景,我們在本地也啟動一個Tomcat的容器,并為其創建一個內容不同的首頁。
docker run -d --name tomcat -p 8080:8080 tomcat:9
docker exec tomcat /bin/bash -c 'mkdir webapps/ROOT; echo "hello world local v2" > webapps/ROOT/index.html'
圖片
KtConnect提供了兩種能夠讓集群流量重定向到本地服務的命令,使用場景上稍有不同。
- Exchange:將集群指定服務的所有流量轉向本地
- Mesh:將集群指定服務的部分流量(按Header或Label規則)轉向本地
Exchange命令
將k8s集群里訪問指定服務的所有請求攔截并轉發到本地的指定端口上。通常用于調試在測試環境里,當前服務未部署到 k8s 集群,又想快速驗證的場景
圖片
使用ktctl exchange命令將先前部署到集群中的tomcat服務流量全部轉到本地8080端口:
ktctl exchange tomcat --expose 8080
圖片
在本地或者集群中訪問示例開始時部署到集群的tomcat服務,查看輸出結果:
如果未運行ktctl connect,只能從k8s集群內訪問
curl http://tomcat:8080
圖片
可以看到,訪問集群里tomcat服務的請求轉發到了本地的Tomcat實例
如果我們微服務部署在 K8s 中還是使用的eureka或者 nacos,這種方式可能不支持,因為這種方式是服務消費方直接調用的服務提供方的 pod ip 地址
Mesh命令
將集群里訪問指定服務的部分請求攔截并轉發到本地的指定端口。通常用于團隊協作時,需要定向調試調用鏈中間位置的服務,又不希望影響其他開發者正常使用測試環境的場景。
圖片
Mesh命令,能夠直接實現HTTP請求的自動按需路由,為了便于驗證結果,先停止ktctl exchange 命令。然后通過ktctl mesh命令創建代理Pod:
ktctl mesh tomcat --expose 8080
圖片
查看以上紅色標記部分,輸出了一個特定的Header值。此時,直接訪問集群里的tomcat服務,流量將正常進入集群的服務實例,若請求包含Mesh命令輸出的Header,則會轉發流量到本地服務實例
curl http://tomcat:8080
curl -H 'VERSION: feo3x' http://tomcat:8080
圖片
實際測試中可以使用ModHeader插件,在瀏覽器發起http中自動追加自定義 header
圖片
圖片
將本地服務提供給其他開發者
在開發過程中,也可以利用KtConnect將本地服務快速"部署"到集群,變成一個臨時的服務,供其他開發者或集群中的其他服務臨時使用。
- Preview:將本地服務注冊為集群里的Service
- Forward:將集群服務映射到本地,結合Preview命令可實現開發者之間跨主機使用Localhost地址互訪
Preview命令
將本地運行的服務實例注冊到集群上。主要用于將本地開發中的服務提供給其他開發者進行聯調和預覽。
下面使用ktctl preview命令將運行在本地8080端口的服務注冊到測試集群,命名為tomcat-v2。
ktctl preview tomcat-v2 --expose 8080
圖片
注冊成功以后,集群里的服務就可以通過tomcat-v2名稱來訪問本地注冊的服務實例了
圖片
其他開發者也可以在執行ktctl connect后,直接通過tomcat-v2服務名稱來預覽該服務的實時情況:
圖片
Forward命令
將任意IP或集群中的服務映射到本地的指定端口。用于在測試時,使用localhost地址便捷的訪問集群中的特定IP或服務,典型場景是是訪問其他開發者通過Preview命令注冊的本地服務。
圖片
如上圖當開發者A運行了前述的Preview命令后,開發者B可以使用ktctl forward命令將它映射到自己本地的9090端口,然后進行調用
ktctl forward tomcat-v2 9090:8080
圖片
執行完以上命令后,開發者就可以訪問localhsot:9090 執行
圖片
是不是感覺forward命令與kubectl port-forward命令相似,其實這塊只是額外增加了斷網自動重連的能力。