DevOps 是一种软件开发人员和 IT人员之间的合作过程,目标是高效地自动执行软件交付和基础架构更改流程。那云原生时代,企业又如何借助DevOps 实现产品快速、稳定、高效和安全地迭代,释放业务价值呢。
什么是云原生
为了解决传统应用升级缓慢、架构臃肿、不能快速迭代、故障不能快速定位、问题无法快速解决等问题,云原生这一概念横空出世。
Pivotal 是云原生应用的提出者,并推出了Pivotal Cloud Foundry 云原生应用平台和 Spring 开源 Java 开发框架,成为云原生应用架构中先驱者和探路者。
早在2015年Pivotal公司的Matt Stine就写了一本叫做迁移到云原生应用架构的小册子,其中探讨了云原生应用架构的几个主要特征:符合12因素应用,面向微服务架构,自服务敏捷架构,基于API的协作,抗脆弱性。
后来Pivotal对云原生的定义做过几次更新, 最新的Pivotal 官网上对云原生应用的最新介绍是关注以下四点:集成DevOps、持续交付、微服务和容器化。
- DevOps 是软件开发人员和 IT 运营之间的合作,目标是自动执行软件交付和基础架构更改流程。它创造了一种文化和环境,可在其中快速、频繁且更可靠地构建、测试和发布软件。
- 持续交付使得单个应用更改在准备就绪后即可发布,而不必等待与其他更改捆绑发布或等待维护窗口期等事件。持续交付让发布行为变得平淡可靠,因此企业可以以更低的风险频繁交付,并更快地获得最终用户的反馈,直到部署成为业务流程和企业竞争力必不可少的组成部分。
- 微服务是将应用作为小型服务集合进行开发的架构方法,其中每个服务都可实施业务功能,在自己的流程中运行并通过 HTTP API 进行通信。每个微服务都可以独立于应用中的其他服务进行部署、升级、扩展和重新启动,通常作为自动化系统的一部分运行,可以在不影响最终客户的情况下频繁更新正在使用中的应用。
- 与标准虚拟机相比,容器能同时提供效率和速度。单个操作系统实例使用操作系统 级的虚拟化,在一个或多个隔离容器之间进行动态划分,每个容器都具有唯一的可写文件系统和资源配额。创建和破坏容器的开销较低,再加上单个虚拟机中的高包装密度,使容器成为部署各个微服务的完美计算工具。
Google主导成立了云原生计算基金会(CNCF),对云原生的定义为1. l云原生(Cloud Native)技技术帮助企业和机构在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、 服务网格、微服务、不可变基础设施和声明式 API。 2.l这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术可以使开发者轻松地对系统进行频 繁并可预测的重大变更 。
目前云原生背后最大的推手就是CNCF,关键技术包括容器、微服务、服务网格、devops,声明式的API等等。
云原生应用与传统应用的对比,云原生应用可以充分利用云的优势,灵活地在各个云厂商分发应用,释放企业生产力,聚焦到业务创新上,而不是花费更多的时间在适配和扩展不同的基础设施平台上。
云原生时代的DevOps新挑战
首先我们要清楚地知道, 站在企业的角度来看,在这样一个快捷商业的时代,企业最需要什么?
- 唯快不破。这里的快可以解读出来两层含义,一是业务应用快速上线,有利于抢占市场先机,第二层意思呢就是在你的业务有爆炸式的增长的时候,你何如在计算资源上给以充分的保证,这个时候其实追加巨额的IT投资购买软硬件也未必能跟得上业务的快速发展。这个其实就是企业研发效能的问题。
- 稳中求变。业务或者应用的稳定性永远都是第一位的,如何既保证业务的“稳态”又要满足快捷商业的“敏态”需求,比如新业务的上线、应用的变更等。这个是企业IT架构的问题。
- 节省资源,如何节省计算资源,根据业务是否高峰自动扩容缩容,这个是云平台建设的问题
- 开拓创新,开发运维一体化、微服务架构
DevOps最初的出现打破了开发人员和运维人员之间历来存在的壁垒和沟鸿,加强了开发、运营和质量保证人员之间的沟通、协作与整合。在后DevOps时代,我们可以借助容器技术更快地对应用进行迭代上线。
下面是应用发布的一般过程,开发者push代码,触发构建,构建过程是拉取源码,应用打包,容器镜像推送,部署。
这个模型其实已经有很多地方充分利用了云原生的优势,比如容器技术、kubernetes、动态分配slave pod等。但还有一些挑战。
- 如何应用在环境栈之间的安全推进发布
- 如何管理应用发布的权限和安全审批
- 如何提高应用的平均部署时间和平均恢复时间
- 如何迅速对线上应用进行故障定位、复现和回滚
云原生时代下的DevOps之道
首先我们要充分利用云原生技术的优势,云原生可以改进应用开发的效率,改变企业的组织结构,甚至会在文化层面上直接影响一个公司的决策。在容器领域内,Kubernetes已经成为了容器编排和管理的社区标准。它通过把应用服务抽象成多种资源类型,比如Deployment、Service等,提供了一个云原生应用通用的可移植模型。在这样的背景下,我们如何在云原生的环境下实践更高效的DevOps来达到更有生产力的表现就成为了一个新的课题和诉求。
下面是一个企业应用平台的建设目标:
在此PaaS平台的基础上,我们设计了GitOps安全发布模型来解决前面我们提到的一些挑战。
在设计GitOps发布模型的时候是有以下这些核心诉求的:
- 版本管理。我们希望每一个发布的应用的版本号都能跟git commit id关联,这样的好处就是每一个变更都有历史记录查询、可以更快进行故障定位和修复
- 基线管理。便于问题复现和快速回滚
- 安全发布。包括发布权限管理以及安全审批的内容;
- 快速反馈。提高研发效能
GitOps发布模型有以下特性:
- Git仓库是任何CICD过程的唯一输入源
- 声明式的应用编排、构建部署模型
- 应用在环境栈之间的无差别、自动化推进
- PR/MR触发的拉取式流水线过程
- 快速反馈机制
下面是使用GitOps管理应用发布到不同kubernetes集群的架构图。首先是应用源码与构建源码分离,我们可以看到橙色框起来的这两个源码项目,一个是我们的应用源码项目application-java-demo, 左侧的这个源码项目是用来存放构建源码的,比如preview pipeline的Jenkinsfile, staging pipeline的Jenkinsfile,production pipeline的Jenkinsfile, 除了Jenkinsfile之外,可能还有一些关于动态创建测试环境、连接预发环境或者生产环境的敏感信息,这些敏感信息也可以存放在数据库里,然后这里保存数据库的连接信息。 这个普通应用application-java-demo在Git仓库里是有不同的分支的,每个分支跟kubernetes集群环境都有一定的对应关系,比如我们这里的设定,master分支对应的是生产环境,latest分支对应的是预发环境,其他开发分支对应的是测试环境,测试环境的动态创建和销毁、应用再测试环境的部署发布是开发测试人员自助的服务,但应用想要部署到预发环境和生产环境中的话是需要经过管理员安全审批的。
普通开发者的权限只有创建新代码分支和创建合并请求的权限,除此之外,剩下其他的部分都是管理员才有权限做的,绿色区域是Jenkins的流水线任务,当然你也可以是使用其他cicd引擎来做这个流水线任务的构建。普通开发者没有Jenkins环境的创建Job和构建Job的权限,也没有更改配置的权限,他有的只是构建Job的日志查看权限。
最后是一个时序图,演示一个应用从开发测试到业务上线迭代的一个完整流程:
(1)开发者提交新的功能分支feature;
(2)开发者创建请求合并代码到latest分支的Merge Request;
(3)开发者创建Merge Request的动作自动触发名为preview-pipeline的Jenkins流水线任务的构建
(4)preview-pipeline流水线任务从Git服务器拉取preview-pipeline源码项目,并按照项目中Jenkinsfile文件中的声明式脚本运行源码编译、测试、容器镜像构建和推送、应用部署到Preview的容器集群、钉钉通知的流程。
(5)管理员在Git服务器的Merge Request页面查看应用的预览连接并验证应用是否可以合并到latest分支,如果通过验证则接受Merge Request的合并,触发步骤6, 如果不通过则通知开发者进行代码更新和提交,退回步骤1
(6)管理员接受Merge Request合并的动作会自动触发Jenkins流水线任务staging-pipeline的构建
(7)staging-pipeline流水线任务从Git服务器拉取staging-pipeline源码项目,并按照项目中Jenkinsfile文件中的声明式脚本运行源码编译、测试、容器镜像构建和推送、应用部署到Staging的容器集群、钉钉通知的流程。
(8)Staging环境中的应用服务在通过测试和验证后,管理员可以合并latest分支到master分支
(9)管理员合并latest分支到master分支后,会自动触发Jenkins流水线任务production-pipeline的构建
(10)production-pipeline流水线任务从Git服务器拉取production-pipeline源码项目,并按照项目中Jenkinsfile文件中的声明式脚本运行源码编译、测试、容器镜像构建和推送、应用部署到Production的容器集群、钉钉通知的流程。
GitOps是一套方法论,所以其实是有多种实践的方式的,会有多种多样的好用的工具,比如使用draft可以帮助完成应用编排模板的自动化生成,skaffold用来简化应用构建部署流程,kaniko可以实现不依赖docker daemon的镜像构建和推送,helm用作应用的包管理工具,还有其他cicd引擎像jenkins,tekton,argo以及为云原生而生的jenkinsx等等
后面,我们会单独实战演示GitOps安全发布模型的工作过程。