GitOps介绍

基础设施即代码 IaC

在理解 GitOps 之前,需要先理解什么是基础设施即代码。

基础设施即代码(Infrastructure as Code,简称IaC)是一种软件工程实践,它将基础设施的管理和配置过程像管理代码一样进行版本控制、自动化和可追溯。这意味着基础设施的创建、配置和管理不再依赖手动操作,而是通过编码的方式进行定义和管理,以实现更高效、可靠、可复用和可扩展的基础设施管理。

在传统的基础设施管理中,管理员通常需要手动完成服务器、网络、存储等基础设施的配置和管理工作。这样做可能会导致配置的不一致性、人为错误和时间消耗较多。

通过 IaC,管理员可以使用编程语言(如 Ansible)来定义基础设施的状态和配置,然后使用工具或平台将这些定义转换为实际的基础设施。这些定义文件可以保存在版本控制系统如 Git 中,确保配置的可追溯性和可重现性。当需要进行更新或扩展时,只需修改代码并重新执行即可,从而实现基础设施的快速部署和变更管理。

IaC 的优势包括:

  1. 可重复性和一致性:基础设施代码能够确保在不同环境中的一致性,消除了手动配置带来的不稳定和错误。
  2. 自动化:自动化配置和管理基础设施,减少了人工操作和减轻了管理员的负担。
  3. 版本控制:基础设施代码可以像软件代码一样进行版本管理,方便回滚、跟踪和团队协作。
  4. 快速部署和扩展:由于基础设施的定义已经以代码的形式存在,因此可以快速部署新的基础设施实例或扩展现有基础设施。
  5. 文档化:基础设施代码本身就是对基础设施架构和配置的文档化,降低了维护和管理的复杂性。

广义上的 IaC 不仅仅只关于基础设施,还包含了网络安全配置等等,所以广义上的 IaC 又叫 X as Code。比如你想在某公有云中创建一台服务器,配置网络,部署 Kubernetes 集群以及各种工作负载,你只需要定义好 Ansible 的声明式配置,以及 Kubernetes 的配置清单即可,免去繁杂的手动操作。

什么是 GitOps

GitOps = IaC + Git + CI/CD

翻译过来就是, Git 版本控制管理 IaC 的 CI/CD,核心是使用 Git 仓库来管理基础设施和应用的配置,以 Git 仓库作为基础设施和应用的单一事实来源,从其他地方修改配置(比如手动改线上配置)一概不予通过。

借助 IaC,目标环境当前所需基础设施的期望状态以声明式配置的方式作为代码保存在 Git 仓库中,借助于 GitOps,如果集群的实际状态与 Git 仓库中定义的期望状态不匹配,会根据期望状态来调整当前的状态,最终使实际状态符合期望状态。

GitOps vs DevOps

从广义上来看,GitOps 与 DevOps 并不冲突,GitOps 是一种技术手段,而 DevOps 是一种文化。GitOps 是一种实现持续交付(Continuous Delivery)、持续部署(Continuous Deployment)和基础设施即代码(IaC)的工具和框架,它是符合和满足 DevOps 文化的。

从狭义上来看,GitOps 与 DevOps 有以下几个区别:

  1. GitOps 是以目标为导向的。它使用 Git 来维护期望状态,并不断调整实际状态,最终与期望状态相匹配。而 DevOps 更多关注的是最佳实践,这些实践可以是利用其他任何工具实现。
  2. GitOps 采取声明式的操作方法,而 DevOps 同时接受声明式和命令式的方法,所以 DevOps 除了适用于容器环境之外,还适用于虚拟机和裸机环境。
  3. 针对 CD 流水线,GitOps 采用 Pull 模式,GitOps 系统的各个组件(如 Kuberntes 集群)从 Git 仓库拉取(拉取动作由代理 agent 完成)状态和配置信息,使集群状态调整为和 Git 中描述的一致。而传统 Devops 中使用 Push 模式,配置更改和代码部署是由开发团队主动推送到目标服务器或平台上的。

GitOps

DevOps

优点

  1. 声明式配置:基于声明的方式来定义基础设施和应用程序的配置,以代码的形式存储在Git仓库中。这样可以确保配置的版本控制、可追溯性和一致性。
  2. 自动化持续部署:强调使用自动化流程来同步状态,每当存储库中的配置发生更改时,系统会自动将更改部署到集群中,实现全自动的持续部署。
  3. 可观察性:通过Git存储库中的历史记录和变更日志,可以轻松追踪每个部署的更改,提高了系统的可观察性和故障排除能力。
  4. 一致性和可重复性:确保基础设施和应用程序状态与Git存储库中定义的期望状态保持一致,避免了手动配置可能引入的不稳定性和错误。
  1. 快速交付:强调自动化、持续集成和持续交付,可以实现更快速的软件交付和部署。
  2. 灵活性:可以根据团队的需求和偏好,选择合适的工具和流程,具有较大的灵活性。
  3. 协作:强调开发和运维团队之间的协作,促进了团队之间的合作和沟通。

缺点

  1. 学习曲线:采用GitOps需要对Git、版本控制和基础设施即代码等概念有一定的了解,可能对一些团队成员造成学习曲线。
  2. 依赖Git存储库:Git存储库成为了整个系统的“单一事实的来源”,如果Git存储库不可用或发生故障,可能会影响整个部署流程。
  1. 人为干预:DevOps中的部分过程可能需要人为干预和手动操作,可能增加了出错的风险。
  2. 配置漂移:由于手动操作的存在,可能导致配置的漂移,使得实际状态和预期状态不一致。

综合

综合来看,GitOps强调自动化和基础设施即代码,适用于需要高度可追溯性和自动化的场景,而DevOps更注重协作和快速交付,适用于需要灵活性和快速反馈的场景。在实际应用中,可以根据团队的需求和项目的特点选择合适的方法论或结合两者的优势来实现高效的软件开发和部署

Push vs Pull

在上面 GitOps 和 Devops 的对比中,简单提到了 GitOps 采用 Pull 模式,而传统 Devops 采用 push 模式,下面展开介绍一下这两种模式的区别。

Push 模式

目前大多数 CI/CD 工具都使用基于 Push 的部署模式,例如最常见的 Jenkins。这种模式一般都会在 CI 流水线运行完成后执行一个命令(比如 kubectl apply)将应用部署到目标环境中。因此这种 CD 模式的相比 pull 模式有如下缺点:

  • 需要安装配置额外工具(比如 kubectl);
  • 需要 Kubernetes 对其进行授权;
  • 无法自动感知部署状态,也就无法感知期望状态与实际状态的偏差,需要再通过查询集群信息的方式来感知。
Pull 模式

Pull 模式会在目标环境中安装一个 Agent,例如在 Kubernetes 集群中就靠自定义的 Operator 来充当这个 Agent。Operator 会周期性地监控目标环境的实际状态,并与 Git 仓库中的期望状态进行比较,如果实际状态不符合期望状态,Operator 就会更新基础设施的实际状态以匹配期望状态。

目前基于 Pull 模式的 CD 工具有 ​​Argo CD​​​, ​​Flux CD​​​ 以及 ​​ks-devops​​

GitOps 设计原则

声明式

必须通过声明式来描述系统的期望状态。例如 Kubernetes,众多现代云原生工具都是声明式的,Kubernetes 只是其中的一种。

版本控制/不可变

因为所有的状态声明都存储在 Git 仓库中,并且把 Git 仓库作为单一事实来源,那么所有的操作都是从 Git 仓库里驱动的,而且保留了完整的版本历史,方便回滚。有了 Git 优秀的安全保障,对代码的作者和出处实施强有力的安全保障。

自动应用变更

Git 仓库中声明的期望状态发生了任何变更,都可以立即应用到系统中,而且不需要安装配置额外工具(比如 kubectl),也不需要配置 Kubernetes 的认证授权。

持续的协调

协调 Reconciliation 其实最早是 Kubernetes 里的一个概念,表示的是确保系统的实际状态与期望状态一致的过程。具体的实现方式是在目标环境中安装一个 agent,一旦实际状态与期望状态不匹配,agent 就会进行自动修复。这里的修复比 Kubernetes 的故障自愈更高级,即使是手动修改了集群的编排清单,集群也会被恢复到 Git 仓库中的清单所描述的状态。

GitOps 的工作流

鉴于以上这些设计原则,GitOps 的工作流如下:

  1. 首先,团队中的任何一个成员都可以 clone 仓库对配置进行更改,然后提交 Pull Request。
  2. 接下来会运行 CI 流水线,一般会做这么几件事情:验证配置文件、执行自动化测试、检测代码的复杂性、构建镜像、将镜像推送到镜像仓库等等。
  3. CI 流水线运行完成后,团队中拥有合并代码权限的人将会将这个 Pull Request 合并到主分支中 。一般拥有这个权限的都是研发人员、安全专家或者高级运维工程师。
  4. 最后会运行 CD 流水线,将变更应用到目标系统中(比如自建 Kubernetes 集群或者其他云服务商) 。

GitOps 是对现有 DevOps 文化的补充,相比传统模式,GitOps 的整个过程自动化且透明,部署过程清晰可见,可以查看和跟踪对系统进行的任何变更,提高了生产力、安全性和合规性。而传统的模式只能由工程师在自己的电脑上手动操作这一切,其他人不知道发生了什么,也无法对其操作进行 Review。而且在 GitOps 中,整个系统都是通过声明式来描述的,天然适合云原生环境,因为 Kubernetes 也是这么设计的。

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

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

相关文章

电源小白入门学习7——USB充电、供电、电源路径管理

电源小白入门学习7——USB充电、供电、电源路径管理 USB充电系统需要考虑的因素开关充电和线性充电充电路径管理输入限流路径管理(动态功率管理)理想二极管帮助提高电池利用率输入过充抑制 上期我们介绍了锂离子电池的电池特性,及充电电路设计…

websevere服务器从零搭建到上线(二)|Linux上的五种IO模型

文章目录 阻塞 blocking非阻塞 non-blockingIO复用 IO multiplexing信号驱动 signal-driven异步 asynchronous拓展知识 看过上篇文章英国基本能理解本文五张图的内容websevere服务器从零搭建到上线(一)|阻塞、非阻塞、同步、异步 本文要能够在…

关于冯诺依曼体系结构 和 操作系统(Operator System)的概念讲解(冯诺依曼体系结构,操作系统的作用等)

目录 一、冯诺依曼体系结构 二、操作系统 1. 概念 2. 设计操作系统的目的 3.系统调用和库函数概念 4.总结 三、完结撒❀ 一、冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截…

工业光源环形系列一平面无影光源特点

产品特点 ◆LED灯珠均匀排布经过漫射板特殊角度反射达到漫射效果: ◆光源均匀性高,漫射效果好。

Navicat for MySQL Mac:数据库管理与开发的理想工具

Navicat for MySQL Mac是一款功能强大的数据库管理与开发工具,专为Mac用户设计,旨在提供高效、便捷的数据库操作体验。 它支持创建、管理和维护MySQL和MariaDB数据库,通过直观的图形界面,用户可以轻松进行数据库连接、查询、编辑和…

20240507最新 ubuntu20.04安装ros noetic

ubuntu20.04安装ros 主要参考博客 【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程_ubuntu20.04安装ros-CSDN博客 出现问题 1.ubuntu20.04 更换清华源报错 ubuntu20.04 更换清华源报错_gvfs metadata is not supported. fallback to teplme-CSDN博客 ?&#xff1f…

基于Java.Web框架React、Vue.js技术开发的一套(C#医院体检系统成品源码、支持二开)

医院体检系统是一种专为体检中心/医院体检科等体检机构开发的全流程管理系统。该系统通过软件实现检测仪器数据的自动提取,内置多级医生工作台,细化工作并将体检检查结果汇总,生成体检报告登记到计算机系统中。此外,该系统还能进行…

Spring与AI结合-spring boot3整合AI组件

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 目录 写在前面 spring ai简介 单独整合al接口 整合Spring AI组件 起步条件 ​编辑 进行必要配置 写在最后 写在前面 本文介绍了springboot开发后端服务中,AI组件(Spring A…

Project Virtual Painter

先上实验效果: 画笔实验结果 实现画笔操作,提取颜色目标,绘制轮廓,显示画笔三步骤。 1、提取颜色目标 要实现画笔操作,首先要提取颜色目标,也就是画笔,我们需要得到int hmin , smin, vmin&…

cmake进阶:变量的作用域说明三(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下: cmake进阶:变量的作用域说明一(从函数作用域方面)-CSDN博客cmake进阶:变量的作用域说明二(从函数作用域方面)-CSDN博客…

VTK —— 三、简单操作 - 示例3 - 将点投影到平面上(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功,若无VTK库则请先参考如下链接编译vtk源码: VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码) 教程描述 本…

leetcode-没有重复项的全排列-97

题目要求 思路 1.递归,如果num和n的元素个数一样就可以插入res中了,这个作为递归的结束条件 2.因为这个题是属于排列,并非组合,两者的区别是排列需要把之前插入的元素在回退会去,而组合不需要,因此会存在一…