【DevOps】GitOps多环境管理 - 别用多分支!

news2025/1/19 8:23:45

前言

在上一篇文章中【DevOps】GitOps多环境管理(上) - 别用多分支!,我们介绍了在探索GitOps实践过程中会遇到的一些痛点,其中之一就是难以做到跨环境的版本发布,或者说怎么处理多个集群的部署。

在上一篇文章中,我们已经提到了一些可能的解决方法,但是这些方法都不是十全十美的,其中一个比较流行的做法是通过使用Git的分支来区分不同的环境。在这篇文章中,主要的目的便是劝退抱有这般想法的道友。
请添加图片描述

上图是一个非常简单的例子,由于需要手动处理合并,就可能会造成各个分支间合并的时间有差异,上图中,dev环境向staging环境提交了两次PR, 然而,在此期间staging环境没有及时的向production环境提交PR, 这就造成了在devstaging上存在过的发布版本从来没有在production环境上存在过。

在此我想再次重申并强调,一定不要采取使用branch来区分环境的模式来实践GitOps了,甚至应该把这当成一种反面教材。下面我们将详细的说明这样做的坏处。

分支模型已成为过去时

不得不说,长久以来,分支模型都被广泛的应用在各种场景中,并且深入人心,以至于大家在遇到问题时,首先考虑使用它来作为解决方案。但是时代在变化,技术在迭代,在GitOps的场景下,它已不再适用。

首先我们要明确, 分支模型关注的问题是什么:

  • 主要是关注应用的源代码,而不是各环境的部署配置;
  • 当需要在生产环境中切换多个不同的应用版本时,分支模型也非常有用,不能说没有这种需求,但是实际场景中,生产环境一般是比较稳定的,不太会出现多版本部署的情况。

当今流行的Git开发方式是主干开发, 如果需要在生产环境进行feature toggle, 也推荐大家使用feature flag的方式来实现。
请添加图片描述
在GitOps的场景中,应用源代码和部署配置代码应该存放在不同的Git仓库中。 因此,应用源代码仓库采用什么样的分支策略,事实上并不影响我们的配置仓库采用什么样的分支策略。GitOps监测的只是配置仓库的变更并与其同步,因此,我们也不关心源代码仓库采用什么样的分支策略,但是请铭记于心,我们的配置仓库,一定不要继续采用分支模型!

跨环境版本升级并不是代码合并这么简单

如果不仔细思考,似乎在各分支间提交合并请求来进行跨环境的版本升级已经是个完美的方案。如果想要在staging环境中部署当前dev环境的版本,只需要将dev分支的代码向staging环境进行合并,同样的,只要把staging分支的代码向production分支合并,就能把版本发布到production环境。

而且,通过使用git diff命令,我们也非常容易查看各个环境分支间的代码差异。出于安全的考虑,也可以选择在各分支上用PR的方式进行合并,并对PR设置审批流程。目前为止,一切听起来都非常令人满意。但这不过是纸上谈兵罢了,在真实的场景下,却是不如意十之八九。用分支代码合并的方式,通常会遇到很多问题,例如代码冲突,一些意料之外的修改,代码变更的顺序不对等等。

举个例子,如下是一个staging环境中的应用的deployment清单:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-deployment
spec:
  replicas: 10
  template:
    spec:
      containers:
      - name: backend
        image: demo-app:1.0

可以看到,在staging环境中,当前的应用版本是1.0, 现在QA团队通知我们1.1版本已经在qa环境稳定运行了,希望可以在staging环境中升级到版本1.1。 按照之前的方式,我们需要做的就是将qa分支的代码合并到staging分支,然后就万事大吉了。

但这个世界上总有一些你不知道的事在时时刻刻的发生着,比如,由于资源的限制,在qa环境上,这个deployment中的replicas配置的值为2, 当代码合并到staging分支时, 这个值同样也被覆盖了, 于是staging环境触发部署时,不仅把应用版本更新到了1.1, 还把这个应用的副本数减少为了2个(原本是10个), 如果在生产环境合并时发生这样的问题,那是非常危险的,一些高负载的应用很可能会发生拥塞进而崩溃,导致不可用的发生。

针对这个问题,一定会有人反驳说:“合并请求一定是需要多人审阅并批准的”。但是别忘了,在真实的场景下,应用的数量往往是很多的,对应的配置清单就更多了,而且多数是通过模版生成的,对于人类来说,去了解每一个配置细节,并在每次审阅时清楚的知道每个配置更改是否是期望的,并不是一件容易的事情,非常容易犯错。

再退一步说,即使我们能够完全清楚的知道每一个细节,能够区分哪些更改应该被合并,哪些不应该被合并,那我们还需要选择性的合并某些commit(使用git cherry-pick), 这又会带来额外的工作量,就不仅仅是简单的代码合并了。

除此之外,代码的更改与环境所需的更新之间,顺序可能并不同步, 比如,在qa环境按序做了下面4个更改:

  1. ingress中新增了一个hostname
  2. qa环境应用版本升级到了1.2, QA开始进行测试
  3. 测试发现问题,在qa分支修改了一个configmap
  4. qa分支上修改了deployemnt中的resource limit

由于1.2版本还在测试中,不能发布到staging环境, 但是ingressdeployment中的更改需要推送到staging环境中去。如果此时简单的把qa分支的代码向staging分支合并,上述的4个变更都会被发布到staging分支,与我们想要的结果不一样。为了解决这个问题,我们还是需要使用git cherry-pick或其他方式,只将第1和第4个变更合并到staging分支。

容易发生配置漂移

配置漂移是指在多个部署环境中使用的配置不再一致的现象。这种情况通常发生在手动管理部署环境的情况下,其中配置可能会因为不同的人员、工具或过程而发生变化。理论上说,用代码合并的方式做环境升级不应该会出现这样的情况,但实际上却会常常发生。例如,生产环境发现了一个问题需要快速的解决,这时不太可能先在dev环境上修改配置,再推送到staging再到production,常见的情况是会直接在production上应用一个修复(比如在deployment清单中的某个很小的配置修改)。
请添加图片描述
那么,在此之后,staging分支再向production分支提交合并请求时,就会发生代码冲突,导致失败。理论上,这样的情况是可以避免的,比如,在production环境做完修复后,将production的代码再合并到staging,再合并到qa。但是实际上,大多数企业的实践都是单向合并,也就是说,合并只会从低等级的环境向高等级的环境合并(qa->staging->production), 而不会反向进行合并。所以,这种情况仍然是一个很大的问题。

总结

上面说的这些问题,在环境越来越多的情况下,处理的难度会指数级的上升,因此,在GitOps的实践中,一定不要选用分支的方式来管理多个环境。 下一篇文章中,我们会推荐一种在GitOps中进行多环境管理的方式。

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

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

相关文章

记一次内存泄漏排查

记一次内存泄漏排查 文章目录记一次内存泄漏排查背景问题排查问题处理背景 最近某项目的服务突然告警,cpu超85%,随后就是服务宕机。交付重启服务后恢复正常但是随后不久又开始告警,特别是白天,严重影响客户业务进行。 问题排查 …

【分享贴】如何衡量和提高项目成功?

“如何衡量项目成功?” 无论是对于项目经理还是组织来说都希望项目能够成功,但是怎样才算是项目成功了呢? 世界项目管理大师哈罗德科兹纳认为:“传统项目或运营项目成功的衡量标准是时间、成本和范围;创新项目成功的衡…

函数调用、

1、函数调用 重载了函数调用运算符&#xff08;&#xff09;的类 实例化的对象 就叫做函数对象 函数对象 &#xff08;&#xff09;触发 重载函数调用运算符 执行 》类似函数调用 &#xff08;仿函数&#xff09; #include <iostream> using namespace std; class Pr…

【hello Linux】Linux第一个小程序 - 进度条

目录 先来区分两个标识符&#xff1a;回车和换行 1. 倒计时 2. 进度条 Linux&#x1f337; 下面来编写Linux系统下的第一个小程序 - 进度条 先来区分两个标识符&#xff1a;回车和换行 \r 和 \n \r 回车 &#xff1a;代表回到本行的开头&#xff1b; \n 换行 &#xff1a;代表…

【Linux】vscode的使用 | 进程间通信(简单概括)

文章目录1.vscode的下载2. vscode的使用1. 连接远端2. 在vscode创建文件并运行程序切换到命令行3. 安装常见插件3. 进程间通信1. 简单举例2.管道原理为什么把读写都打开&#xff0c;只打开读或者写不可以吗&#xff1f;3. 通过父子进程理解管道1. 创建匿名管道系统调用为什么可…

不用996,不用007,赚的还比我多?我直接好家伙

今天打开手机就看见信息99&#xff0c;哟吼&#xff0c;还挺热闹——感情都在上班摸鱼呢。 好奇心让我点了第一条未读信息&#xff0c;好家伙&#xff0c;直接让我手机闪退出APP了&#xff01; 嗨&#xff0c;我这暴脾气&#xff0c;直接手动滑到了第一条&#xff01;但是我没…

CentOS7-部署Tomcat并运行Jpress

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。1、简述静态网页和动态网页的区别 静态网页&#xff1a; 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进…

009:Mapbox GL点击click某位置,显示坐标信息

第009个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中点击某位置,显示坐标信息 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共81行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:htt…

一行代码就能完成的事情,为什么要写两行?

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 三元运算符 用三元运算符代替简单的if else if (age < 18) {me 小姐姐; } else {me …

MIMO-OFDM无线通信技术(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本代码为MIMO-OFDM无线通信技术及MATLAB实现。分为十章&#xff0c;供大家学习。 &#x1f4da;2 运行结果 主函数部分代码&a…

移动端架构师都需要具备怎样的技术栈和能力

移动端架构师都需要具备怎样的技术栈和能力 主要的能力 技术深度 技术广度 动手能力: 比如说造轮子的能力, UI(高级自定义UI, 通用UI组件库), LibrarySDK(通用基础库, 项目框架/架构) 经验丰富 辅助的能力 领导力 沟通能力 洞察与前瞻 赋能业务 技术栈 T字形技术栈语言语言高…

TPS79650DCQR低压差线性稳压器、TPS54040ADGQR一款42V,0.5A降压稳压器数据手册资料

TPS79650DCQR低压差&#xff08;LDO&#xff09;低功耗线性稳压器具有高电源抑制比&#xff08;PSRR&#xff09;、超低噪声、快速启动&#xff0c;以及出色的线路和负载瞬态响应&#xff0c;采用小外形、33 VSON、SOT223-6和TO-263封装。该系列的每个器件在输出端都有一个小型…

14届蓝桥杯Python总结

在比赛的时候大家头脑注意力都高度集中&#xff0c;比较紧绷&#xff0c; 我是不喜欢太紧绷的神经的&#xff0c;这时候电脑就夸得一下关机重启了&#xff0c;我当时真的想说关的好&#xff0c;休息一会&#xff08;哈哈哈&#xff09; 重启后我就继续做题&#xff0c;虽然出了…

AcWing 第一讲 打卡例题习题题目

AcWing 第一讲 打卡&例题&习题题目 1. AcWing 1. A B #include<iostream>using namespace std;int main(){int a,b;cin >> a >> b;cout << ab << endl;return 0; }2. AcWing 608. 差 #include<iostream>using namespace std;int…

他98年的,我真的玩不过他...

现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…

ChatGPT做爬虫的第一步

做爬虫就是搞数据, 专业的人做专业的事, ChatGPT阅虫无数, 搞个小爬虫, So Easy! 我知道可以百度到下载图片的代码, 但是我不想百度了, 一切交给ChatGPT 你只需要问他: 怎么用Nodejs下载图片? 其中&#xff0c;url是图片的地址&#xff0c;filePath是保存图片的本地路径。使…

安装stable-diffusion时遇到卡的情况

安装过程中&#xff0c;假如出现Installing gfpgan并且卡了很久不动&#xff0c;见下图&#xff1a; 遇到这个情况&#xff0c;怎么解决呢&#xff1f; 去TencentARC/GFPGAN官网&#xff0c;点击绿色的“Code”按钮&#xff0c;然后点击“Download ZIP”按钮&#xff1a; 将下…

MySQL--数据类型--0409

目录 1.数值类型 1.2 tinyint类型 2.bit类型 3.小数类型 3.1 float 3.2 decimal 4.字符类型 4.1 char 4.2 varchar 4.3 char 和 varchar 比较 5. 日期类型 6. enum 和 set 6.2 set和enum的查找 6.2.1 enum的查找 6.2.2 set的查找 1.数值类型 1.2 tinyint类型 只…

IDE装上ChatGPT,一天开发一个系统

昨天白天在写代码&#xff0c;晚上看了一场直播&#xff0c;是两个技术的直播&#xff1a; 一个是技术总监&#xff0c;一个是号称Java之父的余**。 结果Java之父被技术总监吊打。然后匆匆下播。 技术这玩意&#xff0c;真的就是真的&#xff01; 白天我开发了一个系统&…

二叉搜索树的oj

目录 一、根据二叉树创建字符串 二、二叉树的层序遍历 三、二叉树的层序遍历Ⅱ 四、二叉树的最近公共祖先 ①递归求解 ②回溯求解 五、二叉搜索树和双向链表 六、根据一棵树的前序遍历与中序遍历构造二叉树 七、从中序与后序遍历序列构造二叉树 八、二叉树的任一遍历…