利用Squash进行微服务调试
Squash是为微服务架构专门设计的调试工具,支持远程单步跟踪。
微服务架构下,应用程序的调试是困难的,其状态跨越多个微服务传播,你很难得到应用程序的整体状态。Tracing可以协助开发人员了解事务的整体流程、Istio等服务网格可以监控网络,定位延迟为她。但是,直接在运行时干预应用程序执行的工具一直缺失。
传统单体应用的调试器能够为开发人员提供巨大帮助,调试器包括的功能如断点、修改变量、单步执行,让各种疑难问题很容易的被定位。Squash为运行在容器编排平台上的微服务带来这些功能,它将容器编排平台和IDE(例如Intellij)桥接起来,用户可以自由选择它想调试的容器、Pod、服务或者镜像,并在其代码中设置断点、单步跟踪,甚至是跨越多个微服务的单步跟踪。
Squash以一种可扩展的架构设计,很容易支持更多的平台、Debugger、IDE。
目前,Envoy已经支持Squash的HTTP过滤器,可以辅助定位需要被调试的微服务。
在Kubernetes上运行,持有每个应用程序的断点信息、编排、控制Squash客户端。
在Kubernetes上以Daemonset的形式运行,包含Debugger的二进制文件。
提供用户接口。
当你通过CLI发起调试请求时,Squash服务器会提供一个调试端口,调试客户端连接此端口进行调试。
Squash服务器会找到目标容器所在机器的Squash客户端,向其发送被调试容器的信息、断点信息。
Squash客户端会通过CRI获取容器在宿主机上的PID,然后启动一个Debugger并Attach到目标进程、设置断点。客户端会把Debugger的连接信息返回给Squash服务器。
1 2 |
curl -o squash -L https://github.com/solo-io/squash/releases/download/v0.2.1/squash-linux chmod +x squash |
执行下面的命令在K8S上安装Squash服务器和客户端:
1 2 |
kubectl create -f https://raw.githubusercontent.com/solo-io/squash/master/contrib/kubernetes/squash-server.yml kubectl create -f https://raw.githubusercontent.com/solo-io/squash/master/contrib/kubernetes/squash-client.yml |
1 2 3 4 |
export SQUASH_SERVER_URL=http://localhost:16443/api/v1/namespaces/squash/services/squash-server:http-squash-api/proxy/api/v2 kubectl proxy --port=16443 squash list attachments |
构建时需要保留调试信息。
通过kubectl查找你需要调试的Pod:
1 2 3 |
alex@Zircon:~$ kubectl -n istio-system get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE istio-pilot-8499b75d94-6c8kl 2/2 Running 0 2m39s 172.27.121.148 xenial-101 <none> |
命令格式:
1 |
squash debug-container image pod container [type] [flags] |
示例:
1 |
squash debug-container docker.gmem.cc/istio/pilot:1.0.5 istio-pilot-8499b75d94-6c8kl discovery dlv -n istio-system |
标准输出会打印一个Debug Config ID:
1 |
Debug config id: ONRhfKsUOH |
1 |
squash wait ONRhfKsUOH |
调试器的监听地址会打印在标准输出上:
1 |
Debug session started! debug server is at: squash-client-pszzp.squash:35001 |
在你本地执行:
1 |
kubectl port-forward -n squash squash-client-pszzp 2345:35001 |
1 |
dlv connect localhost:2345 |
Leave a Reply