Advertisement

A Primer On GitOps And Why It’s Great for Continuous Delivery

阅读量:

作者:禅与计算机程序设计艺术

1.简介

那么什么是GitOps?我在第五章中已经绘制了完整的GitOps体系架构图。通过这张图我们可以清晰地看到GitOps所包含的核心要素:

  1. 应用开发者:他们负责编写应用代码并提交至源代码库(Source Code Repositories)。
  2. GitOps平台管理员:他们设计并发布配置模板,并将这些模板映射至特定环境下的配置存储库(Configuration Stores)。
  3. 自动化工程师:他们搭建CI/CD管道并将更新部署至Kubernetes集群上,并对GitOps平台及配置存储库中的配置进行管理维护。
  4. 部署运维专家:他们负责将最新版本应用部署至生产环境,并确保系统正常运行的同时进行持续优化与更新维护。
    此外,在整个流程中还应包含应用所有者这一角色(Application Owners),他们负责规划和管理从需求分析到发布部署的全过程阶段包括但不限于规划制定、开发实施、构建测试、发布上线以及监控维护等环节)。基于此基础还应提及一个相关术语即"持续交付"(Continuous Delivery),它指的是集成测试与部署的无缝衔接流程能够以高频率和紧急性的方式提升软件开发效率。因此如果你的企业正在探索一种实现这种高效协作实践的工具或方法那么GitOps无疑是一个值得考虑的选择!

2.基本概念术语说明

1、配置管理(Configuration Management):配置文件(Configuration Files)和配置数据(Configuration Data)被存储在中心化的配置管理系统中,所有的配置项都按照优先级逐层审核和更改,并且每个更改都经过严格的审批过程。常用的配置管理系统包括Puppet、Chef、Ansible等。
2、容器编排(Container Orchestration):容器编排系统是一个抽象的平台,用于管理Docker容器化应用的生命周期。常用的编排系统包括Kubernetes、Mesos、OpenShift等。
3、声明式API(Declarative API):声明式API倾向于使用描述所需状态的形式而不是命令的方式去操作系统。例如,Kubernetes采用声明式API,用户只需要描述期望的目标状态即可,不需要关心底层如何实现。
4、声明式配置(Declarative Configuration):声明式配置意味着整个系统的配置都是用一个数据结构来表示的,而不是用一系列命令或脚本来完成。
5、DevOps(Development + Operations):DevOps是一个基于社区的文化理念和一系列工具、方法论和流程的集合,旨在加强开发者与IT运维之间沟通、协作、整合工作,从而提升交付质量和速度。
6、Git(Version Control System):Git是一个开源的分布式版本控制系统,用于协同工作和管理软件项目。
7、GitOps(Git + Ops):GitOps是一种基于Git的自动化运维模式,通过在代码提交前对配置变更进行验证、测试、验证和发布,从而达到消除手动操作的目的。
8、Helm(Package Manager For Kubernetes):Helm是Kubernetes的一个包管理器,允许用户通过一个简单的命令行接口来管理Kubernetes资源。
9、微服务(Microservices):微服务是指将单一应用程序划分成多个小型服务的方法,每个服务运行在独立的进程中,彼此之间通过轻量级通信机制进行通信。
10、Kubernetes(A Container Orchestration System):Kubernetes是一个开源的容器编排系统,用于自动部署、扩展和管理容器化的应用。
11、YAML(YAML Ain’t a Markup Language):YAML不是标记语言,但它是用来表达各种数据对象的通用语言。
12、重试策略(Retry Strategy):重试策略是当出现错误时的处理方式,比如网络连接超时、服务器暂时不可访问等。常用的重试策略有最大尝试次数、时间间隔、异常触发重试等。
13、CI/CD(Continuous Integration & Continuous Deployment):CI/CD是一种软件开发实践,它鼓励软件开发人员频繁、自动地将代码集成到共享主干中,并立即自动构建、测试、验证代码,以减少集成、测试和部署之间的延迟。
14、蓝绿发布(Blue-Green Deployment):蓝绿发布是利用新旧两个环境(即Blue和Green环境)相互独立的原则,进行应用发布。蓝色环境用于部署新版本,绿色环境用于验证、回滚或过度使用。
15、金丝雀发布(Canary Release):金丝雀发布是一种应用部署模型,即将较新的代码分发到一小部分用户手里进行测试,之后再逐步扩大范围,在全量推广之前发现和修复任何潜在的问题。
16、声明式、命令式(Imperative vs Declarative Programming):声明式编程(Declarative Programming)是一种编程范式,它关注于描述计算应该做什么,而不是怎么做。命令式编程(Imperative Programming)相反,是一种编程范式,它关注于如何一步步解决计算问题。
17、配置部署(Configuration Deployment):配置部署是指将应用配置从开发环境、测试环境、预生产环境推向生产环境的过程。
18、配置模板(Configuration Template):配置模板是一种预定义的配置文件,包含了应用部署所需的所有配置信息。
19、配置存储库(Configuration Store):配置存储库是指一个集中管理配置文件的位置,它通常通过Web界面或者API接口提供访问权限。
20、配置管理系统(Configuration Management System):配置管理系统是指用于存储、分发和管理配置文件的软件系统。
21、持续交付(Continuous Delivery):持续交付(Continuous Delivery,CD)是指通过自动执行构建、测试、以及将可用的软件交付到集成环境的一系列过程。
22、Kubernetes Operators(Operators For Kubernetes):Kubernetes Operators是一个控制器模式,用于管理复杂的Kubernetes应用,例如数据库和消息代理等。
23、Kustomize(Customization For Kubernetes Objects):Kustomize是一个用于自定义Kubernetes资源对象的工具。
24、Source Control Repositories(代码仓库):代码仓库是存放代码文件的地方。
25、Repository(仓库):仓库是存放软件、镜像等文件的地方。
26、Continuous Integration Server(CI服务器):CI服务器是运行持续集成任务的机器。
27、Container Registry(容器注册表):容器注册表是用于存储和分发容器镜像的服务。

3.核心算法原理和具体操作步骤以及数学公式讲解

1、什么是GitOps?
GitOps是一种基于Git的方法论和实践体系,在DevOps理念指导下推动企业IT基础设施自动化管理和运维优化的活动模式。
该方法论以代码为本体的设计理念为核心,在持续集成和持续部署的基础上实现了对业务系统的高效开发与运维。
其核心思想是利用统一化的开发环境和操作规范来降低系统维护成本并提升系统运行效率。
通过构建标准化的操作规范库以及建立有效的监控机制能够为企业IT运维提供强有力的技术支撑。
2、CI/CD流程
持续集成(Continuous integration)是指在整个软件开发过程中对代码进行自动化测试构建部署等多阶段操作以保证代码质量并及时发现问题。
持续集成的主要工作流程包括单元测试构建编译代码风格审查生成文档部署到预发布环境测试环境部署以及最终推送到生产环境等环节。
而持续部署(Continuous deployment or deployment)则是指将经过质量验证并通过测试的代码直接推送到最终的应用环境以实现快速响应和优化开发节奏。
通过引入持续集成与持续部署企业能够获得更加高效的开发体验并显著提升软件交付效率。
3. 什么是GitOps?
GitOps是一种采用统一化的版本控制系统(如Git)作为基础设施配置源的同时结合自动化管控方法实现企业IT基础设施全生命周期管理的方法论体系。
对于开发人员而言GitOps能够帮助他们更高效地管理和维护企业IT基础设施从而加速应用交付速度;而对于IT团队而言则能够借助统一化的操作规范减少人为干预并提高运维效率。
这种做法消除了传统IaC模式中存在的一些痛点例如缺乏统一的操作规范以及难以实现自动化运维等问题从而实现了从单纯依靠人工管理向智能化自动化管理模式的转变

IaC 主要受限于少量基础设施的需求,并面临较高的部署复杂度。
配置管理在人力物力方面投入较大且缺乏对变更历史的有效回溯能力。
缺乏统一的配置规范导致配置混乱并影响整体管理效果。
基础设施的生命周期随着开发部署和运维监控等环节的不断延伸而拉长, 从而难以实现有效的统一管理。
采用 GitOps 策略能够带来以下优势:
实现自动化持续集成与部署流程
提供标准化的应用部署规范
支持持续安全性的在线验证机制
增强团队协作中的沟通效率

  • 实现配置的一致性、标准化和自动化管理。

  • 统一管理、部署和监控基础设施,大幅降低管理成本。

  • 实现 DevOps 方法论的落地,增强应用交付和部署的效率。

  • 提升基础设施的可靠性和安全性。

  • 更好地跟踪和控制基础设施的变更历史。
    4、关键概念解析
    应用程序开发人员:负责编写应用的代码并将其推送到源代码仓库。
    配置存储库:用来存储不同环境下的配置模板和参数文件。
    自动化工程师:负责设置 CI/CD 流水线,将更新部署到 Kubernetes 集群上,并管理 GitOps 平台和配置存储库中的配置。
    部署运维人员:负责部署应用的最新版本到生产环境中,确保应用正常运行,并进行维护和更新。
    Git:是一个开源的分布式版本控制系统,用于协同工作和管理软件项目。
    Helm:Kubernetes 中的软件包管理器,可以使用命令行进行安装、升级和删除。
    Kubernetes:是一款开源容器编排系统,它能自动化地部署和管理容器化的应用。
    YAML:一种用来表达各种数据对象的通用语言。
    Kustomize:一种用于自定义 Kubernetes 资源对象的工具。
    DevSecOps:是一种软件开发方法论,它融合了安全和运维的最佳实践。
    CICD:是一种软件开发实践,其中包括软件开发人员在实际项目中使用的一系列流程和工具,这些流程和工具都围绕着源代码控制,包括检查代码,构建代码,测试代码,部署代码,并且能够自动执行以上所有步骤。
    CD:是一种软件开发实践,它通常会频繁地将代码部署到测试、预发布和生产环境中。通过自动化的部署,可以极大地降低软件发布和部署的风险,提升软件的敏捷性和稳定性。
    CD Pipeline:指的是持续交付过程中,用于自动化构建、测试、部署、监控和发布的各个环节。
    Blue-green deployment:蓝绿发布是利用新旧两个环境(即蓝色和绿色环境)相互独立的原则,进行应用发布。蓝色环境用于部署新版本,绿色环境用于验证、回滚或过度使用。
    Canary release:金丝雀发布是一种应用部署模型,即将较新的代码分发到一小部分用户手里进行测试,之后再逐步扩大范围,在全量推广之前发现和修复任何潜在的问题。
    Source control repositories:代码仓库是存放代码文件的地方。
    Repository:仓库是存放软件、镜像等文件的地方。
    Docker registry:是一个用于存储和分发 Docker 镜像的服务。
    ConfigMap:ConfigMap 是一种 Kubernetes 对象,用来保存非机密的数据。
    Secret:Secret 是一种 Kubernetes 对象,用来保存机密的数据,如密码、私钥等。
    Operator:Kubernetes Operator 是 Kubernetes 中的一种控制器模式,能够管理复杂的 Kubernetes 应用。
    Imperative programming:命令式编程(Imperative Programming)是一种编程范式,它关注于如何一步步解决计算问题。
    Declarative programming:声明式编程(Declarative Programming)是一种编程范式,它关注于描述计算应该做什么,而不是怎么做。
    5、GitOps 基础架构图
    下面是 GitOps 的基础架构图。
    上述架构图展示了 GitOps 的主要组件,包括应用开发人员、GitOps 平台管理员、自动化工程师和部署运维人员。

  • 应用开发人员:负责编写应用的代码并将其推送到源代码仓库(Source Control Repositories)。

  • GitOps 平台管理员:负责定义配置模板并将它们映射到特定于环境的配置存储库(Configuration Stores)。

  • 自动化工程师:负责设置 CI/CD 流水线,将更新部署到 Kubernetes 集群上,并管理 GitOps 平台和配置存储库中的配置。

  • 部署运维人员:负责部署应用的最新版本到生产环境中,确保应用正常运行,并进行维护和更新。
    GitOps 在这里起到了重要作用,因为它使得应用程序开发人员和运维人员可以跟踪应用的生命周期,包括计划、开发、构建、测试、发布、监控和更新等阶段。这是由于配置被视为代码一样被版本控制,然后自动部署到集群中。这样就可以确保应用始终处于可用状态,并避免手动操作。GitOps 也消除了配置管理方面的痛点,因为配置都被存储在代码仓库中,可以方便地与代码一起被审查和跟踪。

4.具体代码实例和解释说明

1、示例 Kubernetes 对象配置:假设要创建以下 Kubernetes 对象:

复制代码
    apiVersion: v1
    kind: Service
    metadata:
     name: myservice
     labels:
    app: web
    spec:
     type: LoadBalancer
     ports:
     - port: 80
       targetPort: http
     selector:
    app: web
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

如果将该服务的配置信息保存为JSON格式,并上传至服务管理平台上的服务列表中,则该信息将被视为Kubernetes对象模板资源的一部分。这种组织方式即采用声明式架构。

复制代码
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: myapp-deployment
    spec:
     replicas: 3
     selector:
    matchLabels:
       app: web
     template:
    metadata:
       labels:
          app: web
    spec:
       containers:
       - name: myapp
         image: nginx
         ports:
           - containerPort: 80
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

如果将其提交到配置存储库中,它就会成为一个部署对象模板。这也是声明式配置。
2、示例 Kubernetes 资源配置:假设要对一个 Kubernetes Deployment 对象做一些调整,如增加副本数量为5:
kubectl scale --replicas=5 deploy/myapp-deployment
如果将以上命令设置为一条指令,并提交到配置存储库中,它就会成为一个 Deployment 对象调整指令模板。这也是声明式配置。
比如,现在有一个名为 adjust-replica-count.sh 文件,它的内容如下:

复制代码
    #!/bin/bash
    set -e
    echo "Scaling up replica count of myapp-deployment to $1..."
    kubectl scale --replicas=$1 deploy/myapp-deployment 
    echo "Done scaling!"
    exit 0
    
    
      
      
      
      
      
      
    
    代码解读

3、示例 GitOps 配置:假设要创建一个 GitOps 配置,其中包括以下步骤:

  1. 查看当前应用的状态。
  2. 对应用的镜像进行版本更新。
  3. 将应用的副本数量调整为5。
  4. 应用的回滚操作。
    如果将以上步骤设置为一个 GitOps 配置文件,并提交到配置存储库中,它就会成为 GitOps 配置。这也是声明式配置。
    4、示例 Flux CD 配置:假设 Flux CD 安装后,需要对其进行一些调整,如添加自定义 helm chart repository:
复制代码
    ./fluxctl kustomize flux | awk '/repositories:/ {print; print "    - name: custom"; print "      url: https://example.com/"}' > repositories.yaml
    kubectl apply -f repositories.yaml
    
    
      
      
    
    代码解读

5、Flux CD 配置示例:假设 Flux CD 已完成安装后,则需对其做一些基本设置上的修改即可完成配置操作;例如,在 Helm 包仓库中添加自定义的 Helm 包仓库:

复制代码
    ./fluxctl kustomize flux | awk '/repositories:/ {print; print "    - name: custom"; print "      url: https://example.com/"}' > repositories.yaml
    kubectl apply -f repositories.xml
    rm repositories.yaml
    
    
      
      
      
    
    代码解读

6、示例Helm释放(HelmRelease)配置:假设要创建一个新的Helm释放(HelmRelease)配置项,则需遵循以下步骤:
核查现有Helm释放(Helm释放)资源的状态。
升级HelMod模块或其版本号(chart version)。
设定新的HelMod参数值(Helm values)。
移除现有的Helm释放(Helm释放)资源项。
若将上述步骤作为新的Helm释放(Helm释放)配置文件进行编排后提交至配置存储库后,则该文件将成为一种有效的Hhelm释放(Helmod)资源定义方案,并被纳入官方支持的资源定义范围之内;这也是一种声明式的资源定义方式

5.未来发展趋势与挑战

1、结合无服务器计算(Serverless Computing):越来越多的企业转向采用无服务器计算方案(包括 AWS Lambda 和 Azure Functions)。这种计算模式是一种基于事件驱动架构的设计理念,在这种架构下开发者只需编写代码即可运行应用程序,并无需自行管理服务器资源也不必承担高昂的购置成本。通过这种方式企业能够充分利用云计算的优势以及按需付费模式来降低运营成本。然而与之相比GitOps方法在应用部署方面更为便捷因为它不仅依赖于Kubernetes还能够整合其他云服务来统一管理和维护企业的基础设施。
2、利用更多云服务:越来越多的云服务提供商及第三方软件开发包逐渐融入到 GitOps 生态体系中(如 AWS App Mesh Hashicorp Consul Connect Azure Arc 和 Google Anthos Config Management)。借助这些工具企业能够更加轻松地完成应用程序部署与管理工作。
3、深度集成到 GitOps 工具:随着 GitOps 工具的发展其功能已逐渐成熟并能够提供部署应用 监控以及基础设施管理的功能(例如 Argo CD Flux CD Flagler Helmfile 和 Spinnaker 等)。然而尽管如此这些工具仍有一些局限性例如当出现问题时仍需手动干预操作流程 并且这一过程容易出现错误因此为了更好地应对复杂的环境治理需求有必要探索更具强大功能的新一代 GitOps 工具

6.附录常见问题与解答

1、什么是 GitOps?
GitOps 是一种通过采用 Git 作为配置源和管控基础设施的方法,并通过使用 Git 来自动化和标准化基础设施配置管理的过程。
2、为什么要采用 GitOps?
应用 GitOps 可以带来诸多优势包括降低操作成本 实现自动化 以及确保基础设施管理更加可靠。
3、什么是 GitOps?
GitOps 是一种通过使用 Git 作为配置源和管控基础设施的方法 并通过使用 Git 来实现自动化配置管理的过程。
4、为什么要采用 GitOps?
应用 GitOps 的主要优势体现在降低操作成本 实现自动化 等方面。
5、如何实现 GitOps?
实现 GitOps 需要遵循以下流程:

  • 首先初始化一个 git 存储库
  • 然后创建并提交初始配置文件
  • 接着编写脚本用于自动化部署
  • 最后进行测试与验证以确保配置正确无误
  1. 部署 GitOps 平台。
    2. 部署配置存储库。
    3. 生成 Kubernetes 模板文件,并将其上传至配置存储库。
    4. 部署 Flux CD 或 Argo CD 操作至 Kubernetes 群体。
    5. 发布应用代码至源码存放位置。

全部评论 (0)

还没有任何评论哟~