容器化微服务自动化流水线

microservice-pipeline-architecture

提到流水线我们很自然的会想到工厂里的自动化流水线,流水线往往将一个产品的加工工序拆分成很多独立的小步骤,而这小步骤工人可以很熟练的完成,这样既保证了产品的质量,同时也提升了整体的执行效率。软件行业的流水线也很常见,比如我们做爬虫,登陆、爬取、解析、存储的过程就是个流水线,再比如使用TensorFlow做图像识别的理想过程,收集UGC图片、预处理、利用图片建模、模型为用户提供识别服务也是一个闭环的流水线过程。随着微服务技术的落地、容器技术的成熟以及ServiceMesh的发展,企业的研发流程也需要相应的做出调整,这里我想讨论的是基于容器的微服务自动化流水线的架构是如何的。

个人认为自动化的关键就是利用好CI/CD服务器,相关的开源产品很多,但Jenkins基本上已经成为企业的标配。开发人员将代码提交到Gitlab等代码托管服务器,会触发相应的webhook启动Jenkins构建任务。为了保证高可用,Gitlab和Jenkins都可以基于Docker和Kubernetes搭建。Jenkins提供了脚本的方式构建pipeline任务,每个阶段的任务可以指定不同的docker镜像去启动slave,这样可以提高整个Jenkins集群的构建效率和资源利用率。构建测试环境的自动化脚本,首先需要准备好环境配置参数,然后利用maven或gradle执行各类测试,如单元测试、集成测试、覆盖率测试,生成各类报表。接下来将测试无异常的jar包推送到Nexus服务器或者将打包好的Docker镜像推送到Harbor服务器,Nexus和Harbor也都可以基于K8s搭建。最后是执行K8s的脚本去Harbor拉取微服务的Docker镜像进行部署,无论是Docker镜像还是K8s的部署脚本都可以做成模版,利用参数化配置提高效率。预发布环境和生产环境需要搭建和测试环境类似的K8s集群,只是要执行的脚本不同。微服务的日志收集可以使用成熟的ELK方案,Istio利用Envoy和自身的各类服务组件提供了一站式微服务治理解决方案,与微服务本身解耦,如限流熔断降级Hystrix、Metrics收集Prometheus、分布式调用链跟踪Jaeger、服务监控报警Grafana、微服务依赖关系分析Kiali等,大大降低了企业的研发难度。

容器化微服务自动化流水线的搭建本身难度不大,但具体的流程和细节还需要根据企业的实际情况进行调整。Istio本身还在不断的发展中,实际落地还需要得到更多的验证。另外,线上系统直接利用pipeline发布可能还需要在更多保障的前提下才能实际落地,包括系统的自动化一键部署(金丝雀、蓝绿、灰度)、异常自我修复、完善的回滚机制,人工预案和介入也必不可少。