GitOps 是一种新的软件开发范式,承诺简化和完全自动化软件部署过程。GitOps 不依赖 IT 人员或笨拙的脚本来配置环境,而是将所有环境定义成代码,并通过一致和可预测的方式一起部署环境和应用程序。所有的东西都放在源代码控制系统中,使用的是大多数开发人员都熟悉的工具。
GitOps 承诺可以大幅提升开发人员的生产力。但就像任何新的技术一样,挑战存在于细节之中。GitOps 的一个复杂之处在于确保活动环境的充分可见性,以便确保环境可以与所需的配置保持同步。在本文中,我将解释为什么可观察性对 GitOps 如此重要,以及 GitOps 平台 ArgoCD 是如何解决可观察性问题的。
持续交付为生产部署准备好环境,只需按下一个按钮就可以部署变更。使用传统的方式,通常是将变更合并到主分支(也就是所谓的推送部署)。
在新的 GitOps 环境中,通过向集中式环境代码库提交变更来触发部署(也就是所谓的拉取部署)。
持续交付负责构建可以部署到生产环境中的工件。这是持续集成(CI)之后的下一步。它准备了一个即将用于部署的软件版本,然后等待团队评估变更并决定是否发布它。
持续部署向前迈进了一步,不需要等待人工评估新版本和按下发布按钮。在持续部署中,每个变更都会被自动测试,如果满足某些预定的质量标准,就会自动部署到生产环境中。
GitOps模型要求使用源代码控制系统(通常是基于 Git)进行应用程序和基础设施的配置管理。Git 版本控制系统作为 GitOps 的唯一事实来源。基于这个单一的事实来源,GitOps 使用声明性配置调整生产环境来匹配所需的状态。
GitOps 通过 Git 拉取请求自动管理基础设施的配置和部署。它依赖包含系统完整状态的 Git 代码库来实现对系统状态变更的完整审计跟踪。
GitOps 更强调开发者经验,开发团队可以使用他们熟悉的过程和工具来管理基础设施。GitOps 在选择工具方面提供了几乎全面的灵活性。
使用 GitOps 有很多方面的原因,大多数都与更快、更可靠、更高质量交付软件的能力有关。以下是经常被提及的 GitOps 的好处。
在云原生应用程序架构中,传统的监控方法已经达到了极限。现在的焦点正在从监控转移到可观察性。
监控和可观察性紧密相连。可观察的系统更容易被监控。监控是可观察性的一部分,有效的监控是有效的可观察系统所带来的结果。
可观察性通过以下三个主要元素来提供洞见。
这三种类型的洞见为大多数关键问题提供了答案,包括部署的当前状态与预期状态的比较。它们对系统的所有方面——从预期的架构和配置到 UI、资源和行为——来说都很重要。
GitOps 模型强调简化复杂的 Kubernetes 管理任务的能力。其核心概念是通过对集中式 Git 代码库的变更触发生产环境部署,并完全自动化地修改 Kubernetes 集群。
要启用真正的 GitOps 过程,需要两种类型的可观察性。
在 GitOps 过程中,Git 是系统预期状态的唯一事实来源,而可观察性为系统的实际状态提供了唯一事实来源。因此,它可以帮助 GitOps 开发人员了解系统的状态。
例如,如果你打算基于 Git 代码库中的部署清单在集群中运行三个 NGINX pod。GitOps 系统将使用 Kubernetes 控制器来确定实际运行的 pod 数量及其当前的配置。如果它检测到错误的实例数量或对 pod 配置做出了任何修改(这被称为配置漂移),它会创建一个“diff 警报”。
一旦系统感知到发生了漂移(即期望和实际实例数量之间的不匹配),diff 警报可以触发相关的 Kubernetes 控制器。控制器将尝试同步实际状态和期望状态。等到 diff 警报消失,系统就会认为实际状态与期望状态匹配,这意味着应用程序已经“同步”了。
整个过程的关键之处是感知到漂移。如果你不知道系统处于不同步状态,就无法同步或修复状态。因此,内部可观察性对于 GitOps 和确保实际状态保持同步来说是至关重要的。
外部可观察性有三个要素。
有了这三个元素,监控系统就可以从集群的 GitOps 自动化系统中获取指标,主动通知生态系统的其他部分正在发生哪些变更。换句话说,其他系统会收到应用程序正在同步的“提示”,而不是在回顾时才发现它并产生不必要的警告。
我们将以流行的 GitOps 项目Argo为例。
Argo 是一个开源项目集合,帮助开发人员更快、更安全地交付软件。Argo 是 Kubernetes 原生的,这让开发人员可以轻松地部署和发布他们自己的应用程序。
Argo 支持使用高级的渐进式部署策略进行持续部署,开发人员可以定义发布服务所需的一系列操作。
在 GitOps 工作流中,Argo 促进了应用程序的部署和生命周期管理过程。它让开发人员能够无缝地操作环境和基础设施、自动化部署、回滚,并让故障排除变得更容易。
Argo 使用 Kubernetes 清单持续监控 Git 代码库、验证提交、主动从代码库获取变更,并将它们与集群资源进行同步。这个同步协调过程确保集群配置的状态始终与 Git 中描述的状态匹配。
这就是 GitOps 的确切定义——Argo 可以帮助团队在他们现有的 Kubernetes 集群中轻松地实现完整的 GitOps 过程,而不需要改变现有的工作流程。
此外,Argo 还消除了常见的配置漂移问题。当集群中的元素随着时间的推移偏离期望的配置时,就会出现配置漂移。这些意外的配置差异是导致部署失败的一个最常见的原因。Argo 可以自动消除配置漂移,或者至少显示出集群的部署历史,以便识别出漂移并导致漂移的变更。
最后,Argo 旨在为 Kubernetes 开发人员提供更好的体验,让他们能够在轻松应用高级部署策略的同时保持熟悉的用户体验。它被实现为 Kubernetes 自定义资源定义(CRD),这意味着它就像现有的 Kubernetes 对象一样,具有开发人员可以使用的扩展。
总的来说,Argo 让 GitOps 的实施变得更容易,原因如下。
Argo CD:内置可观察性的 GitOps
Argo CD 通过 Kubernetes API Server 来接收有关资源状态和运行状况的信息。当它检测到当前集群状态和 Git 中的配置不一致时,它将经历三个阶段。
这个过程包含了一次或多次对整个集群进行走查,找到漂移,并对漂移做出反应。每一次走查中的资源的顺序是按照类型(命名空间,然后是 Kubernetes 资源,然后是自定义资源)和名称来决定的。
在每一波走查中,如果有任何资源不同步,Argo CD 将对其进行调整,然后继续扫描集群。请注意,如果第一波走查中的资源不正常,则应用程序可能无法成功同步。
Argo CD 在每一波同步走查之间会有延迟,以便让其他控制器有机会对变化做出反应。这也防止 Argo CD 在更新以反映当前对象状态之前过快地评估资源运行状况。
Argo CD 提供了通知功能,让你可以持续监控 Argo CD 应用程序,并接收有关应用程序状态发生重大变化的警报。它提供了一种灵活的使用模板和触发器设置通知的方式——你可以定义通知的内容以及 Argo CD 应该何时发送通知。
Argo 的另一部分是 Argo Workflows,它让你可以自动化 Kubernetes 集群中与 CI/CD 管道相关的任务。Argo Workflows 可以生成几个默认的控制器指标,你也可以定义自定义指标来提供与工作流状态有关的信息。
Argo Workflows 可以生成两种类型的指标。
例如,你可以定义自定义的 Prometheus 指标,并在工作流或模板级别应用它们。这些指标在各种情况下都很有用。
GitOps 正逐渐成为主流的开发实践。我解释了为什么可观察性是 GitOps 系统不可分割的一部分,并描述了两种类型的可观察性。
我还简要地展示了如何在一个流行的开源 GitOps 平台——Argo 中实现这两者。
GitOps 基于几种复杂的机制,了解它们的最好方法是使用 Argo CD 进行一次测试。也可以参考官方入门教程,它展示了如何安装 Argo CD 以及将一个小应用程序部署到 Kubernetes 集群中。尝试“搞乱”你的测试集群,看看 Argo 如何获取变更并将集群恢复到你想要的状态。
要更深入地了解 Argo CD 同步过程,请参阅官方文档中关于同步阶段和同步波的介绍。
Gilad David Maayan 是一名技术作家,曾与 150 多家技术公司合作,包括 SAP、Imperva、Samsung NEXT、NetApp 和 Check Point,为开发人员和 IT 管理者提供与技术和思想领导力相关的内容。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货