启动 Beam 时同步 pod 时出错 - 来自 docker 的数据流管道

Error syncing pod on starting Beam - Dataflow pipeline from docker

从 docker 图像启动我们的 Beam Golang SDK 管道(驱动程序)时,我们不断遇到错误,该图像在从本地/VM 实例启动时有效。我们正在使用 Dataflow 运行ner 来部署我们的管道和 Kubernetes。

本地设置: 我们为 GCP 集群设置了 GOOGLE_APPLICATION_CREDENTIALS 变量和服务帐户。 运行从本地连接作业时,作业会提交到数据流并成功完成。

DOCKER 设置: 使用的构建映像是 FROM golang:1.14-alpine。当我们用 Dockerfile 打包相同的程序并尝试 运行 时,它失败并出现错误

User program exited: fork/exec /bin/worker: no such file or directory

在检查 Stackdriver 日志以获取更多详细信息时,我们看到了这一点:

Error syncing pod 00014c7112b5049966a4242e323b7850 ("dataflow-go-job-1-1611314272307727-
01220317-27at-harness-jv3l_default(00014c7112b5049966a4242e323b7850)"), 
skipping: failed to "StartContainer" for "sdk" with CrashLoopBackOff: 
"back-off 2m40s restarting failed container=sdk pod=dataflow-go-job-1-
1611314272307727-01220317-27at-harness-jv3l_default(00014c7112b5049966a4242e323b7850)"

在 Dataflow common errors doc 中找到了对这个错误的引用,但它太笼统了,无法找出失败的原因。多次重试后,我们能够从 pods 中消除任何与权限/访问相关的问题。不确定这里还有什么问题。

经过多次尝试,我们决定从一个新的基于 Debian 10 的 VM 实例手动启动作业,并且成功了。这让我们注意到我们在 Docker 中使用基于 alpine 的 golang 图像,它可能没有安装启动作业所需的所有依赖项。

golang docker hub,我们发现了一个 golang:1.14-buster,其中 buster 是 Debian 10 的代号。将它用于 docker 构建帮助我们解决了这个问题。在这里自我回答以帮助其他面临同样问题的人。