通过端口转发访问K8s Pod中MongoDB和Kafka:karate.fork调用报错
Kubernetes端口转发脚本的Karate调用问题
问题背景
我们的MongoDB和Kafka部署在Kubernetes Pod中,需先完成K8s集群认证,再通过端口转发才能访问。本地终端可通过两个脚本完成操作:
- Terminal 1(kubeConnection.sh):
export DEV_DB_PORT=27017 export DEV_DB_ENDPOINT=db.endpoint export DEV_APP_SERVICE_NAME=docdb-access kubectl run ${DEV_APP_SERVICE_NAME} --image=dockerurl/docker/data-platforms/common/socat:latest -it --tty --rm --expose=true --port=${DEV_DB_PORT} tcp-listen:${DEV_DB_PORT},fork,reuseaddr tcp-connect:${DEV_DB_ENDPOINT}:${DEV_DB_PORT}
- Terminal 2(kubePortForward.sh):
export DEV_DB_PORT=27017 export DEV_DB_ENDPOINT=db.endpoint export DEV_APP_SERVICE_NAME=docdb-access kubectl port-forward service/${DEV_APP_SERVICE_NAME} ${DEV_DB_PORT}:${DEV_DB_PORT}
核心疑问与问题现象
是否可以用karate.fork启动这两个终端进程?调用第一个脚本时,无论是否加参数,都收到文件找不到的错误,相关代码及日志如下:
测试代码
Scenario: test setup * def proc = karate.fork('kubeConnection.sh arg1') * proc.waitSync() * def procOut = proc.sysOut * print ('procOut-',procOut) * def procErr = proc.sysErr * print ('procErr-',procErr) * def procExitCode = proc.exitCode * print ('procExitCode-',procExitCode) * match procExitCode == 0
错误日志
08:53:57.179 [1709049237178] DEBUG com.intuit.karate - command: [kubeConnection.sh, arg1], working dir: null 08:53:57.193 [1709049237178] ERROR com.intuit.karate.shell.Command - command error: [kubeConnection.sh, arg1] - Cannot run program "kubeConnection.sh": error=2, No such file or directory 08:53:57.195 [com.intuit.karate.Main.main()] INFO com.intuit.karate - [print] null 08:53:57.196 [com.intuit.karate.Main.main()] INFO com.intuit.karate - [print] null 08:53:57.197 [com.intuit.karate.Main.main()] INFO com.intuit.karate - [print] -1 08:53:57.205 [com.intuit.karate.Main.main()] ERROR com.intuit.karate - src/test/java/commonutilhelpers/kubeConnection.feature:36
解决方案与说明
1. 是否支持用karate.fork启动进程?
可以,但需注意两个关键点:
- 这两个脚本都是长期运行的进程(
kubectl run启动的socat容器、kubectl port-forward会持续监听端口),直接调用proc.waitSync()会导致测试阻塞,因为进程不会自动退出。建议用proc.waitFor(10000)设置超时等待启动完成,或者在测试结束后主动终止进程。 - 需要确保Karate运行环境已完成K8s集群认证(kubeconfig配置正确),否则
kubectl命令会执行失败。
2. 解决"文件找不到"的错误
错误根源是Karate无法定位到脚本文件,可通过以下方式修复:
- 使用脚本绝对路径:将
kubeConnection.sh的完整路径传给karate.fork,示例:karate.fork('/Users/mike/scripts/kubeConnection.sh arg1') - 指定工作目录:如果脚本在项目特定目录,调用时显式设置工作目录参数:
* def proc = karate.fork({ command: 'kubeConnection.sh arg1', workingDir: 'src/test/scripts' }) - 赋予脚本执行权限:在终端执行
chmod +x kubeConnection.sh kubePortForward.sh,确保脚本具备可执行权限 - 通过Shell调用脚本:如果是Windows环境或脚本无执行权限,可通过bash/sh等Shell间接调用:
* def proc = karate.fork('bash -c "kubeConnection.sh arg1"')
3. 额外注意事项
- 端口占用检查:本地端口27017不能被其他进程占用,否则端口转发会失败
- 进程清理:测试结束后需调用
proc.destroy()手动终止进程,避免资源泄漏
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

