我有一个大型Python服务可在台式机上运行,并且需要将其作为K8S部署的一部分运行。我希望我必须做一些小改动才能使服务在部署/吊舱中运行,然后才能运行。
到目前为止,如果我在Python代码中遇到问题,则需要一段时间来更新代码,并将其部署到另一轮测试中。例如,我必须:
scp
将Docker容器转移到Docker Registry服务器。docker load
映像,更新标签并将其推送到注册表后端数据库。每次我需要调试一个小问题时,这都需要很多准备时间。理想情况下,我希望能够只修改已经在Pod上运行的Python代码的副本,但是我无法终止它(因为Python服务是使用PID=1
启动的默认应用程序) ,而K8S不支持重新启动Pod(据我所知)。或者,如果我终止/启动另一个Pod,则不会从以前使用的Pod上进行本地更改(当然,这是设计使然;但是对我的调试工作无济于事)。
是否有更好/更快的方法将更改快速部署(实验/调试)到我正在测试的容器中,而不必花费几分钟来重新创建容器映像,重新部署/标记/推送它们,等等?如果我可以找到并装载(读写)Docker映像,那可能会有所帮助,因为我可以直接编辑其中的数据(即新的Python更改),然后杀死Pod,以便部署重新创建它们。
答案 0 :(得分:4)
有两种主要选择:一种是使用减少或自动化流量的工具,另一种是使用Minikube之类的工具在本地进行开发。
首先,有一百万个工具,但Skaffold可能是最常见的工具。
第二步,您执行类似( eval $(minikube docker-env) && docker build -t myimagename . )
的操作,它将直接在Minikube docker环境中构建映像,因此您完全跳过列表中的步骤3和4。您可以将其与检测映像更改并重新启动Pod或更新部署(重新启动Pod)的工具结合使用。
使用scp
和docker load
的FWIW也是非常不标准的,通常会组合成docker push
。
答案 1 :(得分:1)
我认为您的痛点是依赖python代码的容器。您可以找到一种方法从docker image build阶段中排除源代码。
根据我的经验,我将创建一个仅包含python软件包依赖项的docker映像,并使用volume
将源代码dir映射到容器路径,因此如果没有依赖项,则无需重建映像添加或删除。
我对k8的使用经验不多,但我相信它必须与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
使用卷映射,您的容器不再依赖于源代码,您可以轻松更改源代码而无需重建映像。