用GitOps实现库本内特自动化


Image title


在最近由Sysdigg赞助的云原生转型峰会上,Weaveworks工程师Bryan Boreham就“用GitOps自动化Kubernetes”进行了演讲。

GitOps这个词最初是由Weaveworks的首席执行官亚历克西斯·理查森首创的,据布莱恩说,亚历克西斯想出这个词是为了了解Weaveworks工程团队每天已经在做的事情。

GitOps原则

GitOps的目标是提高团队产出的速度。它自动化了Kubernetes发布和部署的大部分过程。简而言之,GitOps是一种避免使用定制脚本的方法,相反,它可以自动化您的Kubernetes部署,这样您就可以每天安全地发布代码。

GitOps遵循以下四个原则:

  1. 声明性地描述您的整个系统。
  2. 版本控制所需的系统状态。
  3. 在版本控制提交时将更改应用到所需状态。
  4. 使用软件代理到同步,并对分歧保持警觉。

什么是云本地转型?

布莱恩描述了在云计算出现之前,公司需要具备哪些条件才能实现规模。在过去,扩展系统需要您订购新服务器。在传统的数据中心,您需要等待大约一个月才能获得新的服务器,而现在有了云,大约需要两分钟才能启动一台新的服务器。

但是团队需要多长时间来交付软件变更呢?

根据Forester的说法,大多数企业都是按月发布的。但只有20%的受访企业表示,他们发布数据的速度快于每月一次。

是什么降低了发布速度?

人们迟迟不愿释放的原因有很多。下图说明了平均发布审批流程。根据布莱恩的说法,这就是为什么许多团队需要很长时间才能发布一项新功能的原因是审批过程。

织造厂在45分钟内从灾难中恢复

在Weaveworks,我们运行名为Weave Cloud。几年前,我们的一名工程师在命令行上打错了一些东西,在这个过程中,he accidentally deleted all of our clusters。但因为我们当时使用的是GitOps,所以我们能够在45分钟内恢复所有内容。

我们是怎么做到的?

因为我们的整个系统是用Kubernetes、Docker和Terraform声明性地描述的,所以我们的系统可以很容易地用Git进行版本控制。我们的整个系统,包括代码、配置、监控规则和它们的仪表板,都在Git提供的内置完整审计跟踪的源代码控制之下。

“有了我们的整个Git系统,当事情出错时,我们就有了单一的真相来源。”--编织公司工程师布莱恩·博勒姆(Bryan Boreham)

因此,当我们的所有服务器都出现故障时,我们能够重新应用我们在Git中的配置,并启动新服务器,安装软件,然后重新应用Kubernetes的所有清单。我们所有的吊舱都提供了最后一个已知的最佳状态,45分钟后,我们又开始运行了。因为每个git提交都是一个审计跟踪,所以它可以为您提供一种简单的方法来检查集群的“良好状态”。

有了Git中的真实源,我们也有一个在集群中运行的代理,它将正在运行的集群的状态与Git中的状态进行比较。例如,开发人员可以ssh到集群并更改某些内容,如果发生这种情况,集群将注意到更改,并发送警报,说明集群不再与Git中的内容匹配。

声明性基础设施

要保持在版本控制之下的是描述Kubernetes的YAML文件以及部署如何在其中运行。与将配置保存在数据库中相比,在Git中保持版本的YAML具有内置的审计跟踪功能,可以跟踪谁在何时做了什么。


用于配置的GitOps

由于您的所有清单文件都在Git中,因此您还需要一些东西来将这些文件与生产集群同步在一起。我们的开源产品Flux是可以用于这种类型的同步的代理。

实现持续部署的GitOps

要实现持续部署,您需要将镜像Repo(如Docker Hub)添加到您的构建管道中。此外,您可能需要持续集成,这样更改就可以从您的运行系统一直持续到映像存储库。每当映像存储库中出现新映像时,版本都会在部署清单中自动更新,然后签回Git。当这种情况发生时,真相的来源将不同于正在运行的集群,在那里可以进行自动更新。在我们的示例中,我们在部署到生产之前更新为Staging。


Weaveworks包括试运行和生产之间的审批流程。但是我们对两种环境都使用相同的配置存储库。不过,您可以在这里使用任何进程,但主要思想是对集群的更改是由Git提交驱动的。

点击此处观看这场有趣的演讲: