微服务的持续集成部署

前三篇主要介绍了微服务的服务发现服务通信以及API Gateway。整体的微服务架构的模型初见。在实际的开发、测试以及生产环境中。使用Docker实现微服务,集群的网络环境会更加复杂。微服务架构本身就意味着需要对若干个容器服务进行治理,每个微服务都应可以独立部署、扩容、监控。本篇会继续探讨如何进行Docker微服务的持续集成部署。

镜像仓库

Docker来部署微服务,需要将微服务打包成Docker镜像,就如同部署在Web server打包成war文件一样。只不过Docker镜像运行在Docker容器中。
如果是Springboot服务,则会直接将包含Apache Tomcat server的Springboot,以及包含Java运行库的编译后的Java应用打包成Docker镜像。
为了能统一管理打包以及分发(pull,push)镜像。企业一般需要建立自己的镜像私库。实现方式也很简单。可以在私库的机器上直接部署Docker hub的镜像仓库的容器版Registry2。目前最新的版本是V2。

代码仓库

代码的提交、回滚等管理,也是项目持续集成的一环。一般也是需要建立企业的代码仓库的私库。可以使用SVN,GIT等代码版本管理工具。
目前采用的是Gitlab,通过[Git的Docker镜像](docker-hub gitlab)安装、部署操作也很便捷。具体步骤可以参考docker gitlab install

项目构建

在Springboot项目中,构建工具可以用Maven,或者Gradle。Gradle相比Maven更加灵活,而且Springboot应用本身去配置化的特点,用基于Groovy的Gradle会更加适合,DSL本身也比XML更加简洁高效。
因为Gradle支持自定义task。所以微服务的Dockerfile写好之后,就可以用Gradle的task脚本来进行构建。目前也有一些开源的Gradle构建Docker镜像的工具,比如Transmode-Gradlew插件。其除了可以对子项目(单个微服务)进行构建Docker镜像,也可以上传到远程镜像仓库。在生产环境中的build机器上,可以直接执行DockerImage的构建,上传。

容器编排技术

Docker镜像构建之后,因为每个容器运行着不同的微服务实例,容器之间也是隔离部署服务的。需要通过编排技术,可以使DevOps轻量化管理容器的部署和管理以及监控,以提高容器管理的效率。
目前一些通用的编排工具比如Ansible、Chef、Puppet,也可以做容器的编排。但都不是专门针对容器的编排工具,所以使用时需要自己编写一些脚本,结合Docker的命令。如Ansible,确实可以实现很便利的集群的容器的部署和管理。目前Ansible针对自己研发的容器技术提供了集成方案:Ansible Container
。集群管理系统将主机作为资源池,根据每个容器对资源的需求,决定将容器调度到那个主机上。
目前,围绕Docker容器的调度、编排,比较成熟的技术有Google的Kubernetes(下文会简写k8s)Mesos结合Marathon管理Docker集群,以及在Docker 1.12.0版本以上官方提供的Docker Swarm。编排技术是容器技术的重点之一。选择一个适合自己团队的容器编排技术也可以使运维更高效、更自动化。

Docker Compose

Docker Compose是一个简单的Docker容器的编排工具,通过YAML文件配置需要运行的应用,然后通过compose up命令启动多个服务对应的容器实例。Docker中没有集成Compose,需要另外安装。
Compose可以用于微服务项目的持续集成,但其还不是一个适合大型集群的容器管理,大集群中,可以Compose结合Ansible做集群资源管理,以及服务治理。
对于集群中的机器不多的情况下,可以使用Compose,其使用步骤主要是:

  1. 结合服务运行环境,定义好服务的Dockerfile
  2. 根据服务镜像、端口、运行变量等编写docker-compose.yml文件,以使服务可以一起部署,运行
  3. 运行docker-compose up 命令启动并且进入容器实例,如果需要使用后台进程方式运行,可以使用docker-compose up -d即可。
Docker Swarm

在去年,Docker的1.12版本之后,使用新版本的Docker,就自带Docker swarm mode了。不需要额外安装任何插件工具。可以看出去年开始Docker团队也开始重视服务编排技术,通过内置Swarm mode,可以抢占一部分的服务编排市场。
如果团队开始使用新的Docker,可以选择Docker swarm mode来进行集群化的容器调度和管理。Swarm还支持滚动更新、节点间传输层安全加密、负载均衡等。
DockerSwarm的使用示例可以参考之前写的一篇:使用docker-swarm搭建持续集成集群服务

Kubernetes

Kubernetes是Google开源的容器集群管理系统,使用Go语言实现,其提供应用部署、维护、 扩展机制等功能。目前可以在GCE、vShpere、CoreOS、OpenShift、Azure等平台使用k8s。国内最近关注Aliyun平台也提供了基于k8s的服务治理平台。如果是基于物理机、虚拟机搭建的Docker集群的话,也可以直接部署、运行k8s。在微服务的集群环境下,Kubernetes可以很方便管理跨机器的微服务容器实例。
目前k8s基本是公认的最强大开源服务治理技术。其主要提供以下功能:

  1. 自动化对基于Docker对服务实例进行部署和复制
  2. 以集群的方式运行,可以管理跨机器的容器,以及滚动升级、存储编排。
  3. 提供基于Docker的服务发现和负载均衡
  4. K8s提供了强大的自我修复机制,会对崩溃的容器进行替换(对用户,甚至开发团队都无感知),并可随时扩容、缩容。让容器管理更加弹性化。

k8s主要通过以下几个重要的组件完成弹性容器集群的管理的:

  1. Pod是Kubernetes的最小的管理元素,一个或多个容器运行在pod中。pod的生命周期很短暂,会随着调度失败,节点崩溃,或者其他资源回收时消亡。
  2. Label是key/value存储结构的,可以关联pod,主要用来标记pod,给服务分组。微服务之间通过label选择器(Selectors)来识别Pod。
  3. Replication Controller是k8s Master节点的核心组件。用来确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)运行。即提供了自我修复机制的功能,并且对缩容扩容、滚动升级也很有用。
  4. Service是对一组Pod的策略的抽象。也是k8s管理的基本元素之一。Service通过Label识别一组Pod。创建时也会创建一个本地集群的DNS(存储Service对应的Pod的服务地址)。所以在客户端请求通过请求DNS来获取一组当前可用的Pods的ip地址。之后通过每个Node中运行的kube-proxy将请求转发给其中一个Pod。这层负载均衡是透明的,但是目前的k8s的负载均衡策略还不是很完善,默认是随机的方式。

小结

做微服务架构体系,一个适合的持续集成的工具体系,可以很好得提升团队的运维、开发效率。目前类似Jenkins也有针对Docker的持续集成的插件,但是还是存在很多不完善。所以建议还是选择专门应对Docker容器编排技术的Swarm,k8s,Mesos。或者多个技术结合起来,比如Jenkins-CI+k8s-CD。
Swarm,k8s,Mesos各有各的特性,但是对于容器的持续部署、管理以及监控都提供了支持。Mesos还支持数据中心的管理。Docker swarm mode扩展了现有的Docker API,通过Docker Remote API的调用和扩展,可以调度容器运行到指定的节点。Kubernetes则是目前市场规模最大的编排技术,目前很多大公司也都加入到了k8s家族,k8s应对集群应用的扩展、维护和管理更加灵活,但是负载均衡策略比较粗糙。而Mesos更专注于通用调度,提供了多种调度器。
对于服务编排,还是要选择最适合自己团队的,如果初期机器数量很少,集群环境不复杂也可以用Ansible+Docker Compose,再加上Gitlab CI来做简单的持续集成。

后面一篇应该是这个系列的最后一篇了。主要总结下服务集群下使用微服务架构的解决方案。负载均衡、缓存、搜索、消息队列、安全、监控等等,最后再回顾下架构的几个要素以及自己的心得吧。

####其他资源:
使用Mesos和Marathon管理Docker集群
基于docker-swarm搭建持续集成集群服务
Kubernetes中文文档

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐