【问题标题】:How to run a docker image on kubernetes that accepts command line arguments?如何在接受命令行参数的 kubernetes 上运行 docker 映像?
【发布时间】:2019-01-29 15:11:30
【问题描述】:

我有一个 docker 映像,其中包含一个 python 文件,该文件使用 sys.stdin() 从命令行接受参数。我可以使用以下命令运行映像

猫文件.csv | docker run -i -t my_image

它将 file.csv 的内容通过管道传输到图像,我得到了预期的输出。

现在我想将此映像部署到 Kubernetes。我可以使用 docker 在服务器上运行图像而没有任何问题。但是如果我卷曲到它,它应该会发回响应,但我没有收到它,因为我没有在任何端口上侦听的 Web 服务器。我继续使用以下命令构建了一个部署。

kubectl run -i my_deployment --image=gcr.io/${PROJECT_ID}/my_image:v1 --port 8080

它构建了部署,我可以看到 Pod 正在运行。然后我就暴露了。

kubectl 公开部署 my_deployment --type=LoadBalancer --port 80 --target-port 8080

但如果我尝试使用 curl 分配的 IP 来访问它,

卷曲http://allocated_ip

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

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

【问题讨论】:

    标签: docker deployment kubernetes google-kubernetes-engine


    【解决方案1】:

    Kubernetes 通常假定它部署的容器是长期存在的并且是自主的。如果您在 Pod 中部署某些东西,尤其是通过 Deployment,它应该能够在没有任何特定输入的情况下自行运行。如果它立即退出,Kubernetes 将重新启动它,你很快就会进入可怕的CrashLoopBackOff 状态。

    简而言之:您需要重新设计您的容器以不使用标准输入,而标准输出是它的主要接口。

    您将网络端点添加到服务中的直觉可能是正确的,但 Kubernetes 不会自己这样做。如果你重建你的应用程序以拥有一个 Flask 服务器并监听一个端口,那么你可以很容易地将其部署到 Kubernetes。如果应用程序希望数据进入标准输入并且其结果进入标准输出,那么添加 Kubernetes 网络元数据将无济于事:在您的示例中,如果容器内没有任何东西在端口 8080 上监听,那么网络连接将永远不会去任何地方.

    【讨论】:

    • 这解释了很多。你能告诉我我应该如何进行吗?我是否应该使用侦听端口的服务器构建烧瓶应用程序,并接受带有数据的 POST 请求,使用该数据进行处理并将输出发送回?类似的东西?
    • 听起来很完美。
    • 非常感谢。我会试试的
    【解决方案2】:

    我假设 Kubernetes 在本地运行。我会做以下事情。

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

    helm install stable/nginx-ingress

    • 使用端口 8080 创建一个部署,或者使用 docker 运行它会暴露的任何内容。实际部署将有一个 API,我可以通过 POST 发送内容。

    • 使用端口 8080 和目标端口 8080 创建一个服务。它应该是 ClusterIP 类型。

    • 使用主机名和 8080 的 servicePort 创建一个入口。

    【讨论】:

    • 您能否详细说明“实际部署将有一个 API,我可以通过 POST 向其发送数据”?从技术上讲,我究竟应该怎么做?创建一个烧瓶应用程序,让服务器在端口上侦听并接受数据?
    • 是的,这正是我会做的。
    • 好的,我会这样做的。谢谢
    【解决方案3】:

    由于您在运行命令时将文件作为参数传递,这让我认为一旦您在容器上拥有内容,您就不需要更新 csv 的内容。

    实现对该文件的读取操作的最佳方法是在 Dockerfile 上 ADD 该文件,然后使用 open 函数打开该文件。

    你会有这样一行

    ADD file.csv /home/file.csv
    

    在你的 python 代码中类似于:

    file_in = open(‘home/file.csv’, ‘r’)
    

    请注意,如果要更改文件,则需要更新 Dockerfile,再次构建,推送到注册表并重新部署到 GKE。如果您不想遵循此流程,可以使用ConfigMap

    另外,如果这回答了您的问题,请确保在 serverfault 上链接您的相同问题

    【讨论】:

    • 我必须更改文件,但配置映射看起来很有希望。我去看看,谢谢。
    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多