在 K8s 集群中調(diào)試微服務(wù)很困難。有時(shí)我們遇到在不真實(shí)的環(huán)境下難以復(fù)現(xiàn)的 bug。在本機(jī)用你最習(xí)慣的工具調(diào)試達(dá)到和在集群中運(yùn)行服務(wù)一樣的效果,這其實(shí)只需要運(yùn)行幾個(gè)命令。
所用工具
為了達(dá)到目標(biāo)效果,我主要用如下工具:
Gebug
https://github.com/moshebe/gebug
這個(gè)開(kāi)源工具讓調(diào)試容器化了的Go程序非常方便,它是通過(guò)開(kāi)啟熱更新和debugger配置實(shí)現(xiàn)的。我就是這個(gè)工具的作者嘻嘻。
Telepresence
https://www.telepresence.io/
這是一個(gè)很厲害的 CNCF 項(xiàng)目,這個(gè)項(xiàng)目可以用來(lái)與集群網(wǎng)絡(luò)做網(wǎng)絡(luò)隧道。
我認(rèn)為,熟悉一個(gè)工具最好的辦法就是去用它,接著就來(lái)配置demo環(huán)境。
Kubernetes集群
我們使用一個(gè)小kubernetes集群,跑一個(gè)hello-world deployment、暴露一個(gè)服務(wù)。
既然是要做demo,我就用minikube了。如果你已經(jīng)有一個(gè)運(yùn)行中的非生產(chǎn)環(huán)境集群,那么你就用你的集群。注意不要在生產(chǎn)環(huán)境做測(cè)試。
kubectlcreatedeploymenthello-world--image=datawire/hello-world
kubectlexposedeploymenthello-world--type=LoadBalancer--port=8000
當(dāng)前kubernets集群狀態(tài)
查看service external endpoint
并跑些測(cè)試:
使用minikube提供的命令拉取外部地址。也可以通過(guò)kubectl get service hello world
命令并查看 EXTERNAL_IP 字段內(nèi)的信息。img
hello world 服務(wù)
我們的hello-world部署很成功。我們來(lái)做一次把http返回做成json格式。
當(dāng)然也可以編譯你的程序、打鏡像、push到倉(cāng)庫(kù)、編輯deployment、等等等等,最后搞定。我們來(lái)用短平快的辦法做這事。
這是個(gè)簡(jiǎn)單HTTP server:
packagemain
import(
"fmt"
"net/http"
)
funcmain(){
http.HandleFunc("/",func(whttp.ResponseWriter,r*http.Request){
fmt.Println("Gotrequest")
fmt.Fprintf(w,`{"hello":"world"}`)
})
http.ListenAndServe(":8000",nil)
}
這是Gebug配置:
name:my-server
output_binary:/app
build_command:gobuild-gcflags="all=-N-l"-o/app
run_command:/app
runtime_image:golang:1.15.2
debugger_enabled:true
debugger_port:4321
expose_ports:
-8000:8000
networks:[]
environment:[]
注意,如果沒(méi)有安裝Gebug可以運(yùn)行go get -u github.com/moshebe/gebug
安裝。
Telepresence
這個(gè)強(qiáng)大的工具讓我們繞過(guò)了復(fù)雜難懂的網(wǎng)絡(luò)配置,可以直接把服務(wù)連接到集群中。
安裝指南: https://www.telepresence.io/reference/install
下一步是暴露本地的服務(wù)、把流量連接到集群,就可以替換掉已經(jīng)存在的deployment了。
我們的deployment叫hello-world,暴露8000端口,命令如下:
telepresence--swap-deploymenthello-world--expose8000:8000--methodinject-tcp--rungebugstart
上面這個(gè)命令做了幾件事:
-
開(kāi)一個(gè)程序負(fù)責(zé)把命中的DNS和IP段的請(qǐng)求重定向到k8s集群上
-
swap-deployment
這個(gè)選項(xiàng)是讓Telepresence用運(yùn)行在Telepresence代理上的東西替換掉已經(jīng)存在的hello-world pod。一旦我們退出,老pod也會(huì)被恢復(fù)。 -
run
選項(xiàng)告訴Telepresence用Gebug工具運(yùn)行我們的服務(wù),把這個(gè)服務(wù)和網(wǎng)絡(luò)代理綁定。
只要 http server 在 telepresence 中運(yùn)行著,就可以從 k8s 集群內(nèi)部訪問(wèn)這個(gè)服務(wù)。
展示一下
下面演示 debug 一個(gè)發(fā)到 k8s 暴露的 endpoint 的請(qǐng)求:
完成。希望你可以從中獲益,為你調(diào)試微服務(wù)提速。
責(zé)任編輯:xj
原文標(biāo)題:K8S 集群內(nèi) Debug 微服務(wù)的最佳實(shí)踐
文章出處:【微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
集群
+關(guān)注
關(guān)注
0文章
86瀏覽量
17181 -
DEBUG
+關(guān)注
關(guān)注
3文章
94瀏覽量
19934 -
微服務(wù)器
+關(guān)注
關(guān)注
0文章
11瀏覽量
8103
原文標(biāo)題:K8S 集群內(nèi) Debug 微服務(wù)的最佳實(shí)踐
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論