0%

利用 Squash 对微服务中的 golang 程序进行远程调试

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
2
curl -o squash -L https://github.com/solo-io/squash/releases/download/v0.2.1/squash-linux
chmod +x squash

K8S组件
执行下面的命令在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

5. 调试

5.1 调试Go服务

构建
构建时需要保留调试信息。

查找Pod
通过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>

请求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