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 作为事实的来源和链接的桥梁,旨在简化云原生时代基础设施和应用程序的部署与管理方式,实现产品更快、更频繁、更稳定的交付。
原文链接
本文为云栖社区原创内容,未经允许不得转载。