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

问题描述 投票:1回答:2

Background

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


Problem

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

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

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


Question

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


docker debugging kubernetes
2个回答
4
投票

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

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

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

使用scpdocker load的FWIW也非常不标准,通常会合并到docker push


1
投票

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

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

Example

我对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

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

© www.soinside.com 2019 - 2024. All rights reserved.