如何使用Goland调试Kubernetes集成/E2E测试及源码?
当然可以用Goland调试Kubernetes集成测试!
作为K8s源码新手,我完全理解你想用IDE调试替代纯命令行的需求——毕竟单步跟踪源码比啃日志高效太多了。下面就手把手教你配置针对TestPodUpdateActiveDeadlineSeconds这个测试的调试环境:
前期准备
- 先确保你已经在本地执行过至少一次
make test-integration命令,这样所有依赖包、测试所需的二进制文件都会提前编译好,避免调试时因为缺失组件卡住 - 用Goland打开Kubernetes源码的根目录,让IDE自动识别整个项目的模块结构
配置Run/Debug Configuration
- 点击Goland顶部菜单栏的
Run->Edit Configurations - 点击左上角的
+号,选择Go Test(别选错成Go Build哦) - 在
Configuration标签页里填写以下内容:- Package path:直接输入
k8s.io/kubernetes/test/integration/pods,或者点击右侧文件夹图标,选中源码里的test/integration/pods目录 - Test kind:选择
Package(因为我们要跑整个包下的指定测试用例) - Go tool arguments:填入
-v,对应你命令行里的GOFLAGS="-v",用来输出详细的测试日志 - Program arguments:填入
-run ^TestPodUpdateActiveDeadlineSeconds$,对应KUBE_TEST_ARGS的内容,用来指定只运行这个测试用例
- Package path:直接输入
- 切换到
Environment标签页,添加几个关键环境变量:GO111MODULE=on:确保IDE用Go Module模式管理依赖KUBE_TEST_INTEGRATION=true:告诉测试框架这是集成测试,加载对应的配置- 如果你的测试需要访问本地集群,还可以添加
KUBE_CONFIG_PATH=/path/to/your/kubeconfig(不过大部分集成测试会启动临时的etcd和apiserver,不用额外配置)
- 点击
Apply保存配置,然后点击调试按钮(绿色虫子图标)就可以启动调试了!
调试小技巧
- 在测试代码
test/integration/pods/pods_test.go里找到TestPodUpdateActiveDeadlineSeconds函数,或者在K8s核心源码(比如pkg/controller/pod下的相关文件)里打断点,测试运行到断点处会自动暂停 - 调试过程中可以查看变量值、调用栈,甚至修改临时变量来验证你的猜想,和调试普通Go程序完全一致
- 如果测试启动了临时的etcd、apiserver进程,Goland会自动关联这些进程的调试信息,不用担心跟踪不到核心代码
注意事项
- 第一次调试启动会比较慢,因为要重新编译测试组件和依赖,请耐心等待
- 如果遇到“找不到包”的错误,检查Goland的
Go Modules配置(File->Settings->Go->Go Modules),确保Module GOPATH指向你的K8s源码根目录 - 部分集成测试需要特定的系统权限(比如创建网络命名空间),如果遇到权限问题,可以用sudo启动Goland(或者在终端里用sudo运行Goland,具体取决于你的操作系统)
内容的提问来源于stack exchange,提问作者Wenjia Zhang




