0%

基于 Jenkins + Swarm 的 Web 应用不停机发布方案

前言

由于目前就职的是一家做物联网相关产品的科技公司, 为了帮助公司解决后端发布更新时导致服务不可用问题及帮助项目实现未来业务扩张后集群运行等问题, 结合公司实际情况, 探索合适的技术栈来解决这些问题。最终决定使用 Jenkins + Swarm 来进行实施. 至于采用这套技术栈的原因, 大概可以总结为以下几点:

  • 公司业务需要保证服务高度可用, 发版/更新期间服务不被中断
  • 公司规模小, 提供的云上资源也同样很少, 需要轻量化的解决方案
  • 后端框架陈旧, 资源分布混乱, 需要一套合理的项目管理方法
  • 没有专职的运维人员, 要求配置和管理尽量简单, 降低使用者学习难度曲线

综上所述, 在容器编排选型上面就直接抛弃了 k8s 而选择轻量化的 swarm. 包括镜像管理这一块, 也是直接去掉了公共的存储仓库而选择直接在目标机器操作.

技术要点

  • 项目代码通过 Gitlab 管理, 并遵循工作流方式编写和提交
  • 编译打包通过 Jenkins + Git + Maven 实现, 要求项目能够参数化构建
  • 镜像生成使用 ssh 远程编译(由于不使用镜像仓库, 所以只打包不推送)
  • 集群方案使用 Swarm + docker-compose 方式管理, 使用 compose 的目的是因为公司的资源不多, 单台4C8G的 ECS 要跑4个 J2EE 项目服务以及还有各种中间件, 所以部分有状态的中间件之类的服务通过 compose 来跑尽量节省资源
  • 反向代理使用 Traefik, 减少 nginx 配置(主要原因还是没有 k8s 那样成熟的 ingeress)
  • 容器健康检查, 实现滚动更新时保证新版本服务可用之后才 down 掉旧服务
  • 容器通信使用 Swarm 模式原生方式, 为了保证 docker-compose 部署的服务和 Swarm 的服务能够相互连接, 需要使用自定义的 Swarm 网络
  • 统一日志收集, 集群化之后日志将变得分散, 需要使用有效手段来集中管理

实施过程

docker & swarm 安装

参见 Dokcer-CE & Docker Compose 安装

为了做到足够简单, 并没有去配置 Docker 的远程API, 后面统一使用 Jenkins 远程SSH操作

Traefik部署

参见 Traefik-V2.0 & Docker-Compose 最佳实践

项目使用的是 Swarm 模式, 所以上面文章的内容需要作适量改动, 详情参照官网 https://docs.traefik.io/v2.0/providers/docker/#swarmmode
项目因为只有单节点, 所以 Traefik 只是以 compose 部署的非集群方式运行

Jenkins部署

参见Jenkins + Git + Maven持续构建部署环境搭建

这次搭建过程处理上述的3个插件之外, 还使用到一个轻量的插件 Publish Over SSH, 通过它来实现传输文件和执行命令以及管理主机(不使用 scp & ssh 的原因是这个插件可以通过密码登录, 不用修改 sshd