GitOps 的概念最初来源于 Weaveworks 的联合创始人 Alexis 在 2017 年 8 月发表的一篇博客 GitOps - Operations by Pull Request。文章介绍了 Weaveworks 的工程师如何以 Git 做为事实的惟一真实来源,部署、管理和监控基于 Kubernetes 的 SaaS 应用。git
随后,Weaveworks 在其网站上发表了一系列介绍 GitOps 应用案例和最佳实践的文章,对 GitOps 进行推广。同时,市场上也出现了一批拥抱 GitOps 模式的工具和产品,如 Jenkins X、Argo CD、Weave Flux 等。而 KubeCon EU 2019 中关于 GitOps 的讨论 GitOps and Best Practices for Cloud Native CICD,则让 GitOps 进入到了更多人的视野当中。github
本文将以上述资料为基础,重点介绍以下内容:安全
GitOps 是一种快速、安全的方法,可供开发或运维人员维护和更新运行在 Kubernetes 或其余声明式编排框架中的复杂应用。架构
借助 Kubernetes、Terraform 等工具,咱们只须要声明系统想要达到的目标状态,工具会驱动系统向目标状态逼近。声明意味着系统状态由一组事实而不是一组指令保证,方便进行维护。当咱们将声明信息存储在 Git 中后,系统状态便具有了惟一的事实来源。这样,咱们能够轻松地部署和回滚应用。更重要的是,当灾难发生时,群集的基础架构也可以可靠且快速地再现。app
经过将系统的目标状态存储在具备版本控制功能的系统中,并做为惟一的事实来源,咱们可以从中派生和驱动一切。框架
git revert
命令把目标状态恢复到前一个状态。一旦将声明的状态保存在 Git 中,下一步就是容许对该状态的任何变动都能自动地应用于系统,这样能够极大地提高产品交付速度。更重要的是,GitOps 采用拉模式更新系统状态,将作什么和怎么作分开,这样可以更加有效地划分出系统的安全边界。运维
GitOps 中包含一个操做的反馈和控制循环。它将持续地比较系统的实际状态和 Git 中的目标状态,若是在预期时间内状态仍未收敛,便会触发告警并上报差别。同时,该循环让系统具有了自愈能力。自愈不只仅意味着节点或 pod 失败, 这些由 Kubernetes 处理,在更普遍的角度,它能修正一些非预期的操做形成的系统状态偏离。下图展现了 GitOps 按控制论思想构建的闭环控制系统。ide
进一步,能够将 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 选用拉模式来构建流水线。oop
目前大多数 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 做为事实的来源和连接的桥梁,旨在简化云原生时代基础设施和应用程序的部署与管理方式,实现产品更快、更频繁、更稳定的交付。
本文为云栖社区原创内容,未经容许不得转载。