一文熟悉golang编写k8s应用部署工具_docker

背景:在上篇文章里,完成了一个简陋的spring cloud + k8s的应用系统,那么如果手工部署的话,那得分别打包5个服务,打5个镜像,然后安装5个服务。凡是麻烦的工作,都要去让工具来干。

然后我就做了一个简陋的可视化部署工具,输入仓库git地址,由golang来负责clone repository -> build docker images -> helm install

代码仓:​​chintensakai/learn-spring-cloud (gitee.com)​

1. 思路

  • 为什么用golang?因为我后期会加入k8s相关资源的展示看板,以及各节点的docker资源看板,而golang拥有k8s和docker官方提供的client sdk,肥肠方便。
  • 流程分三步:
    1. 输入git仓库日志,步骤条按钮展示clone,点击调用/git/clone接口,后台gin收到请求,使用go-git库去clone本项目,clone结束之后,遍历项目目录,寻找包含package目录的项目,这些项目就是一会helm需要安装的项目;同时寻找dependencies聚合项目,mvn clean package来打包。
    2. 1步结束之后,按钮变为build,点击调用/docker/build接口,前台把1步骤返回的需要安装的项目列表携带到后端,后端使用docker sdk到对应目录里面,根据Dockerfile构建镜像,并推送到本地registry。这一步最为耗时,经过了一些已知办法的优化,后面打算用goroutine重写build和push的过程,理论上可以再节省4/5的时间 已经用goroutine重写,但是效果没有想象中那么好,build镜像阶段确实并发了,但是push阶段似乎还是老样子,可能跟registry的机制有关系吧。但是有个意外收获,这里设计成主线程没有等待goroutine结束就返回了,因为下一个步骤是helm install,并不会受goroutine的影响,他会不断等待镜像,所以主线程直接返回就好了,留下goroutine自己在后台build & push images就行了。
    3. 2步结束之后,按钮变为helm install,点击之后调用/helm/install接口,helm的go sdk有点复杂,而且这一步的工作很简单,所以直接调用系统command更方便。

2. 最终结果:

一文熟悉golang编写k8s应用部署工具_后端_02

2.1 /git/clone 接口:

一文熟悉golang编写k8s应用部署工具_后端_03

2.2 /docker/build 接口:

一文熟悉golang编写k8s应用部署工具_git_04

2.3 /helm/install 接口:

一文熟悉golang编写k8s应用部署工具_docker_05

2.4 安装完成:

一文熟悉golang编写k8s应用部署工具_后端_06

3. 一些优化的点:

之前的基础镜像太大,push和pull的过程无法忍受,单个镜像的build和push就需要11分钟 一文熟悉golang编写k8s应用部署工具_后端_07

使用alpine + springboot 分层构建 + 本地镜像仓库,5个镜像build&push只需要一两分钟,越往后越快,因为有的镜像层可以复用。而且真正使用的话肯定是自己的私有仓库,所以这一步都是一些已知办法,不是我自己发明的。

一文熟悉golang编写k8s应用部署工具_docker_08