• 从手动救火到自动化协同:我们的GitOps迁移全复盘
  • 发布于 9小时前
  • 6 热度
    0 评论

堆代码讯 对于绝大多数依赖传统 CI/CD 流水线的工程团队而言,成长到一定阶段总会撞上那道无形的瓶颈:流水线运转顺畅时一切安好,可一旦部署出了问题,整个修复过程就变成了无章可循的手动操作 —— 不同工程师有不同的临时修复手法,所有操作既没有统一标准,也没有清晰的追踪记录,整个团队仿佛在靠经验 “救火”。我们团队,也没能逃过这个行业共性的困境。


三次部署事故,把我们推到了变革的临界点

这个临界点的到来,比我们预想的要更早。短短两个月内,我们连续遭遇了三次部署事故,而所有事故的根源,都指向了同一个问题:不同环境之间的配置漂移。我们的 CI/CD 流水线是多年来 “自然生长” 起来的,久而久之,团队里养成了一个默认的习惯:只要部署失败,就手动登录环境修复问题。可我们当时没意识到,这种看似高效的临时补救,反而在不断加深预发环境与生产环境之间的不一致性。每次出问题回滚,大家都得绞尽脑汁回忆:要运行哪些脚本?顺序是什么?有没有漏掉什么特殊的配置?


直到一次合规性审计点出了我们的核心问题:整个部署流程完全缺乏变更的可追溯性。这根 “最后一根稻草”,终于让我们下定决心,彻底告别这种 “手动救火” 的模式,开始评估新的部署方案 ——GitOps 进入了我们的视野。


从 “要不要用” 到 “怎么迁”,GitOps 的行业转向
GitOps 的核心逻辑其实很清晰:它将 Git 定位为系统配置的唯一真实来源,再通过自动化代理,持续将实际运行的环境,和 Git 中声明的目标状态做同步,从根源上解决配置漂移和变更不可追溯的问题。而我们的选择,其实也踩中了整个行业的节奏。GitOps 的 adoption 速度正在飞速提升:有数据显示,91% 的受访者已经在使用 GitOps,另有 67% 的团队计划在一年内完成落地。对于我们这种大规模组织而言,问题早就已经从 “要不要采用 GitOps”,变成了 “怎么在不打断现有活跃开发节奏的前提下,完成平稳迁移”。
工具选型:不追求大而全,只选适配我们的
为了找到最适合我们团队的方案,我们针对自身的环境,评估了四款主流的工具:
- Jenkins:用来兼容我们已有的遗留流水线;
- GitHub Actions:适配仓库原生的自动化需求;
- Harness:面向企业级的部署编排能力;

- ArgoCD:Kubernetes 原生的持续交付工具。


最终,ArgoCD 成为了我们的首选方案。原因很明确:它的基于拉取的同步模型,刚好能解决我们最头疼的配置漂移问题;内置的漂移检测功能,能自动发现环境的不一致;同时它还能清晰展示跨集群的应用状态,解决了我们之前多集群管理的可视性问题。当然,我们并没有把旧工具全部抛弃:Jenkins 和 GitHub Actions 被保留了下来,继续负责它们已经运转得非常成熟的构建和测试阶段;Harness 则作为备选,留给那些需要更复杂的审批工作流、更强的治理控制的团队。而纯脚本化的推送部署方式,我们直接排除了 —— 毕竟它们的漂移控制能力太差,扩展性也满足不了我们的规模需求。


落地之后,我们收获了远超预期的安全与效率

工具落地之后,最先显现的是实实在在的安全收益。声明式的基础设施,意味着所有的配置变更都必须通过拉取请求(PR)完成,每一次变更都附带了完整的审计轨迹,再也不会出现 “谁改了什么不知道” 的情况。策略即代码的落地,让我们可以把安全要求写成规则,自动应用到所有部署流程中;而基于 Git 权限实现的角色访问控制,直接淘汰了我们之前那套复杂的单独凭证管理系统。我们还把 SAST 静态扫描直接集成到了 GitOps 的工作流里,所有的安全问题,在到达生产集群之前就会被提前拦截。


而用业界通用的 DORA 基准来跟踪的性能指标,更是清晰地展现了这次迁移的价值:
- 部署频率,从原来的每周一次,提升到了每天多次 —— 代码合并到主分支后,会自动触发集群的状态同步,再也不用人工触发部署;
- 变更前置时间,从原来的几天,直接缩短到了几小时;

- 变更失败率和平均恢复时间(MTTR)也都得到了显著改善:回滚不再需要手动记脚本、调配置,只需要做一次 Git 还原,系统就会自动完成状态同步,整个过程稳定又可靠。


最难的从来不是技术,是组织的变革
不过,整个迁移过程中,我们发现,技术层面的工作其实是最简单的,真正难啃的骨头,是组织层面的阻力。一开始,很多团队都在担心,新的 GitOps 流程会不会增加一堆官僚化的审批,拖慢开发节奏;那些早就习惯了用kubectl快速手动修复问题的工程师,更是担心新的流程会让他们失去原有的敏捷性。
为了打消这些顾虑,我们做了很多工作:我们组织了多场实践研讨会,现场给大家演示,GitOps 其实反而能带来更快的部署、更简单的回滚,还有前所未有的可视性 —— 所有应用的运行状态一目了然,再也不用到处查配置。我们还提前为常见的部署模式做了 “黄金模板”,团队不用再从零开始搭建流程,直接用模板就能快速上手。

早期试点团队的成功案例,成了最好的说服工具,很多原本持怀疑态度的团队,看到了同行的成果之后,态度慢慢发生了转变;而合规与安全团队的公开支持,也给这次变革赋予了组织层面的公信力,打消了大家的顾虑。


循序渐进的推广:不搞一刀切,平稳落地

整个推广的过程,我们没有搞 “一刀切” 的全量切换,而是做了非常细致的顺序安排:我们先从试点团队开始,根据试点的经验,先把仓库的布局、通用的模板标准化,再逐步加上安全门控;最先迁移的,是那些低风险的无状态服务,等整个团队都建立起信心之后,我们才开始迁移那些关键性更高的应用。当然,也有一部分遗留服务暂时没法完成迁移:它们依赖命令式的配置,没有足够的健康检查,或者模块之间耦合太紧密,GitOps 的声明式模型没法很好地适配。这些服务,我们把它们放到了后续的重构路线图上,慢慢改造。


那些意想不到的额外收益

全面落地 GitOps 之后,我们还收获了很多一开始没预料到的好处:新员工的入职培训变得简单了太多 —— 之前部署的知识,都存在资深工程师的脑子里,新人要花很久才能摸清楚;现在,所有的部署知识都存在 Git 的历史和清单文件里,新人看代码就能搞明白整个流程。事件响应的速度也快了很多,完整的可追溯性,让我们能瞬间定位:什么时间、谁做了什么变更,回滚也变成了一个完全一致、绝对可靠的操作,再也不会出现回滚失败的情况。


而从基于推送的模式,转变成基于拉取的模式,还意外地提升了我们的安全态势 —— 我们限制了直接访问集群的权限,只有自动化代理能同步状态,人为的误操作风险被降到了最低。


复盘:如果重来一次,我们会更早做好这三件事
回头看整个迁移过程,我们也总结了不少经验:如果能重来一次,我们一定会更早投入三个领域的准备:
第一是培训,让团队在工具落地之前,就先理解 GitOps 的思维转变,而不是等工具上线了,才慢慢去适应;
第二是通用模板,提前把标准化的模板做好,能大大降低团队落地的摩擦成本;

第三是机密信息和环境策略,我们之前把这部分留到了后期补充,结果反而带来了比预期多得多的复杂性。


GitOps 确实兑现了它的承诺:它给我们带来了可观测、可审计、可复现的基础设施,彻底告别了之前手动救火的混乱。但我们也清楚,要实现这一切,光靠技术是不够的,它需要耐心、有序的推进,更重要的,是始终关注变革中 “人” 的那一面。
用户评论