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