更新时间:2022-05-06 19:17:33
GitOps 的概念最初来源于 Weaveworks 的联合创始人 Alexis 在 2017 年 8 月发表的一篇博客 GitOps - Operations by Pull Request。文章介绍了 Weaveworks 的工程师如何以 Git 作为事实的唯一真实来源,部署、管理和监控基于 Kubernetes 的 SaaS 应用。
随后,Weaveworks 在其网站上发表了一系列介绍 GitOps 应用案例和***实践的文章,对 GitOps 进行推广。同时,市场上也出现了一批拥抱 GitOps 模式的工具和产品,如 Jenkins X、Argo CD、Weave Flux 等。而 KubeCon EU 2019 中关于 GitOps 的讨论 GitOps and Best Practices for Cloud Native CICD,则让 GitOps 进入到了更多人的视野当中。
本文将以上述资料为基础,重点介绍如下内容:
GitOps 是一种快速、安全的方法,可供开发或运维人员维护和更新运行在 Kubernetes 或其他声明式编排框架中的复杂应用。
借助 Kubernetes、Terraform 等工具,我们只需要声明系统想要达到的目标状态,工具会驱动系统向目标状态逼近。声明意味着系统状态由一组事实而不是一组指令保证,方便进行维护。当我们将声明信息存储在 Git 中后,系统状态便具备了唯一的事实来源。这样,我们可以轻松地部署和回滚应用。更重要的是,当灾难发生时,群集的基础架构也能够可靠且快速地再现。
通过将系统的目标状态存储在具有版本控制功能的系统中,并作为唯一的事实来源,我们能够从中派生和驱动一切。
git revert
命令把目标状态恢复到前一个状态。一旦将声明的状态保存在 Git 中,下一步就是允许对该状态的任何变更都能自动地应用于系统,这样可以极大地提升产品交付速度。更重要的是,GitOps 采用拉模式更新系统状态,将做什么和怎么做分开,这样能够更加有效地划分出系统的安全边界。
GitOps 中包含一个操作的反馈和控制循环。它将持续地比较系统的实际状态和 Git 中的目标状态,如果在预期时间内状态仍未收敛,便会触发告警并上报差异。同时,该循环让系统具备了自愈能力。自愈不仅仅意味着节点或 pod 失败, 这些由 Kubernetes 处理,在更广泛的角度,它能修正一些非预期的操作造成的系统状态偏离。下图展示了 GitOps 按控制论思想构建的闭环控制系统。
进一步,可以将 GitOps 总结成以下两点:
- An operating model for Kubernetes and other cloud native technologies, providing a set of best practices that unify deployment, management and monitoring for containerized clusters and applications.
- A path towards a developer experience for managing applications; where end-to-end CICD pipelines and git workflows are applied to both operations, and development.
本章将介绍交付流水线中的推模式和拉模式,并解释为何 GitOps 选用拉模式来构建流水线。
目前大多数 CI/CD 工具都基于推模式建交付流水线。代码被合并到主分支后会触发 CI 系统进行构建和一系列的测试,并将新生成的镜像推送至镜像仓库,最后再通过kubectl set image
、helm upgrade
、ksonnet apply
等方式将新版本直接应用到系统,整个流程如下图所示。
虽然这样的方式自动化程度很高,但对它进行审视后会发现如下问题:
GitOps 基于拉模式构建交付流水线。此时,开发人员发布一个新功能的流程如下:
通过为不同的集群创建各自的子目录或分支,可以轻松地将该模式拓展到多集群环境。
接下来让我们看看 GitOps 流水线如何解决推式流水线中存在的那些问题。
经过上面两章的介绍,可以将 GitOps 的优势总结如下:
GitOps 的概念来源于 Weaveworks,但它并没有和特定的公司或工具绑定。下面列出了一些实现 GitOps 模式可选用的工具。
Infrastructure as Code & Configuration as Code
版本控制工具
敏感信息管理
状态比较工具
交付流水线
Flickr 的工程师 John Allspaw 和 Paul Hammond 在 Velocity Conf 2009 上发表的演讲 10+ Deploys Per Day: Dev and Ops Cooperation at Flickr 开启了 DevOps 时代的序幕。它是人们追求以更高的频率发布高质量的软件的必然产物。
进入云原生时代后,产品的基础设施、系统架构和运维方式都发生了很大变化。为此,GitOps 对 DevOps 理念进行了扩展,它吸收了 DevOps 文化中协作、试验、快速反馈、持续改进等思想,并以 Git 作为事实的来源和链接的桥梁,旨在简化云原生时代基础设施和应用程序的部署与管理方式,实现产品更快、更频繁、更稳定的交付。