1. 简介
Squash是为微服务架构专门设计的调试工具,支持远程单步跟踪。
微服务架构下,应用程序的调试是困难的,其状态跨越多个微服务传播,你很难得到应用程序的整体状态。Tracing可以协助开发人员了解事务的整体流程、Istio等服务网格可以监控网络,定位延迟为她。但是,直接在运行时干预应用程序执行的工具一直缺失。
传统单体应用的调试器能够为开发人员提供巨大帮助,调试器包括的功能如断点、修改变量、单步执行,让各种疑难问题很容易的被定位。Squash为运行在容器编排平台上的微服务带来这些功能,它将容器编排平台和IDE(例如Intellij)桥接起来,用户可以自由选择它想调试的容器、Pod、服务或者镜像,并在其代码中设置断点、单步跟踪,甚至是跨越多个微服务的单步跟踪。
Squash以一种可扩展的架构设计,很容易支持更多的平台、Debugger、IDE。
目前,Envoy已经支持Squash的HTTP过滤器,可以辅助定位需要被调试的微服务。
2. 组件
2.1 Squash服务器
在Kubernetes上运行,持有每个应用程序的断点信息、编排、控制Squash客户端。
2.2 Squash客户端
在Kubernetes上以Daemonset的形式运行,包含Debugger的二进制文件。
2.3 Squash CLI
提供用户接口。
3. 工作原理
当你通过CLI发起调试请求时,Squash服务器会提供一个调试端口,调试客户端连接此端口进行调试。
Squash服务器会找到目标容器所在机器的Squash客户端,向其发送被调试容器的信息、断点信息。
Squash客户端会通过CRI获取容器在宿主机上的PID,然后启动一个Debugger并Attach到目标进程、设置断点。客户端会把Debugger的连接信息返回给Squash服务器。
4. 安装
命令行
1 | curl -o squash -L https://github.com/solo-io/squash/releases/download/v0.2.1/squash-linux |
K8S组件
执行下面的命令在K8S上安装Squash服务器和客户端:
1 | kubectl create -f https://raw.githubusercontent.com/solo-io/squash/master/contrib/kubernetes/squash-server.yml |
测试
1 | export SQUASH_SERVER_URL=http://localhost:16443/api/v1/namespaces/squash/services/squash-server:http-squash-api/proxy/api/v2 |
5. 调试
5.1 调试Go服务
构建
构建时需要保留调试信息。
查找Pod
通过kubectl查找你需要调试的Pod:
1 | alex@Zircon:~$ kubectl -n istio-system get pod -o wide |
请求Attach到容器
命令格式:
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 |
等待Debugger连接
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 |