6张图,带你深入理解GitOps,真硬核!

大家好,我是小碗汤,今天分享一篇6张图深入理解GitOps,内容硬核,建议兄弟们收藏~

在使用 K8s 的云原生应用中,Serverless,Devops 工具以及大量其他云技术。通常,基础设施代码和应用程序代码是分开和单独部署的,从而会导致系统状态和配置漂移、不稳定、错误配置变更等问题。

GitOps 将 Git 与 GitOps Operator 工具结合在一起,它们通常都在 K8s 中,使 Git 为开发人员提供更高效、更安全、更集中的版本控制,是 K8s 的集中式操作模型、可以更快发布版本。


今天,容器化已经成为在开发、测试和生产环境中运行应用程序的标准方式。因此,容器编排已经成为部署过程中不可或缺的一部分。

容器在一个独立的实例中运行应用程序及其所有依赖项,类似于 VM,但更轻量。它们与运行它们的主机共享操作系统内核存储和网络。容器可以在持续集成和持续部署过程中,保证操作系统、依赖项和应用程序不变。

目前为止,Docker 仍是最流行的容器运行时。当多个容器同时运行时,我们需要编排。可以在单个或少量 docker 服务器上部署许多容器,但管理网络,存储,容器编排,这就是 K8s 发挥作用的地方。

K8s 是一种编排解决方案,它抽象了运行多个容器的复杂性,甚至是在多个集群中运行这些容器的复杂性。它接管了成百上千个容器的计算、网络和存储,但它依赖这些底层基础设施。

对 CI/CD 流程的理解

在进入GitOps的核心概念之前,先了解一下容器和k8s是如何兼容CI/CD Pipeline的。

cc301f92fe12442a421d87e71ae6b6c3.png
标准CI/ CD流程

上图显示了一个标准的持续集成和交付过程。这个过程可能相当复杂,便于理解,我们尽量保持简单。

  1. 这里首先由开发人员提交代码并将其推送到版本控制系统(通常是 git)。

  2. 创建一个 pull 请求合并到主分支。一旦代码被合并,它就会触发自动构建,将这些提交的更改合并到一起。

  3. 构建发生在 CI 服务器上,如果构建和测试一切顺利,则构建应用程序的容器镜像,并将其推送到容器注册中心。这个过程被称为持续集成。

  4. 代表应用程序不同版本的容器镜像存储在注册表中,以便部署在不同的环境中进行测试。作为持续集成的扩展,这些步骤被称为持续交付。

  5. 当测试通过时,可以触发应用程序新版本的自动化生产部署。

CI/CD 过程中可能涉及多个手动步骤,但是当随着时间推移,开发过程变得成熟时,可能会取消手动干预,这称为持续部署。

在持续交付过程中,在k8s中设置预期的状态,然后根据镜像创建单个容器。但是容器镜像在本质上是不可变的,所以当我们需要更新已部署的应用程序时,需要使用新代码和所有依赖项创建一个新的容器镜像。

为了获得所需的状态,k8s从远程注册表获取镜像并达到期望状态。我们需要为它提供一组k8s配置清单,这些配置清单描述应用程序将如何运行。这些YAML清单引用容器镜像来标识部署的应用程序版本,还包含其他配置,如:副本实例数、健康检查、安全和自动伸缩等。

配置漂移问题

K8s 将尝试根据YAML中的定义,向期望状态接近,它也将响应之后的用户请求来更改所需状态。

这可以使用不依赖于YAML清单的命令(kubectl 命令)来完成。这些命令会改变期望状态,配置开始偏离YAML清单中已经定义的内容。

让我们用一个例子来理解它:5ad051f6b51ab4c673bc90298d1770d0.png

这里简化了 CI/CD 过程,以关注在一段时间内配置漂移问题是如何发生的。

v1版本的应用程序部署到k8s集群开始。

我们已经定义的 CI/CD 流程,用于按照我们预期的状态(DSC 1)将配置应用到集群。847051874fc927441294aa3a4cd853e4.png

现在,应用程序在集群中以定义的期望状态(DSC 1)运行了一段时间,但最终出现了一些操作问题。

例如:由于流量突然增加,应用数量需要在节点级扩容,或一些安全配置需要立即应用到集群。为此,需使用必要的命令改变配置,改变已部署的应用程序。如下面所示图:c9a5e13c513f8b73c0ce1aa3589c13fd.png

最终,在生产环境中长时间运行应用程序后,应用程序的版本 2 (App Version 2)已经准备好了新特性,并上传工作负载清单以引用较新的镜像。

同样,我们的 CI/CD 将负责应用更新后的YAML清单,并且我们将依赖 K8s 在期望的状态下优雅地处理更改。

但理想状态是什么?是更新后的清单引用了新的容器镜像吗?

它是我们在动态集群中所做的必要更改和新的工作负载清单的合并吗?

K8s 认为理想状态应该是什么?

这个问题的答案是:K8s 会根据要求合并配置更改,但是集群的状态将不再准确反映我们开始时使用的 YAML 配置清单。

什么是 GitOps?

配置漂移可能是一个严重的问题,我们最好管理配置的完整性,以便在 K8s 中配置的内容准确地反映预期。

GitOps 就为了解决这个问题。它可以用来有效地管理配置,并帮助实现可靠和自动化的部署。

GITOPS是依赖于软件自动化建立期望状态的云原生应用程序的操作模型模式,其使用版本控制系统,作为提供自动连续交付的真实来源。

所以 GitOps 通常描述的是期望的状态配置,并将其存储在版本控制系统中,它管理在期望状态下的变化。然后通过自动化代理(如 Flux 或 Argo CD)将这个期望的状态应用到目标环境(k8s,但不一定),然后根据版本控制系统中可用的内容持续监视系统的实际状态。

自动化代理可以是外部的,也可以在系统内运行。他们连续监测系统,并观察配置漂移的行为,做一些操作(可以配置为发出警报,或者以自动化的方式进行修复)。

GitOps 的部署策略

GitOps 的部署策略可以用推模型或拉模型来实现,下面我们试着去理解这两种模型。

Push Model

在本文开头,我们讨论了标准的 CI/CD 过程是怎样的,即开发人员将代码推送到 VCS,然后通过 pull request 触发 CI 构建。从那里产生的 docker 文件作为 CI 过程的结果,存储在注册表。在 CD 过程中部署到 K8s 集群,如下步骤 1,3,4,5 和 6 所示。

53f5a945995da8a2a9aba9305d8d6ddd.png
Push部署策略

Push 部署策略

GitOps 的 Push 部署策略非常类似于 CI/CD 流程,只是清单文件包含了定义 K8 服务器需要创建对象的配置。Manifest 文件也在 VCS 中管理,可以是同一个 VCS,也可以是单独的存储库。

正如我们上面讨论的,部署和监控应用程序的自动化过程可以是外部的,也可以是内部的,对于 Push 部署策略,它是外部的,通常由同一个 CI 服务器管理。CI 服务器可以执行kubectl apply命令,将 manifest 应用到集群中。

Pull Model

GitOps Pull场景中,自动化不是从集群外部操作,而是在集群内部部署一个代理。它作为Kubernetes Operator运行,能够跟踪包含 K8s 清单的 VSC 仓库。

8564bb8f0d166dd50c7d32146a73b7a6.png
Pull部署策略

Pull 部署策略

当它在集群中运行时,它知道集群的实际状态。如果它检测到 VCS 中包含的真实源与集群中的实际状态之间存在差异,它就会采取行动。要么发出告警,要么试图通过与 VCS 的内容同步来调和差异。还可以将代理配置为以新镜像的形式,监视远程容器注册表中应用程序代码的新版本。然后代理能够在 VCS 中更新清单,并基于新镜像触发新的自动部署。

由于 Pull 部署策略需要K8s Operator来执行操作,我们需要为此寻找特定的工具。虽然有多种可用的工具,但其中两个是最受欢迎的,CNCF 也推荐了它们。例如Flux[1]和ArgoCD[2]。可以在官网中获得更多细节。


本文是对 GitOps 的理解,以及它如何解决配置漂移问题,来实现系统的高级治理。深入研究 GitOps 工具,看它们是如何实现的,将在后续文章中做分析。



本文翻译自:https://reurl.cc/OpqNqX,版权归原作者所有

欢迎小伙伴们投稿原创文章~

投稿格式:markdown格式的md文件

投稿邮箱: pub@kubeinfo.cn

参考资料

[1]

Flux: https://fluxcd.io/

[2]

ArgoCD: https://argo-cd.readthedocs.io/en/stable/


1f86138ff686cac905e3d22e2d3c3b9a.png

点个在看你最好看

52a9e14ad6267ca5edbc8fb29c5bf0e3.png

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

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

相关文章

css 字体加粗_HTML基础属性与CSS基础

有头发且有趣的码农万里挑一~ 40有料叔 | 一位有故事的程序猿1HTML基础属性1.class属性:用于定义元素的类名,如需为一个元素规定多个类,用空格分隔类名定义格式:2.name属性: 用于指定标签元素的名称。Name属性的值可以…

linux之如何快速在文本里面写入内容

一、创建文件 touch file 二、写入内容 echo "hello word">>file 图片举例 还有 echo "hello">file 是把之前的内容覆盖,然后内容只有hello 如图: 最后: 无论是echo "hello">file 还是 echo&quo…

css实战手册第四版 pdf_你真的了解CSS继承吗?看完必跪

也许你瞧不起以前的 css ,但是你不该再轻视眼下的 css 。近年来 css 的变量系统已逐步得到各大浏览器厂商支持,自定义选择器等强势袭来,嵌套系统/模块系统也在路上...为了更好的掌握 css 这门语言,很有必要把之前零零散散的 css 知…

hibernate级联操作详解

2019独角兽企业重金招聘Python工程师标准>>> 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) l Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade: none,all,save-update,delete, lock,ref…

出门就背他了!可伸缩的背包,自由变大变小,还有防盗功能!

▲ 点击查看出门能不背包就不背包,几乎是小爆身边每个男生的人生信条。不背包时,两手空空一身轻,潇洒有型。但一旦到了必须背包,比如五一外出回家或旅游的时候,男同胞们翻箱倒柜找出来的背包,大多都是这种双…

C#实现网页加载后将页面截取成长图片 | Playwright版

前言如何将网页生成预览图?要实现这个功能,可以用WebBrowser组件模拟浏览器,或者使用系统浏览器访问网页,再进行截图操作。但是,这样需要编写大量的控制代码。工欲善其事,必先利其器!利用Playwr…

python链接mysql报错2003_Python连接Mysql报错问题解决

import MySQLdb #打开数据库 db MySQLdb.connect("127.0.0.1","root","123456","testdb",3306) #使用corsor()方法获取操作游标 cursor db.cursor() #使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()") #使…

nodejs项目_多人群聊实现其实很简单:Nodejs+WebSocket+Vue轻松实现Web IM

点击右上方红色按钮关注“web秀”,让你真正秀起来前言在《Nodejs WebSocket简单介绍及示例 - 第一章》中简单的介绍了,Nodejs WebSocket的使用方法及作用,今天就用它来搭建一个简单的聊天室功能。1、NodejsWebSocket创建后台服务器功能 2、…

交友软件上的两种网友类型......

1 轻轻松松月入五千的方法(素材来源网络,侵删)▼2 像极了期末复习的你(via.段子楼,侵删)▼3 听说你想要中国的熊猫▼4 听说学校附近有野人出没(素材来源网络,侵删)▼5…

解读最新的 Xamarin 更新

微软中国MSDN 点击上方蓝字关注我们Good news——Visual Studio 2022 包括了 Xamarin 对 Android 12和苹果最新的 Xcode 13 版本下的 iOS、iPadOS、macOS 和 tvOS 的支持,以及适用于支持它们的最新 Xamarin.Forms 版本。让我们一起来了解下最新 Xamarin版本&#x…

原来医生的处方不是随便乱写的...

1 奇奇怪怪的知识又增加了(素材来源网络,侵删)▼2 像极了早上刚睡醒炸毛的你▼3 原来医生的处方不是瞎写的▼4 当爷爷不当孙子(素材来源网络,侵删)▼5 40厘米的身高差(素材来源网络&#xf…

Android之解决Gigaset手机不能设置DeviceOwner权限提示already provisioned问题

客户那里有Gigaset手机,安装我们的产品需要注入DeviceOwner,但是刚恢复默认出厂的Gigaset手机很奇葩,注入权限的提示下面错误,导致不能使用我们的产品 设置DeviceOwner权限是有限制的,需要手机账号(acount)为0 1 我们用命令查看手机的帐号 adb shell dumpsys account …

收集网络状态(Ping),并用邮件通知管理员

在没有第三方工具对网络进行监控的话,要检查网络中某台主机,或是某个IP地址通讯是否正常,我们通常用手动PING来进行测试。有了PowerShell,我们可以用他定时Ping网络上的几个IP地址,然后把ping的个延时时间用邮件通知给…

sql 某列数据全部为0则不显示该列_数据产品经理养成记(五):汇总分析

学会了如何查找数据后,接下来就要对数据进行分析处理,比如求和、平均值、加总等等。这些对数据的加工处理通过汇总函数来实现。汇总函数在之前的两篇文章中都有涉及,这里采用概念--案例--总结的方式,集中介绍一下。1.什么是汇总函…

vim学习日志(5):vim下wimrc的配置,解决中文乱码问题

解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: set fileencodingsutf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencodingutf-8 set enco…

Android插件化开发之AMS与应用程序(客户端ActivityThread、Instrumentation、Activity)通信模型分析

转载来自:http://blog.csdn.net/qinjuning/article/details/7262769 今天主要分析下ActivityManagerService(服务端) 与应用程序(客户端)之间的通信模型,在介绍这个通信模型的基础上,再 简单介绍实现这个模型所需要数据类型。 本文所介绍内容…

iOS开发UI篇—直接使用UITableView Controller

iOS开发UI篇—直接使用UITableView Controller 一、一般过程 1 //2 // YYViewController.h3 // UITableView Controller4 //5 // Created by 孔医己 on 14-6-2.6 // Copyright (c) 2014年 itcast. All rights reserved.7 //8 9 #import <UIKit/UIKit.h> 10 11 inter…

怎么做图片文字二维码一起_怎么做?才能让文字编排更出彩

在之前视觉设计文章中&#xff0c;我把视觉设计大致罗列了四个方向&#xff0c;更多的是希望能够为大家带来一些努力方向&#xff0c;在设计的路上不那么困惑迷茫&#xff0c;视觉设计本身涵盖的范围就比较广&#xff0c;同时也没有什么衡量的标准和具体的特征&#xff0c;只有…