GitOps 是 DevOps 文化的一种工程实践,它重新定义了云原生场景下的持续交付模型。GitOps 下的整个运维体系使用声明式描述,并使用 Git 类似的版本控制系统对基础设施、应用配置等进行跟踪管理,系统任何变更在 Git 版本的控制下更加便捷地进行跟踪。

GitOps 以目标为导向,使用 Git 来维护系统的期望状态,结合 CI/CD 流程中的工具,如 Helm、ArgoCD 等,提高了生产力、安全性和合规性,以及升应用交付的效率和质量保证。

什么是 GitOps

GitOps = IaC + Git+ CI/CD,即基于 IaC 版本化 CI/CD,它的核心是使用 Git 仓库来管理基础设施和应用的配置,并且以 Git 仓库作为基础设置和应用的单一事实来源。GitoOps 重新定义了云原生场景下的 CI/CD 流程。 开发、运维团队以 Git 版本控制,作为中心不可变状态声明,结合 CI/CD 流程中代码审查、自动测试和交付部署,从而实现云原生场景下运维体系的最佳实践。

GitOps 的设计理念

GitOps 本质上 DevOps 文化中的工程实践,而非某项具体的技术或项目,结合当今流行的使用形式,可将 GitOps 系统简单地理解为以下几大特点:

  1. 代码化描述基础设施和应用的部署状态

对于应用的基础设置资源、应用配置和状态的维护,原则都是应是使用代码化的方式进行声明式描述。只有将各类手动配置的工作代码化,我们才能使用 Git 仓库的形式来管理基础设施和应用的部署。

对大规模应用管理的运维效率和可维护性的关键基础是 IaC (Infrastructure as Code),基础设置无法进行 IaC,GitOps 也就无从谈起。

  1. 使用 Git 的语义来管理代码化后的配置代码

基础设施代码化后面临着管理问题,而 GitOps 顾名思义,采用 Git 语义来管理这部分代码,主要有:

  • IaC 代码存储于 Git 仓库中
  • 基于分支模式来管理代码版本
  • 开发人员使用 Pull Request 来提交 IaC 变更

更高级的管理人员,对这部分变更进行 Code Review,合规之后进行 Merge 到主版本,进而应用到线上环境, 而当线上环境出现问题时,再基于 Git 历史进行回退。

  1. 具备将配置代码进行自动化部署的能力

我们还必须要有相应的能力将 IaC 代码自动化部署于各种真实的线上环境,当 Git 仓库中声明的期望状态发生变更时,可以立刻自动化应用到系统中,使其当前环境与 Git 仓库中 Iac 所描述的状态一致。

  1. 应用状态偏离修正

应用状态一旦与 Git 仓库中期望状态不一致,应该立刻进行自动修复,即使手动修改了集群的编排策略,集群也会被自动恢复到 Git 仓库中清单所描述的状态。以 Git 仓库作为基础设置和应用的单一事实来源,从而杜绝各类权限分散、手动操作的弊端。

分支管理模型 Aone Flow

为满足各类场景开发需求,我们可以在 Git 中定义不同用途的分支以及分支的合并策略,这就是分支模型。

常用的 Git 分支模型有 Gitflow、主干开发模型、Aone Flow 等分支管理方法。

Gitflow 主干开发 Aone Flow
代表公司 Git Prime Google 阿里
使用场景 瀑布式 持续交付 持续交付
操作复杂度 中等 简单 复杂(需要系统自动化)
并行开发 支持 支持 支持
下线特性分支 手动 手动 可自动化
随时发布 不支持 支持(开关隔离) 支持

Aone Flow 定义了三种分支类型 - 特性分支(feature)、发布分支(release)与主干分支(Master)。

开发人员在收到开发任务后,会从 Master 分支拉取专用的 feature 分支。在 feature 分支完成开发工作后,将 feature 并入 release 分支进行集成测试。 测试人员发布分支并完成测试工作后,由开发或运维人员将 release 分支部署到正式环境,然后再将 release 分支合并进入 Master 分支。

以图为例,开发人员 A 与 开发人员 B 收到两个开发任务后,分别创建特性分支 feature/001,feature/002,并进入开发工作。开发工作完成后,他们需要将 feature/001 feature/002 发布到日常环境进行集成测试。于是创建一个发布分支 release/daily,并将 feature/001 feature/002 合并到该分支中。

feature/001 通过了测试,但 feature/002 还存在较多 bug,此时 feature/001 可以独立发布到正式环境。为了避免 feature/002 对测试造成干扰,我们需要将 feature/002 解除合并,单独对 feature/001 进行回归验证。

由于 Git 中去除一个已经合并分支所有的提交较为繁琐,我们可以重新创建一个日常环境的 release 分支,仅合并待测试的 feature/001 分支,为了避免与旧 release 分支名字冲突,我们可以采用 release/20220304 此类的日期分类方式。


  • 无标签

0 评论

你还没有登录。你所做的任何更改会将作者标记为匿名用户。 如果你已经拥有帐户,请登录