OpenShift中的持续交付

简介: 上一文中讲述了如何在AWS下搭建OpenShift集群。这篇文章将目光转向如何在OpenShift中实现CI/CD以及产品环境的部署。持续交付如果要打造一个持续交付的流水线,首先要考虑多环境的问题。

上一文中讲述了如何在AWS下搭建OpenShift集群。这篇文章将目光转向如何在OpenShift中实现CI/CD以及产品环境的部署。

持续交付

如果要打造一个持续交付的流水线,首先要考虑多环境的问题。一般一个应用程序会有多个环境,比如开发环境、集成测试环境、系统测试环境、用户验收测试环境、类生产环境、生产环境。如何在OpenShift中隔离并建立对这些环境的部署流程有多种方案可以选择。

  1. 同一个project中使用label和唯一名称来区分不同的环境;
  2. 集群中的不同project来隔离环境;
  3. 跨集群来隔离环境。

我们以第二种方式为例,演示下多环境管理问题。

img_b63da57fbc90c4155a7d0d9a602bd990.png

在上图中,我们有一个build project。build project包含了一组相互依赖性比较强的应用,每个应用对应一个build config,产生的Image Stream存放在image register中。而每个环境各对应一个project,其中包含了该应用的deployment config,其镜像输入是build config产生的Image Stream。之所以这样做,有以下几点考虑:

  1. 不同的环境分布在不同的project中,可以很好的借助project的特性进行环境隔离。比如sys project的容器只能部署在label为sys的node上,prod project的容器只能部署在label为prod的node上。

  2. 不同的project可以分别定义权限访问和控制。比如只有QA才能操作sys project中的资源,运维工程师才能操作prod project中的资源。

  3. 不同的环境共用一个Image Stream,保证了应用程序镜像在不同环境中的是完全一致的,防止由于测试环境和生产环境不一致而引入缺陷。

那么大家共用同一个Image Stream,如何实现应用的promotion那?解决方案就是使用tag。

img_d5a29bf40330749908d43ef8076bc916.png

如上图所示,一个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的镜像。

1
oc tag App1:latest App1:sys

如果在Deployment Config里面配置了自动监听tag的变动的操作,那么一旦你修改了ImageStream的tag,就会自动触发对应环境的部署。

由于应用程序镜像在不同的环境中是一致的,那么变动的部分都被抽取到了外部配置中。如何根据不同的环境来加载对应的外部配置那?实现方式有很多种,这里介绍了使用Spring Cloud Config的方案。

img_1aff0a66c5c9de54a58a8e36ad01c555.png

首先我们将针对不同环境的配置放置在一个git仓中,然后通过Spring Cloud Config Server将其转换为http服务。而我们在应用中嵌入Spring Cloud Config Client,其会接收一个环境变量来拉取指定环境的配置。而该环境变量可以通过Deployment Config来进行注入。

1
oc env dc/sys PROFILE=sys

使用Spring Cloud Config给予了我们更多的灵活性。我们可以选择在应用程序第一次启动的时候拉取配置,也可以设置每隔一段时间自动更新配置,从而实现热更新。

OpenShift虽然提供了构建和部署的能力,我们有时也需要使用Jenkins之类的工具来可视化以及编排整个流水线。

img_51afcf690af61ae579a782d98dec2b72.png

既然OpenShift是个容器化的管理平台,那么我们完全也可以将Jenkins作为一个应用纳入到OpenShift中来托管,这样Jenkins的Master和Slave都是容器化的。OpenShift官方提供了一个Jenkins2.0的镜像,其预装了OpenShift pipeline插件,可以很方便地进行构建、部署等操作。

生产环境的部署

OpenShift在产品环境的部署默认是rolling的方式。

img_59d77f02306fcd0801a934551ef2914c.png

每次部署时,它会启动一个新的Replica Controller,部署一个pod,然后削减旧的Replica Controller的pod,如此往复,直到旧的Replica Controller中的所有pod都被销毁,新的Replica Controller的所有pod都在线。整个过程保证了服务不宕机以及流量平滑切换,对用户是无感知的。

而有的时候部署场景要负责些,比如我们想在产品环境对新版本做了充分的PVT(product version testing)才切换到新版本。那么就可以使用蓝绿部署的方式。

img_eadc9ab136083433c3fef827230aaa75.png

蓝绿部署方案的关键点在于一个Router对应两个Service。而Route作为向外界暴露的服务端口是不变的,两个Service分别对应我们的生产蓝环境和生产绿环境。同时只有一个Service能接入Router对外服务,另一个Service用来进行PVT测试。切换可以简单的修改Router的配置即可。

1
2
3
4
5
port:
  targetPort: app-blue-http
to:
  kind: Service
  name: app-blue

结语

OpenShift在应用的构建以及部署方面为我们提供了大量开箱即用的功能和解决方案,所以实现持续交付不再那么艰难。我们可以将更多的精力花费在提升应用程序质量以及架构方面,交付更好的产品。

相关文章
|
4月前
|
jenkins 持续交付 开发者
自动化部署:使用Jenkins和Docker实现持续集成与交付
【8月更文挑战第31天】本文旨在为读者揭示如何通过Jenkins和Docker实现自动化部署,从而加速软件开发流程。我们将从基础概念讲起,逐步深入到实际操作,确保即使是初学者也能跟上步伐。文章将提供详细的步骤说明和代码示例,帮助读者理解并应用这些工具来优化他们的工作流程。
|
2月前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
105 2
|
6月前
|
jenkins Java 持续交付
|
存储 Kubernetes Docker
【排坑指南之kubeSphere】2022年最新版-”kubeSphere3.2.1 Paas容器云平台“使用DevOps-CICD之”排坑指南“
【排坑指南之kubeSphere】2022年最新版-”kubeSphere3.2.1 Paas容器云平台“使用DevOps-CICD之”排坑指南“
143 0
|
Kubernetes Cloud Native jenkins
【云原生】DevOps(八):Jenkins集成Kubernetes
【云原生】DevOps(八):Jenkins集成Kubernetes
343 0
|
敏捷开发 Devops 持续交付
CICD
最初是瀑布模型,后来是敏捷开发,现在是DevOps,这是现代开发人员构建出色的产品的技术路线。随着DevOps的兴起,出现了持续集成(Continuous Integration)、持续交付(Continuous Delivery) 、持续部署(Continuous Deployment) 的新方法。传统的软件开发和交付方法正在迅速变得过时。从历史上看,在敏捷时代,大多数公司会每月,每季度,每两年甚至每年发布部署/发布软件。然而,现在,在DevOps时代,每周,每天,甚至每天多次是常态。当SaaS正在占领世界时,尤其如此,您可以轻松地动态更新应用程序,而无需强迫客户下载新组件。很多时候,他们甚
|
运维 Kubernetes 关系型数据库
基于 KubeVela 的 GitOps 交付
本文将介绍如何使用 KubeVela 来完成 GitOps 交付。 KubeVela 作为一个简单、易用、且高可扩展的云原生应用管理工具,能让开发人员方便快捷地在 Kubernetes 上定义与交付现代微服务应用,无需了解任何 Kubernetes 基础设施相关的细节。 KubeVela 背后的 OAM 模型天然解决了应用构建过程中对复杂资源的组合、编排等管理问题,同时也将后期的运维策略模型化,这意味着 KubeVela 可以结合 GitOps 管理复杂大规模应用,收敛团队与系统规模变大以后的系统复杂度问题。
783 0
基于 KubeVela 的 GitOps 交付
|
人工智能 运维 Kubernetes
深入解读:KubeVela 与 PaaS 有何不同?
在 KubeVela 项目发布以后,很多国内外的社区同学们都会问到一个类似的问题:KubeVela 的体验真的非常棒,可以说是 Kubernetes 上的 Heroku 了。这么看来, KubeVela 跟 Heroku 这样的 PaaS 产品到底是不是一类项目呢?
深入解读:KubeVela 与 PaaS 有何不同?
|
Devops jenkins 持续交付
【下一代核心技术DevOps】:(五)微服务CI与Rancher持续集成
1. 引言   DevOps的核心魅力是快速的持续集成交付,降低研发和实施运维之间的交互,使得传统的各种扯皮现象统统消失。最重要的是降低成本   保障产品交付可靠性。    使用Rancher作为持续集成的关键环节,统一结连微服务和云计算,使得产品从研发到上线流水线操作,提高生产效率,此处我写的是微服务    而不是传统的程序,是因为微服务(架构的产品)和容器服务,云计算是完美结合的三大核心模块,也是互联网下一代核心技术DevOps的3个    核心支柱。
1784 0
|
Kubernetes 测试技术 Shell
使用Helm优化Kubernetes下的研发体验:实现持续交付流水线
整体目标 在这一篇中,我们将使用Jenkins在此基础上构建一条完整的持续交付流水线,并且让团队不同成员能够基于该流水线展开基本的协作。开发: 持续提交代码并能够通过持续集成(CI)过程快速获取反馈,在通过CI验证后,能够自动化部署到开发环境,以便后续的进一步功能测试(手动/自动自动化测试)等; 测试: 在需要对项目功能进行验证时,可以一键部署测试环境,并且在此环境基础上可以完成功能验收(手动),以及全量的自动化验收测试等; 运维:一键部署生产环境,同时发布创建版本,以便在发布异常时能够快速回归。
1838 0

热门文章

最新文章