如何在kubernetes上接受命令行参数的docker镜像上运行?

时间:2019-01-29 15:11:30

标签: docker deployment kubernetes google-kubernetes-engine

我有一个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来访问它,

  

卷曲http://allocated_ip

我收到“连接被拒绝”的响应。

如何将该docker映像作为服务部署到kubernetes上,并将文件内容作为输入发送到服务?我需要一个网络服务器吗?

3 个答案:

答案 0 :(得分:1)

我假设Kubernetes在本地运行。我将执行以下操作。

  • 创建一个nginx或Apache部署。使用Helm,使用
  • 非常简单
  

帮助安装稳定版/ 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上链接相同的问题