GitOps 初探

前言

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 进入到了更多人的视野当中。

本文将以上述资料为基础,重点介绍如下内容:

  1. 什么是 GitOps?
  2. 推模式和拉模式
  3. GitOps 的主要优势
  4. GitOps 关键工具

什么是 GitOps?

GitOps 是一种快速、安全的方法,可供开发或运维人员维护和更新运行在 Kubernetes 或其他声明式编排框架中的复杂应用。

GitOps 四项原则

以声明的方式描述整个系统

借助 Kubernetes、Terraform 等工具,我们只需要声明系统想要达到的目标状态,工具会驱动系统向目标状态逼近。声明意味着系统状态由一组事实而不是一组指令保证,方便进行维护。当我们将声明信息存储在 Git 中后,系统状态便具备了唯一的事实来源。这样,我们可以轻松地部署和回滚应用。更重要的是,当灾难发生时,群集的基础架构也能够可靠且快速地再现。

系统的目标状态通过 Git 进行版本控制

通过将系统的目标状态存储在具有版本控制功能的系统中,并作为唯一的事实来源,我们能够从中派生和驱动一切。

  1. 通过 pull request 发起对目标状态的变更申请,状态变化清晰呈现,变更 review 简单明了。
  2. 系统的每一次变更都对应着一条 git commit,变更行为可审计。
  3. 回滚操作只需要使用git revert命令把目标状态恢复到前一个状态。

对目标状态的变更批准后将自动应用到系统

一旦将声明的状态保存在 Git 中,下一步就是允许对该状态的任何变更都能自动地应用于系统,这样可以极大地提升产品交付速度。更重要的是,GitOps 采用拉模式更新系统状态,将做什么和怎么做分开,这样能够更加有效地划分出系统的安全边界。

驱动收敛 & 上报偏离

GitOps 中包含一个操作的反馈和控制循环。它将持续地比较系统的实际状态和 Git 中的目标状态,如果在预期时间内状态仍未收敛,便会触发告警并上报差异。同时,该循环让系统具备了自愈能力。自愈不仅仅意味着节点或 pod 失败, 这些由 Kubernetes 处理,在更广泛的角度,它能修正一些非预期的操作造成的系统状态偏离。下图展示了 GitOps 按控制论思想构建的闭环控制系统。

GitOps 的简洁定义

进一步,可以将 GitOps 总结成以下两点:

  1. 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.
  2. 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/CD 工具都基于推模式建交付流水线。代码被合并到主分支后会触发 CI 系统进行构建和一系列的测试,并将新生成的镜像推送至镜像仓库,最后再通过kubectl set imagehelm upgradeksonnet apply等方式将新版本直接应用到系统,整个流程如下图所示。

虽然这样的方式自动化程度很高,但对它进行审视后会发现如下问题:

  1. 跨越安全边界共享秘钥 - 在推模式下,为了让 CI 系统能够自动地部署应用,需要将集群的访问秘钥共享给它。虽然可以通过一些措施进行防护,但毕竟还是将秘钥暴露在了可信度较低的安全上下文中。这种做法扩大了攻击面,会给系统带来潜在的安全风险。
  2. 回滚操作复杂 - 如果通过 CI 任务完成一次部署后,系统出现异常,你将如何知道应该回滚到哪一个版本?你可能需要仔细查看构建日志才能找到答案。
  3. 难以快速重建集群 - 在集群完全崩溃的情况下进行重建,如何确定需要部署的每个应用的版本?你可能需要重新跑一遍 CI 任务。

GitOps 流水线

GitOps 基于拉模式构建交付流水线。此时,开发人员发布一个新功能的流程如下:

  1. 通过 pull request 向主分支提交包含新功能的代码。
  2. 代码审核通过后将被合并至主分支。
  3. 合并行为将触发 CI 系统进行构建和一系列的测试,并将新生成的镜像推送至镜像仓库。
  4. GitOps 检测到有新的镜像,会提取最新的镜像标记,然后同步到 Git 配置仓库的清单中。
  5. GitOps 检测到集群状态过期,会从配置仓库中拉取更新后的清单,并将包含新功能的镜像部署到集群里。

通过为不同的集群创建各自的子目录或分支,可以轻松地将该模式拓展到多集群环境。

接下来让我们看看 GitOps 流水线如何解决推式流水线中存在的那些问题。

  1. 部署在集群内部的 GitOps 模块负责更新集群,这样就避免了集群 API 和秘钥的跨边界暴露。更重要的是,流水线中每个逻辑单元的写操作都被限定在了安全边界以内,职责划分清晰。
  2. 由于每一次变更都对应着一条 git commit,回滚操作只需要简单的把目标状态恢复到前一个状态。
  3. 由于在 Git 的配置仓库中保留了集群的目标状态,如果集群完全崩溃,可以基于仓库中的清单快速重建集群。

GitOps 的主要优势

经过上面两章的介绍,可以将 GitOps 的优势总结如下:

  1. 提高生产力 - 采用集成了反馈控制循环的持续部署流水线可以大大提升新功能的发布速度。
  2. 提升开发者体验 - 开发者可以使用熟悉的工具 Git 去发布新功能,而无需了解复杂的部署交付流程。新入职的员工可以在几天内快速上手,从而提高工作效率。
  3. 行为可审计 - 使用 Git 工作流管理集群,天然能够获得所有变更的审计日志,满足合规性需求,提升系统的安全与稳定性。
  4. 更高的可靠性 - 借助 Git 的还原(revert)、分叉(fork)功能,可以实现稳定且可重现的回滚。由于整个系统的描述都存放在 Git 中,我们有了唯一的真实来源,这能大大缩短集群完全崩溃后的恢复时间。
  5. 一致性和标准化 - 由于 GitOps 为基础设置、应用程序、Kubernetes 插件的部署变更提供了统一的模型,因此我们可以在整个组织中实现一致的端到端工作流。不仅仅是 CI/CD 流水线由 pull request 驱动,运维任务也可以通过 Git 完全重现。
  6. 更强的安全保证 - 得益于 Git 内置的安全特性,保障了存放在 Git 中的集群目标状态声明的安全性。

GitOps 关键工具

GitOps 的概念来源于 Weaveworks,但它并没有和特定的公司或工具绑定。下面列出了一些实现 GitOps 模式可选用的工具。

  • Infrastructure as Code & Configuration as Code

    • Terraform
    • CloudFormation
    • ROS
    • Kubernetes
    • Chef
    • Ansible
  • 版本控制工具

    • GitLab
    • Bitbucket
  • 状态比较工具

    • Kubediff
  • 交付流水线

    • Jenkins X
    • Argo CD
    • Weave Flux
    • Spinnaker

总结

Flickr 的工程师 John Allspaw 和 Paul Hammond 在 Velocity Conf 2009 上发表的演讲 10+ Deploys Per Day: Dev and Ops Cooperation at Flickr 开启了 DevOps 时代的序幕。它是人们追求以更高的频率发布高质量的软件的必然产物。

进入云原生时代后,产品的基础设施、系统架构和运维方式都发生了很大变化。为此,GitOps 对 DevOps 理念进行了扩展,它吸收了 DevOps 文化中协作、试验、快速反馈、持续改进等思想,并以 Git 作为事实的来源和链接的桥梁,旨在简化云原生时代基础设施和应用程序的部署与管理方式,实现产品更快、更频繁、更稳定的交付。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老码农吐血建议:2020年,低于1w的程序员要注意了...

最近在知乎上,关于AI的这个话题又被顶起来,其中,这条回答让人印象深刻:在这短短的一条信息里,无疑显示出:AI行业缺人,高端岗位80万年薪恐怕也招不来!小编上周在一个AI群里&#xff0…

重磅!容器集群监控利器 阿里云Prometheus 正式免费公测

Prometheus 作为容器生态下集群监控的首选方案,是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于…

Archsummit 2019重磅分享|闲鱼Flutter&FaaS云端一体化架构

作者:闲鱼技术-国有   讲师介绍 国有,闲鱼架构团队负责人。在7月13号落幕的2019年Archsummit峰会上就近一年来闲鱼在Flutter&FaaS一体化项目上的探索和实践进行了分享。 传统NativeWeb服务端混合开发的挑战 随着无线,Io…

Spring Cloud 云架构下的微服务架构:部门微服务(Dept)

作者 | springML来源 | CSDN 博客 责编 | Carol出品 | CSDN云计算(ID:CSDNcloud)封图| CSDN下载于视觉中国 对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,…

并发模式与 RPS 模式之争,性能压测领域的星球大战

本文是《如何做好性能压测》系列专题分享的第四期,该专题将从性能压测的设计、实现、执行、监控、问题定位和分析、应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论体系,并提供有例可依的实战。 该系列专…

Akka in Schedulerx2.0

1. 前言 Schedulerx2.0是阿里中间件自研的基于akka架构的新一代分布式任务调度平台,提供定时、任务编排、分布式跑批等功能,具有高可靠、海量任务、秒级调度等能力。 本篇文章以Schedulerx2.0为例子,介绍akka的应用场景,希望能给…

java.sql.SQLException: The server time zone value ‘???ú±ê×??±??‘ is unrecognized or represents more

【报错信息】 【百度翻译】 服务器时区值???????无法识别或表示多个时区。如果要利用时区支持,必须配置服务器或JDBC驱动程序(通过ServerTimeZone配置属性),以使用更具体的时区值 【解决方法】 数据库连接配置conf.xml(…

【从入门到放弃-Java】并发编程-锁-synchronized

简介 上篇【从入门到放弃-Java】并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全。 synchronized是java提供的一种内置的锁机制。通过synchronized关键字同步代码块。线程在进入同步代码块之前会自动获得锁…

Redis 学习之一招击穿自己的系统,附送 N 个击穿解决大礼包 | 原力计划

作者 | Mark_MMXI来源 | CSDN博客,责编 | 夕颜出品 | CSDN(ID:CSDNnews)缓存的存在是为了在高并发情形下,缓解DB压力,提高业务系统体验。业务系统访问数据,先去缓存中进行查询,假如缓存存在数据…

阿里巴巴王坚:用数据来改变世界

“传统信息化建设都是从无到有,加了杆子和机器,但是新一代数字建设就是从有到无,缴费的机器没有了,你回家缴,杆子没有了,你回家缴。” 7月21日,阿里巴巴技术委员会主席王坚在2019年中国电子政务…

Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要写一段 rest-api 的代码,并且还要能够区分不同的版本。下面…

在生产环境中使用 Sentinel

文章目录一、安装zookeeper1. linux环境2. windows环境2. 安装并启动zkui二、编译打包2.1. 拉取项目2.2. 启动2.3. 登录 sentinel2.4. 登录zkui2.5. 重启Sentinel2.6. 删除Sentinel的流控规则三、将客户端和zk打通3.1. 引入依赖3.2. 配置3.3. 启动springboot3.4. sentinel控制台…

JavaScript-浏览器控制台使用

基本语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- JavaScript 严格区分大小写 --><script>// 1. 定义变量 变量类型 变量名 变量值var num 1;num …

看完就入门系列!吞吐量、消息持久化、负载均衡和持久化、伸缩性…… 你真的了解 Kafka 了吗?...

作者| liuhehe123来源| CSDN博客 责编| Carol出品| CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;封图| CSDN下载于视觉中国 无论是已经接触过 Kafka 还是刚入坑的小伙伴&#xff0c;都应该时不时回头了解一下 Kafka &#xff0c;有时候会有不少新收获。今天这份…

Alibaba Cloud Linux 2 开源后又有什么新动作?

阿里妹导读&#xff1a;2019 年 4 月&#xff0c;Alibaba Cloud Linux 2 (Aliyun Linux 2) 正式开源。时至今日&#xff0c;已经走过三个月的里程。在这段时间内&#xff0c;这个刚诞生不久的为阿里云 ECS 环境定制优化的 Linux 操作系统发行版的装机量稳步上升。本文将重点介绍…

一站式数据采集存储的利器:阿里云InfluxDB®️数据采集服务

背景 随着时序数据的飞速增长&#xff0c;时序数据库不仅需要解决系统的稳定性和性能问题&#xff0c;还需实现数据从采集到分析的链路打通&#xff0c;才能让时序数据真正产生价值。在时序数据采集领域&#xff0c;一直缺少自动化的采集工具。虽然用户可以使用一些开源的采集…

Serverless 风起云涌,为什么阿里、微软、AWS 纷纷拥抱开源 OAM?

作者 | 张磊&#xff0c;阿里云原生应用平台高级技术专家邓洪超&#xff0c;阿里云技术专家责编 | 唐小引头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Serverless 这个词第一次被是 2012 年一篇名为《Why The Future of Software and …

K8S从懵圈到熟练 - 我们为什么会删除不了集群的命名空间?

阿里云售后技术团队的同学&#xff0c;每天都在处理各式各样千奇百怪的线上问题。常见的有&#xff0c;网络连接失败&#xff0c;服务器宕机&#xff0c;性能不达标&#xff0c;请求响应慢等。但如果要评选&#xff0c;什么问题看起来微不足道事实上却足以让人绞尽脑汁&#xf…

为什么技术人一定要懂点“可信计算”?

阿里妹导读&#xff1a;可信计算&#xff08;TrustedComputing&#xff0c;简称TC&#xff09;是一项由TCG(可信计算组)推动和开发的技术。可信的核心目标之一是保证系统和应用的完整性&#xff0c;从而确定系统或软件运行在设计目标期望的可信状态。可信和安全是相辅相成的&am…

很用心的为你写了 9 道 MySQL 面试题,建议收藏!

来源 | Java 建设者责编| Carol封图| CSDN下载于视觉中国 MySQL 也是作者本人正在学习的部分&#xff0c;后面会多输出 MySQL 的文章贡献给大家&#xff0c;毕竟 MySQL 涉及到数据存储、锁、磁盘寻道、分页等操作系统概念&#xff0c;而且互联网对 MySQL 的注重程度是不言而喻的…