GitOps介绍

news2024/11/24 20:05:30

基础设施即代码 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.coloradmin.cn/o/1646485.html

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

相关文章

RabbitMQ是怎么做消息分发的?——Java全栈知识(14)

RabbitMQ是怎么做消息分发的? RabbitMQ 的消息分发分为五种模式:分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式。 1、简单模式 publisher 直接发送消息到队列消费者监听并处理队列中的消息 简单模式是最基本的工作模式,…

C++:哈希表和unordered系列容器的封装

一、unordered系列关联式容器的介绍 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是&…

软件测试必问的33个面试题

1.你为什么选择软件测试行业 因为之前有了解软件测试这个行业,觉得他的发展前景很好。 2.根据你以前的工作经验描述一下软件开发、测试过程,由那些角色负责,你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所…

软件公司为什么很少接二开项目?

前言 很多企业由于原有项目还在继续运营,但原有技术公司不想再合作或者不想再维持整个技术团队等原因,就需要找一个新的软件公司继续维护原有软件系统。但是一接触往往发现很多软件公司拒绝接手第三方的软件项目,这究竟是什么原因呢&#xff…

控制台调试 hover 后才出现的元素

调试 hover后才出现的元素 打开开发者工具,鼠标放在hover时才出现的元素上,然后点击右键; 不要选中任何选项,将鼠标移动到开发者工具的调试面板中; 按下N键,此时悬浮的元素不会消失,定位成功。…

Vue-组件中的data

一个组件的data选项必须是一个函数。保证每个组件实例,维护独立的一份数据对象。如下图: 组件一旦封装好了,可以使用多次,比如数字框组件使用了三次: 每次创建新的组件实例,都会重新执行一次data函数&#…

OCC笔记:图形可视化的实现方式

注:文中参看的occ的源码版本为7.4.0 1、实现思路概览 整体架构 主要有3大块:AIS(Application Interactive Services ,直译为:应用程序交互服务)、Graphics(图形)、Geometry & T…

Java面试题:多线程3

CAS Compare and Swap(比较再交换) 体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性. 线程A和线程B对主内存中的变量c同时进行修改 在线程A中存在预期值a,修改后的更新值a1 在线程B中存在预期值b,修改后的更新值b1 当且仅当预期值和主内存中的变量值相等…

数据处理学习笔记9

一些其他的函数 “Resize”和“Reshape”的区别主要在于它们对数组元素数量和形状的处理方式不同,以下是详细介绍: “Resize”通常会改变数组的元素数量,在放大数组形状时会用0补全新增的元素,而在缩小数组形状时会丢弃多余的元素…

oracle 8i系统检查

oracle 8i系统检查 set echo on spool d:\bk\1.txt select sysdate from dual; --版本信息 select * from v$version; --安装的产品 col PARAMETER for a50; col value for a10; select * from v$option order by 2; --用户信息 set linesize 100 set pagesize 100 COL USE…

浅析扩散模型与图像生成【应用篇】(二十一)——DALLE·2

21. Hierarchical Text-Conditional Image Generation with CLIP Latents 该文提出一种基于层级式扩散模型的由文本生成图像的方法,也就是大名鼎鼎的DALLE2。在DALLE2之前呢,OpenAI团队已经推出了DALLE和GLIDE两个文生图模型了,其中DALLE是基…

KAN:Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接:https://arxiv.org/abs/2404.19756 代码链接:https://github.com/KindXiaoming/pykan 项目链接:https://kindxiaoming.github.io/pykan/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

03_Redis

文章目录 Redis介绍安装及使用redis的核心配置数据结构常用命令stringlistsethashzset(sortedset) 内存淘汰策略Redis的Java客户端JedisRedisson Redis 介绍 Redis是一个NoSQL数据库。 NoSQL: not only SQL。表示非关系型数据库(不支持SQL标准语法)。 …

大模型_DISC-MedLLM基于Baichuan-13B-Base医疗健康对话

文章目录 DISC-MedLLM介绍概述数据集部署推理流程 DISC-MedLLM 介绍 DISC-MedLLM 是一个专门针对医疗健康对话式场景而设计的医疗领域大模型,由复旦大学数据智能与社会计算实验室 (Fudan-DISC) 开发并开源。 该项目包含下列开源资源: DISC-Med-SFT 数据集 (不包…

视频降噪算法 Meshflow 介绍

介绍 Meshflow 视频降噪算法来自于 2017 年电子科技大学一篇高质量论文。 该论文提出了一个新的运动模型MeshFlow,它是一个空间平滑的稀疏运动场 (spatially smooth sparse motion field),其运动矢量 (motion vectors) 仅在网格顶点 (mesh vertexes) 处…

创造未来知识管理新篇章:Ollama与AnythingLLM联手打造个人与企业的安全知识库!

一 Ollama 1.1 简介 Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型,如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程,使得用户能够快速地在本地运行大…

(论文阅读-多目标优化器)Multi-Objective Parametric Query Optimization

目录 摘要 一、简介 1.1 State-of-the-Art 1.2 贡献和大纲 二、定义 三、相关工作 四、问题分析 4.1 分析 4.2 算法设计影响 五、通用算法 5.1 算法概述 5.2 完备性证明 六、分段线性代价函数算法 6.1 数据结构 6.2 基本运算实现 6.3 复杂度分析 七、实验评估 …

02 Activiti 7:环境

02 Activiti 7:环境 1. 开发环境2. 流程设计器2.1. 在线安装2.2. 离线安装2.3. 中文乱码 3. 数据库 1. 开发环境 这是我本地开发环境 软件版本Jdk17Mysql8.0.36tomcat10.1.23IDEA2024.1Activiti7.0 2. 流程设计器 2.1. 在线安装 在 Plugins 搜索 activiti &…

【stm32笔记】DSP库调用

参考:DSP库调用 , __CC_ARM,__TARGET_FPU_VFP, __FPU_PRESENT1U, ARM_MATH_CM4把需要的库复制出来单独用,方便移植

基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )

【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展,市场经济的信息化,让企业之间的竞争变得&#xff0…