You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过端口转发访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:53:14