如何设计一条稳定的应用交付流程?|云效工程师指北

简介:如何设计一条稳定的应用交付流程?为持续交付的过程提供了规范化的可能,也引入了让人不时埋首于配置文件的小山里的麻烦。我们不妨从一次略有波折、稍显隐患的集成部署案例开始,看看如何着手设计一条更为稳定的应用交付流程。

大家好,我叫王泊,负责云效应用交付AppStack的开发。把应用部署到各个环境、一步步进行集成测试,最终发布到生产环境,是程序员工作中必不可少的组成部分;而云原生技术引入的容器化、IaC(基础设施即代码,Infrastructure as Code)等等技术与理念,为持续交付的过程提供了规范化的可能,但也引入了让人不时埋首于配置文件的小山里的麻烦。我们不妨从一次略有波折、稍显隐患的集成部署案例开始,看看如何着手设计一条更为稳定的应用交付流程。

一次波折的部署

许多个迭代后,面对陪风扇一起嘎吱嘎吱转着的流水线,程序员阿伟会回忆起把系统部署到预发环境、提交最后一轮验收,然后被打回来的那个并不遥远的下午。当时他有一个酷炫的Java SpringBoot应用要上线,实现了酷炫的“在不同部署环境下、发送带环境路由标签的业务消息”的接口:

日常环境的镜像构建、部署和验收测试一路OK,但是在再次构建部署到预发环境后,阿伟发现消息丢了:预发环境的消费方并没有消费到消息。经过一系列不管黑屏白屏康到bug就是好屏的排查,发现问题起源于在预发环境使用的SpringBoot配置文件application-staging.yaml中漏配了routing.env属性,应用启动时使用了缺省配置application.yaml中的兜底值,导致消息tag打错。

具体的问题倒是解决了,不过多少会留下点顾虑:以后写配置项的时候,免不了翻来覆去diff一下,是不是漏了什么,会不会导致各个环境里的产物有微妙的结构差异引发bug……

旧交付方式的潜在问题

仍然以SpringBoot应用为例,一部分开发者将应用从传统的虚机部署迁移到Kubernetes上的容器化部署时,会使用类似下面的思路:

框架提供了为不同环境编写不同application.yaml配置文件的机制,用以达到环境差异化部署的效果。我们不难构陷出小故事的主人公阿伟也使用了类似的思路:

● 使用application.yaml提供所有环境的共性(和一部分兜底)配置;
● 各环境的差异化配置由单独的application-xxx.yaml给出,覆盖兜底配置;各差异化配置不作特别的规范要求,允许属性取值不同,也允许引入某个环境特有的属性值;
● 为不同环境的镜像编写不同的Dockerfiles, 环境配置方面的差异主要在于启动应用时指定的参数不同。

一个典型的工程目录看起来像是这样:

看起来很规整,但其实也引入了一些问题:

● 环境差异化配置需要靠人工核对来减少错漏,编写application.yaml这类基准配置的时候也需要慎重考虑提供什么样的兜底值,一旦有差错则排查成本相对高;
● Dockerfile往往没有很大的差异,但构建出来的产物是和具体环境强绑定的,没办法复用;多次编译可能因为某些隐患(最典型的比如依赖版本不严格)导致不同环境下的交付内容并不一致,有引入bug、招致线上问题的风险。
  ○ 比如在日常环境下完成构建后,某个(可能是间接)依赖的快照包被更新了(可能是不规范的快照包更新,也可能是安全包之类选择倾向于让接入方无感升级而使用快照版本当作release);此后部署到预发环境时,构建引用了新版本的依赖包,导致日常环境下的测试验收结论可信度下降。

单应用逐环境晋级方案的考量

吃一堑长一智,我们不妨帮阿伟的应用发布方案列出下面的考量:

● 产物对环境中立:环境差异化配置在部署时注入,一份镜像可以用于所有环境的部署。
● 环境配置统一:所有环境使用同样格式的配置模板和差异化的值注入,避免“兜底+覆盖”引入的配置模板差别。

具体来说,在“日常-预发-生产”的整条集成发布流程中,使用的镜像和编排只有一份;镜像中的SpringBoot应用里,也只使用application.yaml,不再引入其他差异化配置。

这样做看起来限制了一些灵活性,但核心考虑在于:通常情况下很难规范配置文件和编排的具体格式;一旦存在“一份配置兜底+多份差异化调整”的情况,理解应用代码逻辑和部署细节的成本会变高,维护、验证应用逻辑所需理解的内容也随配置文件的增加而线性增长。即使是应用的设计者或是owner,也难免随着时过境迁而忘记一些细节(“我当时为什么要加这个环境变量来着”),更不用提中途加入进行功能迭代的其他开发人员了。

实际部署到Kubernetes集群中时,环境变量通过编排中容器的环境变量注入。接下来需要统一Deployment编排——如果为不同的环境使用多份编排文件,仍然会引入无意义的重复。这里我们可以使用Helm chart的形式,诸如镜像、环境变量等等在构建部署时才能决定的差异化配置,都可以通过values配置进行注入:

需要定制化的部分,则是CICD系统中动态生成Values.yaml配置的脚本。这部分的复杂性相对容易控制,具体的实现则根据使用的CICD工具不同而略有差异,我们将会在后文中看到一个概略的示例。

方案改造例

现在可以回到阿伟的服务上进行改造了。

Step 1: 统一application.yaml和Dockerfile

首先我们要压缩服务中的SpringBoot application yaml配置,只留下一份:

这里使用了占位符${DEPLOY_ENV},要求环境变量提供routing.env的值。

Dockerfile则可以去掉所有环境差异化的环境变量定义、统一为一份配置,并假定环境变量都已经正确注入。

Step 2: 编写Helm chart

从创建一份空的helm chart开始:

接下来,可以把原先的编排文件按照helm模板的格式简单改写,放置到cool-service-chart/templates/目录下。以Deployment为例:

我们使用.Values.image这一helm占位符将镜像注入容器。环境变量注入的方式则有多种——变量较少的情况下可以在pod template中直接定义name和value;不过如果考虑到更长远的扩展性,也可以采用关注点分离的方式,单独定义一份ConfigMap用于定义环境变量;这样做的好处,则是添加环境变量的开发者无需理解Deployment的具体结构,甚至只需要理解“往ConfigMap的数据定义里写一个键值对就能实现环境变量注入”就可以了。

基于这些考虑,我们定义容器使用下面的ConfigMap提供键值对、注入环境变量:

Chart里的模板编写完成后,记得推送到一个git库里,方便后面使用。

Step 3: 编写Values.yaml生成脚本

在准备好Helm chart的静态模板部分之后,需要为CICD工具编写部署时生成Values.yaml的脚本。我们不妨假设阿伟的团队选择使用Jenkins建设CICD流水线:

这里我们主要关注chart-complete.sh,它需要完成如下的任务:

● 从git仓库克隆chart库的主干;
● 从环境变量中,生成values.yaml.

如果已经搭建了helm仓库,这里也可以选择把生成好的chart推到仓库。

总结

在单一应用逐环境晋级部署的过程中,往往会涉及到针对环境定制的差异化配置;为了避免Dockerfile、配置文件等冗余带来的治理成本及bug隐患,我们可以利用云原生IaC的优势,基于统一的制品和编排定义,将环境的差异化配置项延迟到部署时注入。这样,在各个环境中所部署的代码是完全一致的,提高了集成的可信程度及测试效率。

当然,从头搭建CICD体系往往也需要一定的试错;云效应用交付AppStack提供了符合前述实践的编排管理、环境治理和差异化配置能力,可以通过集成云效流水线Flow,快速搭建出整条晋级流程,欢迎大家尝试。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云混合云开放网络生态的探索与实践

简介:2022年F5多云应用服务科技峰会于4月正式召开。阿里云智能混合云平台高级网络架构师张然(然犀)应邀于合作伙伴生态专场分享了阿里云混合云在开放网络生态领域的探索与实践。 2022年F5多云应用服务科技峰会于4月正式召开。阿里云智能混合…

阿里云启动超级智算中心,总算力达12 EFLOPS

8月30日,阿里云宣布正式启动张北超级智算中心,总建设规模为12 EFLOPS(每秒1200亿亿次浮点运算)AI算力,将超过谷歌的9 EFLOPS和特斯拉的1.8 EFLOPS,成为全球最大的智算中心,可为AI大模型训练、自…

领域驱动编程,代码怎么写?

简介:领域驱动开发最重要的当然是正确地进行领域拆解,这个拆解工作可以在理论的指导下,结合设计者对业务的深入分析和充分理解进行。本文假定开发前已经进行了领域划分,侧重于研究编码阶段具体如何实践才能体现领域驱动的优势。 …

8年持续增长,全闪存厂商PureStorage分享存储智能化的三大重要指标

作者 | 宋慧 出品 | CSDN云计算 从PureStorage去年宣布为现代数据应用提供多云环境提供存储即服务,已经过去了快一年时间。全闪存技术厂商PureStorage最近再次接受CSDN采访,分享这一年的发展和对全闪存市场的分析。 首先,今年PureStorage继…

深度解密|基于 eBPF 的 Kubernetes 问题排查全景图发布

简介:通过 eBPF 无侵入地采集多语言、多网络协议的黄金指标/网络指标/Trace,通过关联 Kubernetes 对象、应用、云服务等各种上下文,同时在需要进一步下钻的时候提供专业化的监测工具(如火焰图),实现了 Kube…

技术抉择:阿里云13年后重构全部核心调度系统

简介:在阿里云十三年的发展历史上,重新设计调度系统算得上是一个重要的技术抉择。 在阿里云十三年的发展历史上,重新设计调度系统算得上是一个重要的技术抉择。 云计算是一个庞大的技术工程。2009 年,阿里云从 0 到 1 自建国产云…

Redis 的数据被删除,内存占用还这么大?

作者 | 码哥来源 | 码哥字节操作系统分配给 Redis 的内存有 6GB,通过指标 used_memory_human 发现存储数据只使用了 4GB,为何会这样?为何无法保存数据?通过 CONFIG SET maxmemory 100mb或者在 redis.conf 配置文件设置 maxmemory …

阿里云架构师解读四大主流游戏架构

简介:游戏行业是阿里云最早聚焦的行业之一,近年来游戏行业的变化、云计算产品技术的变化都与日俱进。随着行业业务的变化、技术架构的演进以及阿里云产品的迭代演进,整体的产品技术选型在不同的游戏场景、业务场景也不尽相同。本文将聚焦阿里…

国内唯一连续入选Gartner,Quick BI是如何做到的?

简介:阿里云Quick BI凭借灵活的公共云部署,私有化独立部署能力、无缝对接各类云上数据库和自建数据库、可视化搭建分析、高效数据处理能力与强大数据计算能力,使得在2022年持续入选Gartner ABI魔力象限报告。 作者 | 馨心 来源 | 阿里开发者公…

龙蜥开源Plugsched:首次实现 Linux kernel 调度器热升级 | 龙蜥技术

简介:对于plugsched而言,无论是 bugfix,还是性能优化,甚至是特性的增、删、改,都可胜任。 文/龙蜥社区内核开发人员 陈善佩、吴一昊、邓二伟 Plugsched 是 Linux 内核调度器子系统热升级的 SDK,它可以实现…

出家12年,北大数学天才柳智宇下山还俗:从事心理咨询,主动要求降薪至2万...

整理 | 于轩 出品 | CSDN(ID:CSDNnews)提到北大数学天才,大家脑海中首先浮现的或许是有“北大扫地僧”之称的韦东奕。虽有“扫地僧”的称呼,但韦东奕并不是一位真正的僧人,相反,他的师兄&am…

启明创投合伙人叶冠泰:我对云原生投资趋势的思考 | 云原生加速器观点

简介:投资就是一种相信,要相信这个产业,这位企业家,通过我们的相信去传递给下一轮合作的投资人。“相信相信的力量”,我相信软件的未来,也相信软件在中国发展的力量。 作者 | 叶冠泰 3 月 3 日 - 4 日&am…

天翼云打造国云安全品牌 铸牢企业云上安全防线

9月7日,2022年国家网络安全宣传周在安徽省合肥市举办。活动期间,中国电信天翼云举办了云原生安全产品“红盾”系列介绍会,会议以“红云天翼 安全普惠”为主题,详细介绍了“红盾”系列产品的主要功能及优势等。 数字经济时代&…

让微服务开源更普惠,阿里云微服务引擎MSE全球开服

简介:MSE 于2020年10月在国内开启商业化服务,目前已吸引近万客户使用,用于在云上更低成本构建、更稳定运行微服务架构。此次,MSE 向阿里云国际站开放服务,旨在帮助更多客户享受到更加普惠的微服务技术。 随着微服务技…

Dubbo-go-Mesh 开启新一代 Go 微服务形态

简介:Proxyless Service Mesh 能力将跟随 Dubbo-go 下一版本发布,稳定的性能需要社区成员们共同的关注与建设。在此基础之上,我们还会进一步探索轻量级 sdk sidecar的模型;探索基于第三方流量治理组件的金丝雀发布能力&#xff1…

2022数据安全技术大会举办

9月6日,2022数据安全技术大会暨中国信息协会信息安全专业委员会年会在北京举行。本届大会由中国信息协会信息安全专业委员会主办、中国信息协会信息安全专业委员会数据安全技术工作部和天空卫士联合承办,逾3000家企业线上参与。 国家信息中心副主任周民…

css默认样式以及解决办法

display:inline-block元素之间存在缝隙如何解决? 父级添加font-size:0; 解决前 解决后 vertical-align是干嘛的? 属性设置元素的垂直对齐方式 场景:垂直对齐一幅图像 属性: baseline 默认。元素放置在父元素的基线…

如何发起 MQTT 亿级连接和千万消息吞吐性能测试

简介:MQTT 协议凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山。 作者:亦炎 随着 5G 时代的来临,万物互联的伟大构想正在成为现实。联网的物联网设备 在 2021 年已经达到了 120 亿,在未来两年&…

阿里云云原生应用平台总经理丁宇:“连接、合作、赋能”,携手加速器伙伴助力企业云上创新

简介:阿里巴巴研究员、阿里云智能云原生应用平台总经理丁宇表示,如果用三个词来形容我们希望达到的效果,就是连接、合作、赋能。 云原生加速器路演导师评委 进入数智化时代,云上创新是企业加速数字化转型、提升竞争力的必经之路。…

聚焦业务价值:分众传媒在 Serverless 上的探索和实践

简介:随着业务规模的增长,业务方对后台服务的弹性诉求越来越强怎么办?云原生峰会前线最佳落地实践心得分享:看分众传媒如何借助 Serverless 函数计算提升 80% 开发运维效率,有效降低计算成本~ 作者 | 吴松(…