Go运行Terratest校验AWS EKS报spdy.NewRoundTripperWithProxy参数过多错误
问题现象
运行用于AWS EKS集群K8s Pod部署、校验、卸载全流程的Terratest Go测试代码时,触发编译报错:
调用
spdy.NewRoundTripperWithProxy时传入参数过多
- 同一套测试脚本3个月前可正常运行,初步判定为K8s生态依赖版本迭代引发的兼容性问题
- 执行
go mod init、go mod tidy均无异常,仅运行go test时触发报错,无法直接定位到脚本内触发报错的具体行号
根因说明
该报错属于K8s Go客户端依赖版本不匹配的典型问题:
spdy.NewRoundTripperWithProxy是k8s.io/client-go/transport/spdy包下的方法,在k8s.io/client-gov0.27.0及以上版本中做了不兼容的签名变更,删除了原有的tlsConfig入参;旧版本Terratest或代码中直接/间接调用该方法时,如果按旧签名传入4个参数,就会触发参数过多的编译错误go mod tidy阶段仅做依赖图解析,不会校验跨包的函数签名匹配性,只有go test编译测试二进制阶段才会做全量代码的签名校验,因此前期不会暴露问题
修复方案
按优先级选择以下方案处理即可:
方案1:对齐全量K8s依赖版本(推荐)
Terratest对K8s相关依赖的版本有严格的绑定要求,禁止混用不同小版本的k8s.io系依赖:
- 先查询当前Terratest版本默认绑定的client-go版本:
go list -m all | grep k8s.io/client-go
- 在
go.mod文件末尾添加replace规则,将所有k8s.io开头的依赖强制统一为和上述查询结果完全一致的版本,示例(版本号替换为你实际查询到的值即可):
replace ( k8s.io/api => k8s.io/api v0.26.3 k8s.io/apimachinery => k8s.io/apimachinery v0.26.3 k8s.io/client-go => k8s.io/client-go v0.26.3 k8s.io/kubectl => k8s.io/kubectl v0.26.3 )
- 重新执行
go mod tidy拉取对齐后的依赖,再运行go test即可。
方案2:升级Terratest适配高版本K8s依赖
如果业务本身需要使用v0.27.0及以上版本的client-go,直接将Terratest升级到v0.43.0及以上版本,该版本已适配spdy包的方法签名变更,升级后重新执行依赖拉取即可解决问题。
报错位置快速定位方法
如果上述方案处理后仍存在问题,可以执行带编译日志的测试命令,直接定位触发签名不匹配的依赖包:
go test -v -x ./... 2>&1 | grep -A5 -B5 "NewRoundTripperWithProxy"
内容的提问来源于stack exchange,提问作者Sanjay Gayakwad
相关产品推荐
相关产品推荐

