在 K8s 集群中調(diào)試微服務(wù)很困難。有時(shí)我們遇到在不真實(shí)的環(huán)境下難以復(fù)現(xiàn)的 bug。在本機(jī)用你最習(xí)慣的工具調(diào)試達(dá)到和在集群中運(yùn)行服務(wù)一樣的效果,這其實(shí)只需要運(yùn)行幾個命令。
所用工具
為了達(dá)到目標(biāo)效果,我主要用如下工具:
Gebug
https://github.com/moshebe/gebug
這個開源工具讓調(diào)試容器化了的Go程序非常方便,它是通過開啟熱更新和debugger配置實(shí)現(xiàn)的。我就是這個工具的作者嘻嘻。
Telepresence
https://www.telepresence.io/
這是一個很厲害的 CNCF 項(xiàng)目,這個項(xiàng)目可以用來與集群網(wǎng)絡(luò)做網(wǎng)絡(luò)隧道。
我認(rèn)為,熟悉一個工具最好的辦法就是去用它,接著就來配置demo環(huán)境。
Kubernetes集群
我們使用一個小kubernetes集群,跑一個hello-world deployment、暴露一個服務(wù)。
既然是要做demo,我就用minikube了。如果你已經(jīng)有一個運(yùn)行中的非生產(chǎn)環(huán)境集群,那么你就用你的集群。注意不要在生產(chǎn)環(huán)境做測試。
kubectlcreatedeploymenthello-world--image=datawire/hello-world
kubectlexposedeploymenthello-world--type=LoadBalancer--port=8000
當(dāng)前kubernets集群狀態(tài)
查看service external endpoint
并跑些測試:
使用minikube提供的命令拉取外部地址。也可以通過kubectl get service hello world
命令并查看 EXTERNAL_IP 字段內(nèi)的信息。img
hello world 服務(wù)
我們的hello-world部署很成功。我們來做一次把http返回做成json格式。
當(dāng)然也可以編譯你的程序、打鏡像、push到倉庫、編輯deployment、等等等等,最后搞定。我們來用短平快的辦法做這事。
這是個簡單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:[]
注意,如果沒有安裝Gebug可以運(yùn)行go get -u github.com/moshebe/gebug
安裝。
Telepresence
這個強(qiáng)大的工具讓我們繞過了復(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
上面這個命令做了幾件事:
-
開一個程序負(fù)責(zé)把命中的DNS和IP段的請求重定向到k8s集群上
-
swap-deployment
這個選項(xiàng)是讓Telepresence用運(yùn)行在Telepresence代理上的東西替換掉已經(jīng)存在的hello-world pod。一旦我們退出,老pod也會被恢復(fù)。 -
run
選項(xiàng)告訴Telepresence用Gebug工具運(yùn)行我們的服務(wù),把這個服務(wù)和網(wǎng)絡(luò)代理綁定。
只要 http server 在 telepresence 中運(yùn)行著,就可以從 k8s 集群內(nèi)部訪問這個服務(wù)。
展示一下
下面演示 debug 一個發(fā)到 k8s 暴露的 endpoint 的請求:
完成。希望你可以從中獲益,為你調(diào)試微服務(wù)提速。
責(zé)任編輯:xj
原文標(biāo)題:K8S 集群內(nèi) Debug 微服務(wù)的最佳實(shí)踐
文章出處:【微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
集群
+關(guān)注
關(guān)注
0文章
101瀏覽量
17377 -
DEBUG
+關(guān)注
關(guān)注
3文章
94瀏覽量
20401 -
微服務(wù)器
+關(guān)注
關(guān)注
0文章
13瀏覽量
8201
原文標(biāo)題:K8S 集群內(nèi) Debug 微服務(wù)的最佳實(shí)踐
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Ubuntu K8s集群安全加固方案
k8s集群安全機(jī)制說明
搭建k8s需要買幾臺云主機(jī)?
自建K8S集群認(rèn)證過期
k8s和docker區(qū)別對比,哪個更強(qiáng)?
k8s微服務(wù)架構(gòu)就是云原生嗎?兩者是什么關(guān)系
混合云部署k8s集群方法有哪些?
k8s云原生開發(fā)要求

云服務(wù)器部署k8s需要什么配置?
納尼?自建K8s集群日志收集還能通過JMQ保存到JES
常用的k8s容器網(wǎng)絡(luò)模式有哪些?
K8S集群中使用JDOS KMS服務(wù)對敏感數(shù)據(jù)安全加密

K8S學(xué)習(xí)教程(二):在 PetaExpress KubeSphere容器平臺部署高可用 Redis 集群

K8S學(xué)習(xí)教程一:使用PetaExpress云服務(wù)器安裝Minikube 集群

評論