如果要打造一个持续交付的流水线,首先要考虑多环境的问题。一般一个应用程序会有多个环境,比如开发环境、集成测试环境、系统测试环境、用户验收测试环境、类生产环境、生产环境。如何在 OpenShift 中隔离并建立对这些环境的部署流程有多种方案可以选择。
我们以第二种方式为例,演示下多环境管理问题。
在上图中,我们有一个 build project。build project 包含了一组相互依赖性比较强的应用,每个应用对应一个 build config,产生的 Image Stream 存放在 image register 中。而每个环境各对应一个 project,其中包含了该应用的 deployment config,其镜像输入是 build config 产生的 Image Stream。之所以这样做,有以下几点考虑:
那么大家共用同一个 Image Stream,如何实现应用的 promotion 呢?解决方案就是使用 tag。
如上图所示,一个 image stream 里面有多个版本的镜像,而 OpenShift 可以为版本添加自定义 tag。在不同的 project 里面,我们配置 image 的来源为 "ImageStreamTag",名称为 "applicationName:environmentName"。比如 sys project 的镜像名为 "App1:sys",prod project 的镜像为 "App1:prod"。如果想将 version 3 的镜像推送到 sys 环境,只需要简单的给 version 3 的镜像打上 sys 的 tag,这样部署 sys 环境时就会自动使用 version 3 的镜像。
- oc tag App1: latest App1: sys
如果在 Deployment Config 里面配置了自动监听 tag 的变动的操作,那么一旦你修改了 ImageStream 的 tag,就会自动触发对应环境的部署。
由于应用程序镜像在不同的环境中是一致的,那么变动的部分都被抽取到了外部配置中。如何根据不同的环境来加载对应的外部配置呢?实现方式有很多种,这里介绍了使用 Spring Cloud Config 的方案。
首先我们将针对不同环境的配置放置在一个 git 仓中,然后通过 Spring Cloud Config Server 将其转换为 http 服务。而我们在应用中嵌入 Spring Cloud Config Client,其会接收一个环境变量来拉取指定环境的配置。而该环境变量可以通过 Deployment Config 来进行注入。
- oc env dc / sys PROFILE = sys
使用 Spring Cloud Config 给予了我们更多的灵活性。我们可以选择在应用程序第一次启动的时候拉取配置,也可以设置每隔一段时间自动更新配置,从而实现热更新。
OpenShift 虽然提供了构建和部署的能力,我们有时也需要使用 Jenkins 之类的工具来可视化以及编排整个流水线。
既然 OpenShift 是个容器化的管理平台,那么我们完全也可以将 Jenkins 作为一个应用纳入到 OpenShift 中来托管,这样 Jenkins 的 Master 和 Slave 都是容器化的。OpenShift 官方提供了一个 Jenkins2.0 的镜像,其预装了 OpenShift pipeline 插件,可以很方便地进行构建、部署等操作。
OpenShift 在产品环境的部署默认是 rolling 的方式。
每次部署时,它会启动一个新的 Replica Controller,部署一个 pod,然后削减旧的 Replica Controller 的 pod,如此往复,直到旧的 Replica Controller 中的所有 pod 都被销毁,新的 Replica Controller 的所有 pod 都在线。整个过程保证了服务不宕机以及流量平滑切换,对用户是无感知的。
而有的时候部署场景要负责些,比如我们想在产品环境对新版本做了充分的 PVT(product version testing)才切换到新版本。那么就可以使用蓝绿部署的方式。
蓝绿部署方案的关键点在于一个 Router 对应两个 Service。而 Route 作为向外界暴露的服务端口是不变的,两个 Service 分别对应我们的生产蓝环境和生产绿环境。同时只有一个 Service 能接入 Router 对外服务,另一个 Service 用来进行 PVT 测试。切换可以简单的修改 Router 的配置即可。
- port:
- targetPort: app-blue-http
- to:
- kind: Service
- name: app-blue
OpenShift 在应用的构建以及部署方面为我们提供了大量开箱即用的功能和解决方案, 所以实现持续交付不再那么艰难。我们可以将更多的精力花费在提升应用程序质量以及架构方面,交付更好的产品。
来源: https://juejin.im/entry/5a373cf5f265da431e16db1d