GitOps介绍

ops/2024/9/25 2:21:13/

基础设施即代码 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.ppmy.cn/ops/38372.html

相关文章

Git的下载与安装

一、下载、安装Git 官网下载地址: 选择版本时需要先确认电脑是多少位操作系统。桌面右键点击“此电脑”,点击“属性”。 可以看到当前电脑是windows10 64系统系统,所以我需要下载Git 64bit版本(如果是32位系统要下载32bit版本)。 安装 点击…

java识别word段落和Java识别pdf端口整理

首先理解word与xml的关系 word文档与xml关系_docx xml-CSDN博客 Word和XML之间有密切的关系,因为Word文档实际上是XML文件的一种。从Word 2003开始,Microsoft Word文档的默认格式是XML,即.docx。XML是一种可扩展的标记语言,它允…

Avi Wigderson获得2023年图灵奖(Turing Award)

2024年4月10日,美国计算机协会(ACM)宣布将2023年图灵奖(ACM A.M. Turing Award)授予普林斯顿高等研究院教授Avi Wigderson,以表彰他对计算理论的基础性贡献,包括重塑人类对计算中随机性作用的理…

大模型微调实战之强化学习 贝尔曼方程及价值函数(一)

大模型微调实战之强化学习 贝尔曼方程及价值函数 强化学习(RL)是机器学习中一个话题,不仅在人工智能方面。它解决问题的方式与人类类似,我们每天都在学习并在生活中变得更好。 作为一名大模型学习者,当开始深入研究强…

C语言 | Leetcode C语言题解之第69题x的平方根

题目&#xff1a; 题解&#xff1a; int mySqrt(int x) {long int i 0;for(i0;;i){long int a i*i;long int b (i1)*(i1);if(a < x&&b > x){break;}}return i; }

FTTR(光猫)ITMS注册NCE纳管

ITMS注册 TR069交互过程&#xff1a; 1.1. TR069交互—主动连接机制 主动连接机制是指CPE主动发出请求连接事件(事件可以为&#xff1a; 0 BOOTSTRAP&#xff1b; 1 BOOT; PERIODIC等等)给ACS。在连接建立之后才能进行业务处理(通过调用RPC方法实现)。 备注&#xff1a;政企…

【iOS】事件传递与响应机制

文章目录 前言事件UIEvent一、事件传递遍历顺序 二、手势识别三、响应机制UIResponder&#xff08;响应者&#xff09;响应者链 四、相关应用扩大button点击范围穿透事件 总结 前言 提到响应者链与事件传递&#xff0c;如果看过其他人的博客&#xff0c;经常能看到这经典的三张…

Linux——基础IO2

引入 之前在Linux——基础IO(1)中我们讲的都是(进程打开的文件)被打开的文件 那些未被打开的文件呢&#xff1f; 大部分的文件都是没有被打开的文件&#xff0c;这些文件在哪保存&#xff1f;磁盘(SSD) OS要不要管理磁盘上的文件&#xff1f;(如何让OS快速定位一个文件) 要…