【问题标题】:Rapidly modifying Python app in K8S pod for debugging在 K8S pod 中快速修改 Python 应用进行调试
【发布时间】:2019-04-26 18:36:19
【问题描述】:

背景

我有一个在桌面 PC 上运行的大型 Python 服务,我需要让它作为 K8S 部署的一部分运行。我希望我必须进行一些小的更改才能使服务在部署/pod 中运行,然后才能正常工作。


问题

到目前为止,如果我在 Python 代码中遇到问题,需要一段时间来更新代码,然后将其部署以进行另一轮测试。例如,我必须:

  • 修改我的 Python 代码。
  • 重建 Docker 容器(包括我的 Python 服务)。
  • scp 将 Docker 容器转移到 Docker Registry 服务器。
  • docker load镜像,更新标签,推送到Registry后端DB。
  • 手动终止当前运行的 Pod,以便部署使用新的 Docker 映像重新启动所有 Pod。

每次我需要调试一个小问题时,这都需要大量的准备时间。理想情况下,我更喜欢能够只修改已经在 Pod 上运行的 Python 代码的副本,但我不能杀死它(因为 Python 服务是默认启动的应用程序,使用 PID=1),并且K8S 不支持重新启动 pod(据我所知)。或者,如果我杀死/启动另一个 pod,它不会对我之前正在处理的 pod 进行本地更改(这当然是设计使然;但对我的调试工作没有帮助)。


问题

有没有更好/更快的方法来快速部署(实验/调试)更改到我正在测试的容器,而无需花费几分钟重新创建容器映像、重新部署/标记/推送它们等?如果我可以找到并挂载(读写)Docker 映像,那可能会有所帮助,因为我可以直接编辑其中的数据(即新的 Python 更改),然后杀死 pod,以便部署重新创建它们。


【问题讨论】:

    标签: docker debugging kubernetes


    【解决方案1】:

    主要有两种选择:一种是使用减少或自动化流程的工具,另一种是使用 Minikube 之类的本地开发。

    首先,有一百万种工具,但 Skaffold 可能是最常见的一种。

    对于第二个,您执行( eval $(minikube docker-env) && docker build -t myimagename . ) 之类的操作,它将直接在 Minikube docker 环境中构建映像,因此您可以完全跳过列表中的第 3 步和第 4 步。您可以将其与检测图像更改并重新启动您的 pod 或更新部署(重新启动 pod)的工具结合使用。

    另外,使用scpdocker load 的FWIW 非常不标准,通常会合并为docker push

    【讨论】:

      【解决方案2】:

      我认为你的痛点是依赖于 python 代码的容器。您可以找到一种方法从 docker 映像构建阶段排除源代码。

      根据我的经验,我会创建一个只包含python包依赖的docker镜像,并使用volume将源代码dir映射到容器路径,所以如果没有添加依赖则不需要重新构建镜像或删除。

      示例

      我对k8s没有太多经验,但我相信它一定和docker run差不多。

      Dockerfile

      FROM python:3.7-stretch
      
      COPY ./python/requirements.txt /tmp/requirements.txt
      
      RUN pip install --no-cache-dir -r /tmp/requirements.txt
      
      ENTRYPOINT ["bash"]
      

      Docker 容器

      scp 将您的代码部署到服务器,并将您的主机源路径映射到容器源路径,如下所示:

      docker run -it -d -v /path/to/your/python/source:/path/to/your/server/source --name python-service your-image-name
      

      使用卷映射,您的容器不再依赖源代码,您可以轻松更改源代码而无需重建映像。

      【讨论】:

        猜你喜欢
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 2020-03-03
        • 1970-01-01
        • 2019-04-28
        • 2011-09-29
        相关资源
        最近更新 更多