我有一个在桌面PC上运行的大型Python服务,我需要让它作为K8S部署的一部分运行。我希望我必须进行一些小的更改才能使服务在部署/ pod中运行,然后才能工作。
到目前为止,如果我在Python代码中遇到问题,则需要一段时间来更新代码,并将其部署用于另一轮测试。例如,我必须:
scp
Docker容器到Docker Registry服务器。docker load
图像,更新标签,并将其推送到注册表后端数据库。每次我需要调试一个小问题时,这需要很长的准备时间。理想情况下,我更喜欢能够修改已经在pod上运行的Python代码的副本,但是我无法杀死它(因为Python服务是使用PID=1
启动的默认应用程序),而K8S没有不支持重启pod(据我所知)。或者,如果我杀死/启动另一个pod,它将不会从我之前正在处理的pod中进行本地更改(当然,这是设计的;但对我的调试工作没有帮助)。
是否有更好/更快的方式快速部署(实验/调试)更改我正在测试的容器,而不必花费几分钟重新创建容器映像,重新部署/标记/推送它们等?如果我能找到并装载(读写)Docker镜像,这可能有所帮助,因为我可以直接编辑其中的数据(即新的Python更改),并且只是杀死pod以便部署重新创建它们。
有两个主要选项:一个是使用减少或自动化流程的工具,另一个是使用Minikube等本地开发。
首先,有一百五十个工具,但Skaffold可能是最常见的工具。
对于第二种,您可以执行类似( eval $(minikube docker-env) && docker build -t myimagename . )
的操作,它将直接在Minikube docker环境中构建图像,因此您可以完全跳过列表中的步骤3和4。您可以将其与检测图像更改的工具结合使用,然后重新启动窗格或更新部署(重新启动窗格)。
使用scp
和docker load
的FWIW也非常不标准,通常会合并到docker push
。
我认为你的痛点是容器依赖于python代码。您可以找到一种从docker镜像构建阶段中排除源代码的方法。
根据我的经验,我将创建一个仅包含python包依赖项的docker镜像,并使用volume
将源代码dir映射到容器路径,因此如果没有添加或删除依赖项,则无需重建映像。
我对k8s的经验不多,但我认为它必须与docker run
大致相同。
FROM python:3.7-stretch
COPY ./python/requirements.txt /tmp/requirements.txt
RUN pip install --no-cache-dir -r /tmp/requirements.txt
ENTRYPOINT ["bash"]
scp
将您的代码部署到服务器,并将您的主机源路径映射到容器源路径,如下所示:
docker run -it -d -v /path/to/your/python/source:/path/to/your/server/source --name python-service your-image-name
使用卷映射,您的容器不再依赖于源代码,您可以轻松更改源代码而无需重建映像。