GitOps自问自答

news2024/9/23 13:23:11

GitOps自提出以来受到很多关注,被认为是云原生最佳实践之一。这篇文章回答了关于GitOps的常见问题,帮助感兴趣的相关人员更好理解这一实践。原文: GitOps[1]

自从Weaveworks在2017年提出GitOps以来,已经在Twitter和KubeCon上引发了不少争议。这篇文章汇集了关于GitOps的常见问题,以帮助澄清关于这一主题的困惑。

GitOps是什么?

GitOps是为云原生应用实现持续部署的一种方法,通过使用Git和CD工具等开发人员已经熟悉的工具,从而在操作基础设施时提供以开发人员为中心的体验。

GitOps的核心思想是让Git存储库始终包含生产环境中当前所需基础设施的声明性描述,以及通过自动化过程使生产环境与存储库中描述的状态相匹配。如果希望部署新的应用或更新现有的应用,只需要更新存储库即可触发自动化流程处理其他所有事情,管理生产环境应用就像自动巡航那么简单。

GitOps:在声明性基础设施之上的版本化CI/CD。停止脚本编写并开始发布。
Kelsey Hightower[2]

为什么应该使用GitOps?

更快更频繁的部署

好吧,客观的说,可能每一种持续部署技术都承诺可以更快部署更频繁的部署。GitOps的独特之处在于,部署应用时不需要切换工具。无论如何,所有事情都发生在用于开发应用程序的版本控制系统中。

当我们说到"高速"时,意思是每个产品团队每天可以安全发布多次更新: 立即部署,实时观察结果,并使用根据反馈决定继续往前走还是回滚。
Weaveworks[3]

简单快速的错误恢复

噢,不!生产环境崩溃了!通过GitOps,可以获得环境随时间变化的完整历史,从而使得错误恢复就像执行git revert那么容易。

Git记录不仅是审计日志,也是事务日志,可以回滚或前滚到任何快照。
Alexis Richardson[4]

简单的凭证管理

GitOps允许我们完全在环境内部管理部署。为此,环境只需要访问存储库和镜像仓库,不必让开发人员直接访问环境。

kubectl是新的ssh,要限制对它的访问,只有在没有更好的工具时才用它进行部署。
Kelsey Hightower[5]

自我记录的部署

你是否曾经SSH进入服务器并想知道那里运行的是什么?如果使用GitOps,则对任何环境的每一个更改都必须通过存储库进行,因此可以随时查看主分支,并获取部署内容和地点的完整描述,以及对系统所做的每个更改的完整历史记录,还可以免费获得系统中任何更改的审计跟踪!

在团队内共享知识

使用Git存储已部署基础设施的完整描述可以让团队中的每个人检查其随时间的演变。有了优秀的提交消息,每个人都可以重现更改基础设施的思考过程,也很容易找到如何设置新系统的例子。

GitOps是实践配置即代码(configuration as code)的最佳工具。Git改变了我们的协作方式,但声明式配置是处理大规模基础设施的关键,并为下一代管理工具奠定了基础。
Kelsey Hightower[6]

GitOps如何工作?

环境配置即Git存储库

GitOps以代码存储库为中心组织部署过程,至少有两个存储库: 应用程序存储库和环境配置存储库。应用程序存储库包含应用程序源代码和用于部署应用程序的部署清单。环境配置存储库包含部署环境当前所需基础设施的所有部署清单,描述了应该在部署环境中运行哪些版本的应用程序和基础服务(消息代理、服务网格、监控工具……)。

基于Push的部署 vs. 基于Pull的部署

GitOps的部署策略有两种: 基于Push的部署和基于Pull的部署。这两种部署类型的区别在于如何确保部署环境实际上符合预期。如果可能的话,应该首选基于Pull的方法,因为这样更安全,是实现GitOps的更好实践。

基于Push的部署

基于Push的部署策略是由流行的CI/CD工具实现的,如Jenkins[7]CircleCI[8]Travis CI[9]。应用程序源代码与部署应用所需的Kubernetes YAML一起保存在应用程序存储库中。每当应用程序代码更新时,都会触发流水线,构建容器镜像,最后用新的部署描述符更新环境配置存储库。

提示: 也可以只将yaml模板存储在应用程序存储库中。在构建新版本时,可以使用模板在环境配置存储库中生成YAML。

alt

对环境配置存储库的更改会触发部署流水线,该流水线负责将环境配置存储库中的所有清单(manifests)应用到基础设施上。使用这种方法,向部署环境提供凭证必不可少,这意味着流水线启用了上帝模式(god-mode)。在某些用例中,当运行云基础设施提供的自动化配置时,基于Push的部署不可避免。在这种情况下,强烈建议使用云供应商的细粒度可配置授权系统,从而更严格的控制部署权限。

使用这种方法时要记住的另一件重要的事情是,部署流水线只在环境存储库发生变更时被触发,无法自动注意到环境及其所需状态的任何偏差。这意味着,它需要某种适当的监控方式,以便在环境与环境存储库中描述的状态发生不匹配时进行干预。

想看看怎么设置吗? 查看谷歌的教程[10],了解如何使用Cloud Builds和GKE设置基于Push的部署。

基于Pull的部署

基于Pull的部署策略与基于Push的部署策略使用相同的概念,但在部署流水线的工作方式上有所不同。传统的CI/CD流水线由外部事件触发,例如,当新代码被推送到应用程序存储库时。结合基于Pull的部署方式,引入了operator,它通过不断比较环境存储库中的期望状态与部署的基础设施中的实际状态来接管流水线的角色。一旦发现差异,operator就更新基础设施以匹配环境存储库。此外,还可以监视镜像仓库,以查找要部署的新版本镜像。

alt

与基于Push的部署一样,每当环境存储库发生更改时,就会更新环境。然而,通过operator,也可以监控另一个方向的变化。每当部署的基础设施以环境存储库中没有描述的方式发生更改时,这些更改将被恢复,从而确保Git日志中所有的变更都可跟踪,从而避免对集群进行任何直接更改。

这种方向上的改变解决了基于Push的部署问题,即只有在环境存储库更新时才更新环境。然而,这并不意味着可以在没有任何监视的情况下完全做到这一点。如果由于任何原因无法保证环境符合预期的状态(例如无法获取容器镜像),大多数operator都支持发送邮件或Slack通知。另外,因为没有operator就没有任何自动化部署过程,所以应该为operator本身设置监控。

operator应该始终处于与要部署的应用相同的环境或集群中,从而防止基于Push的方法所出现的上帝模式(god-mode),即CI/CD流水线需要获取执行部署的证书。当部署实例位于完全相同的环境中时,外部服务不需要任何凭证。可以利用部署平台的授权机制来限制执行部署的权限,这对安全有很大影响,当使用Kubernetes时,可以利用RBAC配置和服务帐户。

想看看怎么设置吗? 查看在谷歌GKE上使用weveworks Flux设置基于Pull的GitOps的教程[11]

在多应用环境中使用

当然,对于大多数应用程序来说,只使用一个应用程序存储库和一个环境是不现实的。使用微服务架构时,可能希望将每个服务保存在自己的存储库中。

GitOps也可以处理这样的用例,总是可以设置多个构建流水线来更新环境存储库,从而通过常规的自动化GitOps工作流启动并部署应用程序的所有部分。

alt

只需在环境存储库中使用独立分支,就可以利用GitOps管理多个环境。可以设置operator或部署流水线,对某一个分支上的变更部署到生产环境上,对另一个分支上的变更部署到预发环境上。

FAQ

我的项目为GitOps做好准备了吗?

大部分情况下,是的!GitOps最酷的地方在于,不需要编写任何特殊代码,所需要的只是使用声明式基础设施作为代码工具进行管理的基础设施。

不用Kubernetes,还能使用GitOps吗?

是的!GitOps并不仅限于Kubernetes。原则上,可以使用任何提供可观察性和声明性描述的基础设施,并拥有可用的基础设施作为代码工具。然而,目前大多数基于Pull的GitOps operator都是基于Kubernetes实现的。

GitOps只是将基础设施版本化为代码吗?

GitOps只是基础设施即代码的新名字吗?
sholom[12]

不是。声明性基础设施即代码在实现GitOps中扮演着重要角色,但不仅仅是这样。GitOps采用了Git周围的整个生态系统和工具,并将其应用于基础设施。持续部署系统保证在生产环境中基于期望的状态部署基础设施。除此之外,还可以获得代码审查、pull request和基础设施变更注释等其他好处。

如何在环境中获取密钥但不存储在git中?

首先,永远不要在git中以明文形式存储密钥!永远不要!

也就是说,你在环境中创建了一些密钥,这些密钥永远不会离开环境,应用程序获取需要的密钥,但不向外界暴露。例如,环境中有数据库,只将密钥提供给与该数据库交互的应用程序。

另一种方法是在环境中添加私钥(可能是由专门的运维团队执行),然后可以在环境存储库中添加由公钥加密的密钥。在K8S生态系统中,甚至有工具支持这种加密密钥[13]

GitOps如何处理研发环境到生产环境的发布?

GitOps没有提供将更改从一个阶段传播到下一个阶段的解决方案。我们建议只使用一个环境,避免分阶段部署。但是如果需要多个阶段(例如研发、QA、生产等),每个阶段都有一个环境,就需要处理GitOps范围之外的发布,也许可以通过CI/CD流水线实现。

我们已经在做DevOps了,和GitOps有什么不同?

DevOps的核心是改变组织文化,让人们更好的一起工作。GitOps是一种实现持续交付的技术。虽然DevOps和GitOps共享自动化和自助服务基础设施等原则,但对它们进行比较并没有意义。然而,如果你已经在积极使用DevOps技术,这些共同原则肯定会使你更容易采用GitOps工作流程。

那么,GitOps基本上是NoOps吗?

可以使用GitOps来实现NoOps,但它不会自动使所有运维任务过时。如果你正在使用云资源,那么可以使用GitOps来实现自动化。但是,通常情况下,使用的某些基础设施,如网络配置或Kubernetes集群,不是由你自己去中心化的管理,而是由运维团队集中管理,所以运维永远不会消失。

还有SVNOps吗?

在某种程度上,是的,原则上可以使用任何想要的版本控制系统。GitOps的核心思想之一是让开发人员使用熟悉的工具来操作基础设施。如果你更喜欢SVN而不是Git,那也很酷!但是,你可能需要花更多精力寻找合适的工具,甚至需要编写自己的工具,当前所有可用的operator只基于Git存储库,抱歉!

应该为团队雇佣GitOps工程师吗?

不!没有GitOps工程师。GitOps不是一种角色(DevOps也一样)。GitOps是一组实践。你可以寻找有GitOps实践经验的开发人员,或者让团队内的开发人员尝试这些实践。

工具、文章和讨论

工具

  • ArgoCD [14]: 具有web界面的Kubernetes的GitOps operator
  • Flux [15]: 由GitOps的提出者Weaveworkks提供的GitOps Kubernetes operator
  • Gitkube [16]: 基于 git push在Kubernetes上构建和部署docker镜像的工具
  • JenkinsX [17]: 内置GitOps的Kubernetes持续交付工具
  • Terragrunt [18]: Terraform [19]的包装器,保持配置简洁、可复用,并管理远程状态
  • WKSctl [20]: 基于GitOps原则的Kubernetes集群配置管理工具
  • Helm Operator [21]: 在K8S上通过Helm使用Git的operator
  • werf [22]: 用于构建镜像并通过push方式部署到Kubernetes的CLI工具

更多工具请查看Weavework的Awesome-GitOps[23]

博客文章和社交媒体

  • An Inside Look at GitOps [24]
  • GitOps - Operations by Pull Request [25]
  • GitOps: What, Why, and How [26]
  • What Is GitOps and Why It Might Be The Next Big Thing for DevOps [27]
  • What is GitOps Really? [28]
  • GitOps mit Helm und Kubernetes (German) [29]

讨论

  • GitOps - Operations by Pull Request [B] - Alexis Richardson, Weaveworks & William Denniss, Google [30]
  • Tutorial: Hands-on Gitops - Brice Fernandes, Weaveworks [31]
  • What is GitOps? Next level delivery with Flux & Kubernetes by Rafał Lewandowski [32]

作者

alt
alt
alt

Florian Beetz[33],目前在班贝格大学(University of Bamberg)学习国际软件系统科学,对云计算、clean code和软件工程技术感兴趣,空闲时间喜欢去攀岩。

Anja Kammer[34],INNOQ顾问,构建云原生网络应用程序。擅长处理部署自动化和CI/CD系统,专注于DevOps、云基础设施和Kubernetes等主题。业余时间为Kubernetes开发了名为anya[35]的开源云原生CI/CD系统。

Simon Harrer博士[36],在INNOQ工作,充满好奇心,喜欢分享知识,是Java by Comparison[37]Remote Mob Programming[38]GitOps[39]以及最近的Data Mesh[40]的共同作者之一。

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

参考资料

[1]

GitOps: https://www.gitops.tech/

[2]

Kelsey Hightower: https://twitter.com/kelseyhightower/status/953638870888849408

[3]

GitOps: High Velocity CICD for Kubernetes: https://www.weave.works/blog/gitops-high-velocity-cicd-for-kubernetes

[4]

Alexis Richardson: https://twitter.com/monadic/status/1002502644798238721

[5]

Kelsey Hightower: https://twitter.com/kelseyhightower/status/1070413458045202433

[6]

Kelsey Hightower: https://twitter.com/kelseyhightower/status/1164192321891528704

[7]

Jenkins: https://jenkins.io

[8]

CircleCI: https://circleci.com

[9]

Travis CI: https://travis-ci.org

[10]

Google GitOps Cloud Build: https://cloud.google.com/kubernetes-engine/docs/tutorials/gitops-cloud-build

[11]

在谷歌GKE上使用weveworks Flux设置基于Pull的GitOps的教程: https://www.gitops.tech/tutorial.html

[12]

sholom: https://twitter.com/sholom/status/1173613576696795136

[13]

加密密钥: https://github.com/bitnami-labs/sealed-secrets

[14]

ArgoCD: https://argoproj.github.io/argo-cd

[15]

Flux: https://github.com/fluxcd/flux

[16]

Gitkube: https://gitkube.sh

[17]

JenkinsX: https://jenkins-x.io

[18]

Terragrunt: https://github.com/gruntwork-io/terragrunt

[19]

Terraform: https://www.terraform.io

[20]

WKSctl: https://github.com/weaveworks/wksctl

[21]

Helm Operator: https://github.com/fluxcd/helm-operator

[22]

werf: https://werf.io

[23]

Awesome-GitOps: https://github.com/weaveworks/awesome-gitops

[24]

An Inside Look at GitOps: https://devops.com/an-inside-look-at-gitops

[25]

GitOps - Operations by Pull Request: https://www.weave.works/blog/gitops-operations-by-pull-request

[26]

GitOps: What, Why, and How: https://www.reddit.com/r/kubernetes/comments/dc8bfd/gitops_what_why_and_how

[27]

What Is GitOps and Why It Might Be The Next Big Thing for DevOps: https://thenewstack.io/what-is-gitops-and-why-it-might-be-the-next-big-thing-for-devops

[28]

What is GitOps Really?: https://www.weave.works/blog/what-is-gitops-really

[29]

GitOps mit Helm und Kubernetes (German): https://www.doag.org/formes/pubfiles/11761447/06_2019-Java_aktuell-Bernd_Stuebinger_Florian_Heubeck-GitOps_mit_Helm_und_Kubernetes.pdf

[30]

GitOps - Operations by Pull Request [B] - Alexis Richardson, Weaveworks & William Denniss, Google: https://www.youtube.com/watch?v=BSqE2RqctNs

[31]

Tutorial: Hands-on Gitops - Brice Fernandes, Weaveworks: https://www.youtube.com/watch?v=0SFTaAuOzsI

[32]

What is GitOps? Next level delivery with Flux & Kubernetes by Rafał Lewandowski: https://www.youtube.com/watch?v=5zt-jzKHwX8

[33]

Florian Beetz: https://www.linkedin.com/in/florian-beetz-251048191

[34]

Anja Kammer: https://www.linkedin.com/in/anja-kammer-berlin

[35]

anya: https://anjakammer.github.io/anya

[36]

Simon Harrer博士: https://twitter.com/simonharrer

[37]

Java by Comparison: https://java.by-comparison.com

[38]

Remote Mob Programming: https://remotemobprogramming.org

[39]

GitOps: https://gitops.tech

[40]

Data Mesh: https://datamesh-architecture.com

- END -

本文由 mdnice 多平台发布

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

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

相关文章

Qt实现思维导图功能6『鹰眼视图』

前文链接:Qt实现思维导图功能5『纵向分布模式』 百度网盘体验地址: 链接:https://pan.baidu.com/s/1xotlkSPfG7E_37y_XPfDng 提取码:5li7效果图 1、动态演示效果: 思维导图-鹰眼视图 2、静态展示图片: 新…

Econ3107-econ5116-小组作业知识点精讲

对本文有疑问可以加微信 Tutor_0914联系。也可以访问我的个人辅导网站 : tutoryou 基本概念 option期权 期权(Option),是一种选择权,指是一种能在未来某特定时间以特定价格买入或卖出一定数量的某种特定商品的权利…

Linux 知识学习总结

常用命名 du 作用:显示指定目录或文件所占磁盘空间大小。 示例: du -h 以K,M,G为单位自动适配显示 lxlx-virtual-machine:~/test/video$ du -h 1.2G du -m 指定以1MB为单位显示 lxlx-virtual-machine:~/test/video$ du -m 12…

Python潮流周刊#11:如何使用 Golang 运行 Python 代码?

你好,我是猫哥。这里每周分享优质的 Python 及通用技术内容,大部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题,特此声明。) 本周刊精心筛选国内外的 250 信息源&a…

​注意力机制中的掩码详解

注意力机制的掩码允许我们发送不同长度的批次数据一次性的发送到transformer中。在代码中是通过将所有序列填充到相同的长度,然后使用“attention_mask”张量来识别哪些令牌是填充的来做到这一点,本文将详细介绍这个掩码的原理和机制。 我们先介绍下如果…

(简单)设计哈希集合 Java

为了实现哈希集合这一数据结构,有以下几个关键问题需要解决: 哈希函数:能够将集合中任意可能的元素映射到一个固定范围的整数值,并将该元素存储到整数值对应的地址上冲突处理:由于不同元素可能映射到相同的整数值&…

SpringBoot读取配置的方式

读取配置的几种方式 Spring Boot提供了多种方式来读取配置,下面是其中几种常用的方式: 使用application.properties或application.yml文件:在Spring Boot项目的classpath根目录下,可以创建一个名为application.properties或appli…

oc基本控件3

UIButton // // ViewController.m // OcDemoTest // // Created by Mac on 2023/7/14. //#import "ViewController.h"interface ViewController ()endimplementation ViewController- (void)viewDidLoad {[super viewDidLoad];// 1 创建按钮对象UIButton *button…

涂鸦智能打造专业家庭智能生活助手,实现人机交互升级

近年来,智能家居设备的品类不断拓展,同时,人们对AI与智能家居的联动愈发憧憬。自然语言交互是未来人机交互的主要趋势之一,其关键在于使AI具备主动理解信息的能力,让用户的交互更轻松。如何将智能场景的交互变得更“善…

MySQL-DDL-表结构操作-创建-案例

案例 根据页面原型/需求创建表(设计合理的数据类型、长度、约束) 具体操作 在idea中使用可视化图形界面创建 具体操作如下: 在该界面中进行属性的创建,进行属性名称、数据类型、约束、描述等信息的填写最终运行结果如下&…

800V高压电驱动系统盘点

2023年上海车展共有23家厂商的63个电驱动产品,经过梳理,本次展出的800V高压电驱动共有13款,可以说电驱动全面进入高压化。800V电驱动是一个系统性的话题,对于电机而言,挑战的方向主要围绕高速、高压、散热,…

替换空格

替换空格 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 题目给的测试用例里有以下限制&#xff1a; 0 < s.length < 14。 split() 把字符串分割为子字符串数组 例如&#xff1a; var txt"ABCD EFGH IJKL MNOP QRSTU VWXYZ"; v…

微信小程序下拉选择

微信小程序中下拉框选择一般的交互方式有以下两种 直接下拉选择点击选择框后&#xff0c;弹出浮层进行选择 下边分别介绍两种方式的实现。在微信小程序中&#xff0c;这两种实现都需要修改三个文件 js 文件&#xff1a;下拉选择逻辑的具体实现 wxml 文件&#xff1a;下拉组件…

C#正则表达式校验某个字符串是否是合格的email

C#正则表达式校验某个字符串是否是合格的email 可以借助正则表达式校验某个字符串是否是合规的电子邮箱。对于邮箱的正则表达式有严格的模式&#xff0c;如&#xff1a;^[a-zA-Z0-9_&*-](?:\\.[a-zA-Z0-9_&*-])*(?:[a-zA-Z0-9-]\\.)[a-zA-Z]{2,7}$ 对应的C#实现如下…

TCP编程流程和粘包

目录 1、TCP编程流程 2、粘包 1、TCP编程流程 socket() 是创建套接字&#xff0c;返回值为监听套接字描述符&#xff0c;有了套接字才能通过网络进行数据的传输。创建套接字的参数要指定服务类型&#xff0c;TCP协议使用的是流式服务&#xff08;SOCK_STREAM&#xff09;。 b…

用Matlab听音乐 - 动态频谱

文章目录 高帧率版本效果: 定时器版本music_play主函数&#xff1a;定时器回调函数&#xff1a;效果: 高帧率版本 由于matlab这款科学计算软件本身庞大略显笨重&#xff0c;执行代码的速度受当前系统影响&#xff0c;很难做到严格定时仿真&#xff08;造成音画不同步&#xff…

互联网行业真的不行了吗?

文章目录 前言一、起因二、互联网真的完了吗&#xff1f;三、是不是要转行&#xff1f;四、十年磨一剑五、统一回复 前言 英雄算法联盟 - 七月集训 已经开始 16 天&#xff0c;八月算法集训 将于 08月01日 正式开始&#xff0c;目前已经提前开始报名&#xff0c;报名方式参见&a…

英国24所顶尖大学撤销禁令,更新AI使用规定!

自从ChatGPT展现了其高超的AI技术后&#xff0c;备受全球年轻人的喜爱。ChatGPT功能多样化&#xff0c;可以节省查阅复杂文献的时间、编写简单的Python代码、辅助学生理解知识点... 同时&#xff0c;ChatGPT引发的学术不诚信问题也让各大院校头疼不已。 连续数月以来&#xff…

js 浮点位数超过17位乘以10^18,精度丢失问题

我有一个浮点型 var num 9.963407954080194743 用num * (10 ** 18) 计算得出的结果是9963407954080195000, 但是我想要得到的结果是9963407954080194743 问ChatGPT问题得以解决&#xff1a; GPT提供的代码&#xff1a; import Big from big.js;const num1 new Big(9.9634…

从输入URL到页面渲染的整个过程

从输入URL到页面渲染的整个过程 1.DNS解析&#xff0c;把url中的域名解析成对应的IP地址。如果本地DNS缓存没有响应的记录&#xff0c;则会向DNS发送请求&#xff0c;获取相应的IP地址。 2.浏览器使用获取到的目标服务器的IP地址&#xff0c;通过TCP/IP协议与服务器建立连接&a…