从我们第一次听到持续交付这个词,到现在估计差不多有10年时间了吧。Humble Jez 和 Farley David 在2010年的时候,通过他们的新书《Continuous Delivery: Reliable Software Releases Through Build, Test and Deployment Automation》提出的。在过去10年中,持续交付改变了我们软件发布的方式。现在随着围绕 Kubernetes 生态系统不断演变出的一套新的工具,让我们在持续交付的旅程中实现了又一次飞跃。这些工具基本上都是围绕着 GitOps 这个概念展开的,本文将尝试来解释下 “GitOps” 的 Why? What? 以及 How?
GitOps 是一个概念,将软件的端到端描述放置到 Git 中,然后尝试着让集群状态和 Git 仓库持续同步,其中有两个概念需要说明下。
GitOps 由以下4个主要的组件组成:
关于这些组件如何协同工作来创建 GitOps 流程的架构图如下所示。
在上面的架构图中,YAML 文件的创建和修改分为应用开发、应用运维和集群运维三部分。根据我们的组织团队架构、集群多租户等需求,可以选择分一到两步进行。接下来我们来看看为什么需要使用 GitOps?
GitOps 可以在很多方面都产生价值,下面我们来看看其中的一些关键的价值。
应用交付速度
持续的 GitOps 可以通过以下几个方面来提高产品交付速度。
端到端的自动化
在 GitOps 中,所有和应用开发、应用运维和集群运维相关的声明都通过 git 嵌入到 YAML 文件中,实现了端到端的自动化。
安全、审计和合规性
零手动更改到集群中应用的策略将大大增加集群的安全性,由于集群中的所有配置都在 git 中,我们将拥有一个完整的审计日志,记录集群中发生的事情。
集群可观测性
有了完整的审计日志,我们就可以很容易获得集群中发生的变化,来帮助调试一些问题。
关注点分离和迁移
GitOps 将应用开发者、应用运维和集群运维之间的关注点进行分离,这些团队中的依赖关系以声明式的方式注入到 git 中,这将大大缓解我们对底层 K8S 集群、治理策略等工具的迁移。
我们将通过以下四个不同的方面进行阐述来帮助我们实现 GitOps 这一目标。
以下三个工作流程是我们在开始使用 GitOps 时要采用的比较流行的工作流程。
工作流1:标准的 GitOps 流程
这是标准的 GitOps 工作流,我们将应用程序的 YAML 描述推送到 GitOps 仓库中,GitOps Agent 就会自动同步状态变化。
工作流2:镜像自动更新
在这个工作流中,GitOps Agent 会根据指定的策略从容器镜像仓库中自动更新新版本的容器镜像,例如,我们可以设置这样的策略,如果镜像有一个小版本变化,我们就可以自动更新,因为它们是向后兼容的。
工作流3:自动化金丝雀部署
该工作流非常强大,我们可以在这里实现金丝雀自动化部署。有了这个,我们在用 Prometheus 测量 HTTP 请求成功率、请求平均持续时间和 Pods 健康状态等关键性能指标的同时,可以逐步将流量迁移到金丝雀实例上。
假设我们有一个电子商务购物车应用,完整的应用程序定义如下所示。
要构建一个最终的应用 YAML 描述文件,我们需要应用开发者、应用运维和集群运维人员的一些输入。
假设我们是一个比较小的团队并且管理了很多的 Pod,下面的流程就可以来表示如何构建一个持续部署的自动化流水线。
这种关注点分离的方式深受 OAM(开放应用模型)的影响,该模型试图为云原生应用开发提供一个完善的框架。
OAM(https://oam.dev/) 描述了一种模式:
通过使用 OAM 框架,会将 YAML 的贡献者责任进行分离,当然这可能会根据你的团队组织结构和使用的 Kubernetes 集群类型有所变化。
如果你比较赞同 GitOps 的理念,那么下面就可以来选择一些需要用到的工具了。有很多工具可以支持我们去实现 GitOps 的不同功能。接下来我们简单介绍一些工具及其使用方法。
Git:这是我们使用 GitOps 来存储 YAML 清单的基础。
Helm & Kustomize:这是一个强大的组合,可以帮助我们生成声明式的 YAML 资源清单文件,我们可以使用 Helm 打包应用程序和它的依赖关系。然后 Kustomize 会帮助我们自定义和修补 YAML 文件,而不需要去改变原来的 YAML 文件。单独使用 Helm 是不够的,特别是用于区分不同环境的资源清单的时候,我们还需要结合 Kustomize。
Argo CD:这是一个 GitOps 持续交付工具,它可以作为一个 Agent,将 GitOps 仓库中的改动同步到 Kubernetes 集群中。
Flux:这是另外一个 GitOps 持续交付的工具,功能和 Argo CD 类似。
Flagger:这个工具和 Flux 配合使用,可以很好地实现金丝雀部署。
如果你正准备开始一个新的项目,那么从一开始就采用 GitOps 是比较容易的,我们所要做的就是选择我们的 CI/CD、声明式 YAML 文件管理以及 GitOps Agent 等工具来启动即可。
如果你想在现有的项目中实施 GitOps,下面的几点可以帮助你实施:
原文链接:https://itnext.io/continuous-gitops-the-way-to-do-devops-in-kubernetes-896b0ea1d0fb