提高工程效率的快部署方案

一、背景

在现代化工程中,业务服务通常使用 k8s 调用 Pod 来部署容器,假设在业务开发过程中有个小改动需要发布到 Pod 中进行验证。常规的办法是走漫长的流水线编译打包镜像,然后走 k8s 更新集群 Pod 镜像。这里存在的问题就是整个流程太长,每次一个改动想要得到验证需要等待好久。

观察整个部署流程会发现代码编译其实很快,真正耗费时间的是 CI/CD 流水线和 k8s 调用 Pod 更新镜像的过程,而且如果更新过程只有一台 Pod 还会导致服务不可用。如果我们能够省去重新构建镜像部署容器,就可以节省很多的时间。

二、快发布方案

在这种背景下,提高工程效率的解决方案是在业务容器后台运行一个守护进程,开发者可以在编译机中将编译好的二进制文件直接上传到 k8s 集群指定的 Pod 中,然后远程执行 shell 命令替换业务中的二进制文件重启业务进程实现快速发布的目标。

注:开发机是指本地开发工程的机器,如果开发机与 k8s 集群之间的网络没有限制,可以省略编译机直连集群 Pod 快速部署。

2.1 流水线改造

一般研发团队通常会使用统一的流水线,使用相同的基础镜像构建业务镜像。在不对业务产生侵入的同时,只需要改造下流水线模板,在镜像构建时将守护进程的二进制文件注入到镜像中,然后添加启动脚本确保守护进程随容器启动在后台。

2.2 快发布工具

回到开发这里,相应的需要一种工具与 k8s 集群中的 Pod 守护进程进行交互实现快速部署。这里实现的方式有很多种,可以单独开发一个二进制命令行工具,也可以写一个 shell 脚本发送 HTTP 请求。

考虑到所有的 linux 发行版都会安装有 curl 工具,所以这里使用 curl 来演示,降低使用成本。

# 上传二进制
curl --location http://127.0.0.1:8080/upload --form 'filename=@"/home/xxx/web_service"'

# 执行远程命令
curl --location 'http://127.0.0.1:8080/command' \
--header 'Content-Type: text/plain' \
--data '/usr/local/start.sh start'

第一步:使用 curl 发送 http 请求将源码编译的二进制文件上传到集群的容器中。

第二步:使用 curl 发送 http 请求携带 shell 命令触发远程容器中执行 shell 命令更新服务。

当然,这里 shell 命令用户可以自由组合, 可以使用任何工程方式集成到已有的工具进行服务的快速部署。

三、守护进程

以上就是整个方案的思路,在我们日常开发过程中高频使用,极大提高了工作效率不用再忍受流水线漫长的构建过程。

思路很有用,技术实现并不复杂,你可以使用任何语言实现这个守护进程,当然你也可以直接使用我开发的这个轻量级后台进程。我已经将它开源在 Github 上了 https://github.com/ZuoFuhong/sentinel

好了,写到这里已经是周末的晚上 23:30,要休息了。如果觉得还不错可以 Github 上点颗小星星,也欢迎大家在 Issues 区留言一起讨论。

posted @ 2023-10-22 23:53  MarsZuo  阅读(492)  评论(1编辑  收藏  举报