我有一个 docker 镜像,其中包含一个 python 文件,该文件使用 sys.stdin() 从命令行接受参数。我可以使用以下命令运行图像
cat file.csv | docker run -i -t my_image
它将 file.csv 的内容通过管道传输到图像,我得到了预期的输出。
现在我想将此镜像部署到 kubernetes。我可以使用 docker 在服务器上运行图像而没有任何问题。但是如果我 curl 到它,它应该会发回响应,但我没有收到它,因为我没有在任何端口上监听的 Web 服务器。我继续使用以下命令构建了一个部署。
kubectl run -i my_deployment --image=gcr.io/${PROJECT_ID}/my_image:v1 --port 8080
它构建了部署,我可以看到 Pod 正在运行。然后我暴露它。
kubectl expose deployment my_deployment --type=LoadBalancer --port 80 --target-port 8080
但是如果我尝试使用使用 curl 分配的 IP 来访问它,
curl http://allocated_ip
我得到一个响应“连接被拒绝”。
如何将此 docker 镜像部署为 kubernetes 上的服务并将文件内容作为输入发送到服务?我需要一个网络服务器吗?
最佳答案
Kubernetes 通常假设它部署的容器是长生命周期和自治的。如果您在 Pod 中部署某些东西,尤其是通过 Deployment,它应该能够在没有任何特定输入的情况下自行运行。如果它立即退出,Kubernetes 将重新启动它,你很快就会陷入可怕的 CrashLoopBackOff
状态。
简而言之:您需要重新设计容器以不使用标准输入,标准输出是它的主要接口(interface)。
您将网络端点添加到服务中的直觉可能是正确的,但 Kubernetes 不会自己这样做。如果你重建你的应用程序以拥有一个 Flask 服务器并监听一个端口,那么你可以很容易地将它部署到 Kubernetes。如果应用程序希望数据进入标准输入并且其结果进入标准输出,那么添加 Kubernetes 网络元数据将无济于事:在您的示例中,如果容器内没有任何东西在端口 8080 上监听,那么网络连接将永远不会去任何地方.
关于docker - 如何在接受命令行参数的 kubernetes 上运行 docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54424063/