- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
GitOps描述了一种使用植根于 Git 版本控制系统的方法来操作和管理软件的方法。使用基于 GitOps 的工作流,通过要求将系统的特征定义为 Git 存储库中的文件,可以更轻松地开发、部署、维护和协作软件。
术语暗示了 Git 作为单一事实来源的角色。然而,GitOps 驱动流程的实际实现历来是可以解释的。现在, OpenGitOps标准已经解决了这种模糊性,这是CNCF 支持的定义导致可重复 GitOps 系统的原则的尝试。
在本文中,我们将了解这些原则是什么,它们为何重要,以及如何使用它们来构建可扩展和可维护的软件。这些标准是根据GitOps 工作组中 90 多家领先公司和相关方的见解制定的。
第一个原则指出,所有 GitOps 管理的系统都必须以声明方式表达其状态。您应该定义理想状态在当前时间点的样子,而不是提供有关如何组装该状态的具体说明。
声明式配置将系统的所需状态与用于转换到该状态的过程分开。随着时间的推移,这更易于维护并且更容易推理;贡献者只需要描述系统现在应该看起来的样子,无需编写影响状态更改的迁移。
不定义实现状态的确切步骤可以节省开发时间并提高部署灵活性。您只需应用存储库中的最新状态定义,即可在新环境中启动应用程序实例。
声明式配置通常与Ansible 和 Terraform 等基础设施即代码工具一起使用。您编写配置文件来定义您希望可用的基础架构组件。这些工具将您的声明转换为提供必要资源的 API 调用和命令。Kubernetes 容器编排平台是声明式系统的另一个例子。
第二个 OpenGitOps 原则指出,您的系统状态必须在其生命周期内完全版本化。这就是 Git 真正发挥作用的地方,它可以让您提交配置文件、合并来自其他协作者的更改,并随着时间的推移发展您的状态。
结合声明性状态定义,版本控制为您提供了一种在出现问题时回滚系统的有保证的方法。签出较旧的提交并重新应用您的配置文件将使系统恢复到当时的状态。
以这种方式存储状态也有助于实现不变性。将更改应用到基础架构的唯一方法应该是在存储库中修改文件。通过遵循这一原则,您可以断言系统的状态实际上反映了源中的声明。应避免通过直接修改基础架构组件来改变状态,因为它会在系统的真实状态和管理存储库中的“期望”状态之间产生差异。
GitOps 的最终目标是尽可能地自动化系统管理。使用基于拉的方法来应用更改有助于促进这一点。在您的基础架构中运行的代理应定期从您的 Git 存储库中提取当前状态并应用任何更改。
传统的基于推送的部署模型通常通过将更改作为 CI/CD 管道脚本的一部分发送到您的基础设施来工作。即使感觉这是自动化的,这也是在源存储库和基础架构之间创建耦合点的额外步骤。在基于拉的模型中,环境中的代理会轮询您的源存储库并自动检测更改。
该模型创建了不易受状态“漂移”影响的自给自足的基础设施。当环境中的更改与存储库声明的状态相比出现差异时,就会发生漂移。在基于推送的部署模型中,在您的下一次脚本运行启动另一个推送之前,不会解决偏差。基于拉的方法通过定期轮询和重新应用最新状态来最小化漂移。
使用拉代理也是一项安全优势。基于推送的方法要求您以某种方式公开您的基础设施。这是必要的,因此您的源代码控制服务器可以发送更新的状态并执行应用它的命令。通过在基础架构中运行代理,您无需提供进入其中的路径。您可以收紧防火墙控制以允许所有外部访问环境。
同样,您不再需要生成提供对基础架构的访问权限的凭据。在基于推送的模型中使用的 CI 服务器的妥协可能会泄露保护您的实时环境的密钥。通过为拉取代理提供 Git 托管平台的访问令牌来逆转这一流程,比将环境开放给外部访问的风险要小。
最终的 OpenGitOps 原则涉及持续协调。这是通过将声明性状态定义与基于拉的代理结合使用来实现的。
您的代理会持续监控您的系统状态。当提交更改或发生自然漂移时,他们会采取行动将环境调和回声明的状态。这与传统模型形成鲜明对比,在传统模型中,部署是线性过程,它们开始、运行一系列命令并终止,让基础设施独立运行。
持续协调将 GitOps 工作流识别为实时适应不断变化的条件的动态过程。与简单的“设置并忘记”部署不同,GitOps 代理是不断工作以维持所需状态的活动组件。这使您可以确信部署仍按预期运行。
OpenGitOps 原则描述了使用基于 GitOps 的工作流进行有效管理的系统的四个常见特征。他们正式确定了成功实施的关键特征,为 DevOps 团队提供了一个参考点来比较他们自己的系统。
正如这些原则所示,GitOps 不仅仅是 Git 存储库中的配置文件。它是一种用于定义、实施和维护系统的内聚方法;虽然 Git 存储库对于版本控制至关重要,但基于拉取的软件代理等其他组件可以释放该策略的全部潜力。
有效采用包含 OpenGitOps 原则的 GitOps 工作流程可以提高吞吐量、改善部署健康状况并最大限度地减少操作和维护基础架构所花费的时间。该方法使检查系统状态以及使用 Git 和您喜欢的代码编辑器进行或回滚更改变得简单。然后由您的基础架构的代理集成来检测和应用这些更改,从而消除与部署的人为交互及其带来的风险。
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!