在K8S pod中快速修改Python应用进行调试

时间:2019-04-26 18:36:19

标签: docker debugging kubernetes


背景

我有一个大型Python服务可在台式机上运行,​​并且需要将其作为K8S部署的一部分运行。我希望我必须做一些小改动才能使服务在部署/吊舱中运行,然后才能运行。


问题

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

  • 修改我的Python代码。
  • 重建Docker容器(包括我的Python服务)。
  • scp将Docker容器转移到Docker Registry服务器。
  • docker load映像,更新标签并将其推送到注册表后端数据库。
  • 手动杀死当前正在运行的Pod,以便部署使用新的Docker映像重新启动所有Pod。

每次我需要调试一个小问题时,这都需要很多准备时间。理想情况下,我希望能够只修改已经在Pod上运行的Python代码的副本,但是我无法终止它(因为Python服务是使用PID=1启动的默认应用程序) ,而K8S不支持重新启动Pod(据我所知)。或者,如果我终止/启动另一个Pod,则不会从以前使用的Pod上进行本地更改(当然,这是设计使然;但是对我的调试工作无济于事)。


问题

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


2 个答案:

答案 0 :(得分:4)

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

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

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

使用scpdocker load的FWIW也是非常不标准的,通常会组合成docker push

答案 1 :(得分:1)

我认为您的痛点是依赖python代码的容器。您可以找到一种方法从docker image build阶段中排除源代码。

根据我的经验,我将创建一个仅包含python软件包依赖项的docker映像,并使用volume将源代码dir映射到容器路径,因此如果没有依赖项,则无需重建映像添加或删除。

示例

我对k8的使用经验不多,但我相信它必须与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

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