【DevOps】GitOps 初识(上) - 让DevOps变得更好

什么是GitOps

GitOps是一套贯穿整个应用开发和部署周期的DevOps最佳实践。它将Git作为主要的基础设施,应用和配置的存储和同步机制。这种模式将开发人员从基础设施管理任务中解放出来,让他们能够专注于应用程序的开发和交付。

GitOps的工作流程非常简单,所有的更改都在Git存储库中进行,包括应用程序代码、基础设施配置和应用程序配置等。当新的更改被推送到存储库时,GitOps控制器会检测到更改并将其自动部署到目标环境中。这种自动化过程可以消除部署过程中的人为错误,从而提高生产力和可靠性。

与传统的DevOps相比,GitOps的优势在于它使用Git作为中心化存储库,同时提供了更强大的版本控制和协作工具。使用GitOps可以让团队更容易地协作,同时保持更高的生产力和可靠性。

值得注意的是, GitOps并不是DevOps未来发展的趋势。它们本质上是两个不同的维度, GitOps是一套部署实践,而DevOps则是一种范式,或者说是一种思维方式。由于他们原则上的共通性,技术团队更容易在实践DevOps技术过程中采用GitOps的工作流程和实践。
【DevOps】GitOps 初识(上) - 让DevOps变得更好_第1张图片

GitOps与DevOps

DevOps(Development + Operations)是由开发和运维团队之间的一种协作方式。DevOps是一种适用于整个组织流程的最佳实践的通用哲学,而GitOps是一种有效实施DevOps的方法。它是一种依赖于特定工具(Git)进行源代码控制并更加目标导向的实践。

GitOps使用Git自动验证和部署基础设施变更。它采用声明性方法进行运维,而DevOps则同时使用了规定性和声明性的方法。DevOps可以适用于任何基础设施,而不仅限于容器。

DevOps专注于运维和部署,适用于应用变更较慢、需要频繁处理基础设施故障和变更的团队。它适用于软件开发和部署,并有助于管理基础设施即代码(IaC)。

GitOps正在成为容器化应用及云原生的常见工作流程,因为它有助于在Kubernetes上实施CI/CD流水线。它使用Git(GitLab或GitHub)重新定义CI/CD,并作为一个不可变的、集中的状态声明的来源。

GitOps的四大准则

1. 一切皆需声明

声明式格式是指以声明的方式来描述所需的系统状态,而不是指定必须执行的操作。在声明式格式中,你只需描述所需的最终状态,然后让系统自行决定如何达到该状态。通过利用声明式格式,你可以描述基础设施以及运行在其上的应用程序所需的最终状态, 而不关心在此过程中需要执行的操作。这样做可以追溯对任何环境所做更改的过程,并使用任何源代码控制系统实现回滚、恢复和自我修复属性。从命令式的临时脚本转向所有级别(应用程序和基础设施)的声明式配置,可以提高可追溯性、减少手动干预带来的错误,并使系统更加健壮和可靠。

2. 版本控制

将声明式描述存储在代码仓库中可以保证声明配置的不可变性、实现版本控制和追溯版本历史记录。例如,使用Git存储上述声明,可以让你从一个唯一的地方获取部署应用所需的所有配置。这使得你可以轻松地定位任何时候所做的更改。我们只需查看版本控制系统中的更改记录,而不需要手动的比较环境间的差异,就能保证整个系统的状态最终与配置声明的保持一致。通过这种方式,你可以确保在整个开发和部署过程中一致性和可追溯性,并保持对系统状态的完全控制。

3. 自动拉取代码

GitOps意味着在集群中有一个agent程序在一直运行,定期自动拉取Git源码,获取其中声明的目标状态并将其与实时集群实际状态进行比较。这样,agent程序始终可以知道Git中的目标版本是否与实时状态相同,从而确保系统状态的一致性和可靠性。通过这种方式,GitOps可以为整个应用程序和基础设施提供自动化部署和管理,使技术团队能够更快地交付高质量的软件,并且更容易地维护和管理整个系统。

4. 循环反馈

GitOps的运行是一个闭环,包含了反馈和调整,并一直进行下去,这个循环会确保声明的系统期望状态与实际状态匹配,这是GitOps最重要的功能之一。当代码仓库一起使用时,GitOps agent会提供多种功能,确保自我修复, 其中包括自动修复故障,执行工作流程的质量保证过程,并保护免受人为错误或手动干预的影响。这种自动化可以减少错误,提高生产力和可靠性,并使你的团队能够更快地解决问题并实现业务目标。

实践GitOps

实际上,将GitOps的实践引入生产中是一件比较容易得事, 因为它本身就是建立在一些既有工程实践上的实践模式。以下是一些既有的工程实践与GitOps结合的举例:

  • Git Workflow: GitOps将Git仓库作为应用和基础设施变更判断的唯一触发条件。任何应用或环境的变更都会对应体现到Git仓库中的代码变更。Git本身具有完整的审计跟踪和版本回滚能力。利用Git作为应用或环境的变更触发器,GitOps具有良好的可追溯性和可控性,使得对整个系统的控制变得更加轻松和便捷。GitOps还可以通过Git的分支和标签来支持多环境和多版本的部署,从而变得更加的灵活且可控。
  • CD pipelines: 使用GitOps将更加清晰的区分CI和CD的边界。我们的CI pipeline可以保持不变,只是将他构建出来的可运行的程序/容器镜像(我们可以称之为构件)存储在一个代码仓库中。一旦这个构件被创建出来,GitOps就接管了CD的流程,将它部署到目标环境/集群中去。传统的CI/CD流程通常是由源代码库的提交触发的,而GitOps与之不同,GitOps的触发条件往往是一个配置存储库的提交,而非源代码库的提交。
  • Infrastructure as Code (IaC): GitOps将代码仓库的变更作为触发CD的唯一条件。基础设施即代码会将所有的基础设施配置用代码来记录,并使用git进行管理。IaC本身就是声明式的配置。用GitOps也可以实现重复可控可追溯的基础设施管理。IaC还可以与其他工具和平台紧密结合(k8s/terraform),进一步提高系统的自动化能力和可靠性。
  • 链路追踪和可观测: 跟踪和可观测性是GitOps的重要组成部分,因为它使你能够确保声明式配置描述的期望状态和实际当前状态是相同的。通过监测系统的状态和性能,你可以及时发现和解决任何偏差和问题,并确保系统的一致性和可靠性。因此,可观测性是GitOps中确保系统稳定性和可维护性的关键因素之一。
  • 容器化基础设施: 多数情景下, GitOps都被应用于云原生(k8s)集群中的应用持续发布。它使我们能持续的对应用变更进行快速发布,基础设施变更及时的应用。这并不意味着GitOps只适用于这样的场景,它也可以在其他的基础设施(非k8s)条件下发挥同样的作用。
    【DevOps】GitOps 初识(上) - 让DevOps变得更好_第2张图片

综上所述,现有的一些优秀DevOps实践与GitOps都有很好的契合性,这让我们可以仍然遵循着DevOps的哲学,进行GitOps的实践与探索。

GitOps可以怎样帮助我们

大多数现有的基础设施配置管理模式都面临着一些共同的挑战,例如:部署失败的处理,不科学的基础设施架构设计,宕机等。如果还是继续使用传统的IaC方式,这些问题仍然不能得到很好的解决。首先让我们来细细思考一下,传统的IaC方式还面临着哪些问题:

  • 配置不一致性: 即使有集中化的配置管理,但只要还存在着手动的操作流程,就总会出现配置不一致的问题,即代码中声明的配置和环境实际的配置不一样。
  • 不明的应用运行方式和位置: 为了解决这个问题,技术团队不得不对基础设施进行全局的大范围的排查,来确认当前的系统状态和配置声明的系统状态。
  • 依赖灾备策略来处理失败的部署: 灾备处理策略通常是严格的,但一般也免不了手动的处理流程,这是很有可能出错的。一旦出错就会造成业务的不可用,也影响开发团队的生产力。
  • 文档不全: 文档不全很可能导致难以查明应用的构建方式,部署方式,也容易导致应用最终无人管理。
  • 依赖其他前置步骤: 前置条件本身的不确定性会影响部署的成败,这种不可预测性很大程度上的影响了部署的稳定性。

GitOps带来的一些关键的好处如下:

  • 提高开发者的效率: GitOps让开发人员可以使用熟悉的工具(如Git)来管理更新和功能,而无需处理容器或了解Kubernetes的内部工作原理。通过使用GitOps,开发人员可以专注于应用程序代码和功能的开发,而不必担心底层基础设施的管理和部署。GitOps自动化了应用程序和基础设施的管理和部署,使得开发人员可以更轻松地进行测试和部署,并迅速实现反馈和迭代。因此,GitOps为开发人员提供了一个更加高效和可靠的应用程序和基础设施管理方法,使他们能够更加专注于核心业务逻辑和功能的开发。
  • 最小化部署失败的影响并快速回滚:Git提供了回滚、撤销和分支等功能,如果在生产环境中出现任何问题,可以轻松回滚到之前的版本。通过使用Git作为单一的信源,可以缩短恢复时间,使其仅需几分钟或几秒钟。GitOps还可以使用自动化工具和流程来加快部署和恢复时间,以及减少人为错误和故障的发生。
  • 加速feature发布: GitOps可以加速应用程序功能在生产环境中的发布速度。使用GitOps,开发人员可以不断地将功能更新部署到Kubernetes集群中。这种持续部署的方式可以使部署变得更快速、一致性更强和可靠性更高。
  • 内置的审计: 使用Git来管理Kubernetes集群时,你可以获得所有变更的完整审计日志,包括所有来自Kubernetes之外的变更,并记录了变更的详细信息和操作者。这可以帮助你实现一致的操作和支持合规性。
  • feature开发生命周期更可观测: GitOps提供了一种一致的模型,可以跟踪和管理组织中的基础设施和应用程序变更。通过GitOps,开发过程变得更加可见和可重复,可以通过Git完全追踪和管理开发的所有功能和应用程序的生命周期。
  • 更安全: Git使用强大的加密技术来管理变更并验证作者身份,因此可以提供正确性和安全性方面的强有力保证。由于GitOps可以将CI和CD过程分离,即使CI系统存在安全漏洞或故障,也不会直接影响到生产环境。企业可以更好地保护其生产系统和核心数据,提高安全性和可靠性。

这些好处对于运维/服务工程师和需要更强大的操作性解决方案进行应用程序开发和基础设施自动化的开发人员都是适用的。运维/服务工程师可以使用GitOps来管理和部署基础设施和应用程序,从而提高操作效率和减少人为错误。开发人员可以使用GitOps来管理和部署应用程序的不同版本,从而加速开发流程并提高生产力。GitOps提供了一个统一的平台和流程,可以帮助运维/服务工程师和开发人员更好地协作和交流,从而更快地解决问题并实现业务目标。此外,GitOps还可以提供更好的跟踪和分析功能,以帮助团队更好地了解应用程序和基础设施的性能和状态,并作出有针对性的决策和改进。因此,GitOps可以为企业提供更好的协作和生产力,帮助其实现业务目标并提高市场竞争力。

下一篇文章,将为大家介绍实施GitOps面临的几大难题,并给出一个简单的GitOps实践工作流程示例。
【DevOps】GitOps 初识(下) - 让DevOps变得更好

你可能感兴趣的:(Devops,devops,git,运维,gitops)