我有一个docker映像,其中包含一个python文件,该文件使用sys.stdin()从命令行接受参数。我可以使用以下命令运行图像
cat file.csv | docker run -i -t my_image
它通过管道将file.csv的内容传输到图像,并且我得到了预期的输出。
现在我想将此映像部署到kubernetes。我可以使用docker在服务器上运行映像,而不会出现任何问题。但是,如果我curl缩它,它应该发送回一个响应,但是我没有收到它,因为我没有Web服务器在任何端口上进行侦听。我继续使用以下命令构建了部署。
kubectl运行-i my_deployment --image = gcr.io / $ {PROJECT_ID} / my_image:v1-端口8080
它建立了部署,我可以看到吊舱正在运行。然后我将其公开。
kubectl公开部署my_deployment --type = LoadBalancer --port 80 --target-port 8080
但是,如果我尝试使用通过curl分配的IP来访问它,
我收到“连接被拒绝”的响应。
如何将该docker映像作为服务部署到kubernetes上,并将文件内容作为输入发送到服务?我需要一个网络服务器吗?
答案 0 :(得分:1)
我假设Kubernetes在本地运行。我将执行以下操作。
帮助安装稳定版/ nginx-ingress
使用端口8080创建部署,或者使用docker运行该端口所暴露的内容。实际的部署将具有一个我可以通过POST发送内容的API。
使用端口8080和targetPort 8080创建服务。它应该是ClusterIP类型。
使用主机名和8080的servicePort创建一个入口。
答案 1 :(得分:1)
Kubernetes通常假定其部署的容器是长期存在的并且是自治的。如果您要在Pod中部署某些东西,尤其是通过Deployment进行部署,那么它应该能够在没有任何特定输入的情况下自行运行。如果立即退出,Kubernetes将重新启动它,您将很快陷入可怕的CrashLoopBackOff
状态。
简而言之:您需要重新设计容器以不使用stdin,而stdout是其主要接口。
您将网络端点添加到服务中的本能可能是正确的,但是Kubernetes不会自己这样做。如果您将应用程序重建为具有Flask服务器并侦听端口,那么您可以轻松地将其部署到Kubernetes。如果应用程序希望将数据输入到stdin并将其结果发送到stdout,则添加Kubernetes网络元数据将无济于事:在您的示例中,如果端口8080上的容器内部没有任何内容在监听,则网络连接将永远不会到任何地方
答案 2 :(得分:0)
由于您在运行命令时将文件作为参数传递,这使我认为,一旦容器中有了内容,就不需要更新csv的内容。
实现对该文件的读取操作的最佳方法是在Dockerfile上ADD,然后使用open函数打开该文件。
您将有一条类似
的行ADD file.csv /home/file.csv
在您的python代码中,例如:
file_in = open(‘home/file.csv’, ‘r’)
请注意,如果要更改文件,则需要更新Dockerfile,再次进行构建,推送到注册表并重新部署到GKE。如果您不想执行此过程,则可以使用ConfigMap。
此外,如果这能回答您的问题,请确保在serverfault上链接相同的问题