我们一开始就考虑到容器化,就是用 Kubernetes 的框架做容器化的管理。
为什么是容器化?因为容器和微服务是一对“好朋友”,从开发环境到线上环境可以做到基本一致。
为什么用 Kubernetes?这和运行环境和部署环境有关系,我们是腾讯云的重度用户,腾讯云又对 Kubernetes 提供了非常到位的原生支持。
所谓原生支持是指它有如下几个方面的实现:
-
网络层面,Kubernetes 在裸金属的环境下,要实现 Overlay 网络,或者有 SDN 网络的环境,而在腾讯云的环境里。它本身就是软件定义网络,在网络上的实现可以做到在容器环境里和原生的网络一样的快,没有任何的性能牺牲。
-
在腾讯云的环境里,负载均衡器和 Kubernetes 里的 service 可以捆绑,可以通过创建 Kubernetes 的 service 去维护云服务的 L4 负载均衡器。
-
腾讯云的网盘可以被 Kubernetes 管理,实现 PVC 等,当然 Kubernetes 本身提供的特性是足够满足我们的需求的。
图 4
我们作为创业公司都是以开源为主,在新的环境里应用了这样的一些开源技术(图 4),Jenkins、GitLab、Prometheus 和 Spinnaker。Jenkins 和 GitLab 大家应该都听说过,并且都在用,Prometheus、Docker 也都是目前很主流的开源产品。
这里重点介绍两个比较新,现在相当火的开源技术:
-
Spinnaker,
这是一个我个人认为非常优秀的开源的发布系统,它是由 Netflix 在去年开源的,是基于 Netflix 内部一直在使用的发布系统做的开源,可以说是 Netflix 在 CD 方面的最佳实践,整个社区非常活跃,它对 Kubernetes 的环境支持非常好。
-
Traefik,
在我们的环境里用来取代 Nginx 反向代理,Traefik 是用 Go 写的一个反向代理服务软件。
-
Netflix 的开源项目。
Netflix 的开源项目在社区一直有着不错的口碑。
-
有开放性和集成能力。
它原生就可以支持 Jenkins、GitLab 的整合,它还支持 Webhook,就是说在某一个环境里,如果后面的某个资源的控制组件,本身是个 API,那它就很容易整合到 Spinnaker 里。
-
拥有较强的 Pipeline 表达能力。
它的 Pipeline 可以复杂到非常复杂,Pipeline 之间还可以关联。
-
有强大的表达式功能。
可以在任何的环节里用表达式来替代静态参数和值,在 Pipeline 开始的时候,生成的过程变量都可以被 Pipeline 的每个 stage 调用。
比如说这个 Pipeline 是什么时候开始的,触发时的参数是什么,某一个步骤是成功还是失败了,此次要部署的镜像是什么,线上目前是什么版本,这些都可以通过变量访问到。
-
界面友好,
支持多种云平台。
目前支持 Kubernetes、OpenStack、亚马逊的容器云平台。
图 5
图 5 是 Spinnaker 的架构,它是一个微服务的架构,里面包含用户界面 Deck,API 网关 Gate 等。
API 网关是可以对外开放的,我们可以利用它和其他工具做一些深度整合。Rosco 是它做镜像构建的组件,我们也可以不用 Rosco 来做镜像构建。Orca 是它的核心,就是流程引擎。
Echo 是通知系统,Igor 是用来集成 Jenkins 等 CI 系统的一个组件。Front52 是存储管理,Cloud driver 是它用来适配不同的云平台的,比如 Kubernetes 就有专门的 Cloud driver,也有亚马逊容器云的 Cloud driver。Fiat 是它一个鉴权的组件。
图 6
图 6 是 Spinnaker 的界面,界面一眼看上去挺乱,实际上它还是有很好的逻辑性。
这里每一个块都有三种颜色来表示 Kubernetes 环境里的某个实例的当前状态。绿色代表是活着的
实例
,右边是实例的信息,包括实例的 YML 配置,实例所在的集群,实例的状态和相关 event。
图 7
图 7 是 Pipeline 的界面。首先,我觉得这个界面很好看很清晰。二是 Pipeline 可以做得非常灵活,可以在执行了前几个步骤之后,等所有的步骤执行完了再执行某个步骤。
这个步骤是某个用户做某个审批,再分别执行三个步骤其中的一个步骤,然后再执行某个环节。也可以发布还是回退,发布是走发布的流程,回退就是回退的流程。
总之在这里,你所期待的 Pipeline 的功能都可以提供,如果实在不行,还有 Webhook 的模式让你方便和外部系统做整合。