以 GitOps 方式管理 Terraform 资源

2022-11-28 16:20:31 浏览数 (1)

作者:priyanka-ravi & dholbach

这是我们希望揭示Flux 生态系统[1]项目的博文系列中的第一篇。这次是Terraform 控制器[2]

如果你使用 Terraform,你可能会认为它是“代码即基础设施(IaC,Infrastructure as Code)”,并与 GitOps 的概念相分离。我们经常看到关于“IaC vs. GitOps”的争论。Terraform 控制器调和了这两个世界,并让你在现有 Terraform 的资源获得 GitOps 的优势:一个真实的来源,一个面板和其中的漂移检测。

到目前为止,你可能已经求助于使用流水线或手动部署。在这篇博文中,我们将展示如何以 GitOps 的方式,管理你的 Terraform 资源。不需要转换你的代码!

Terraform 控制器是什么?

Terraform 控制器是一个Flux[3]控制器,可以管理你的 Terraform 资源。虽然 Flux 运行在 Kubernetes 上,但是无论你使用 Terraform 做什么,Flux 控制器都可以管理它。它有几个功能,包括手动批准或自动批准 Terraform 计划的能力,Terraform 的输出可以设置为 Kubernetes 的秘密。它还集成了 Terraform 云和 Terraform Enterprise。

使用 Terraform 控制器的好处是,你可以利用现有 Terraform 资源获得 GitOps 的好处。有 Terraform 资源的漂移检测,它可以用作 Terraform 资源和 Kubernetes 工作负载的粘合剂。

Terraform 控制器非常通用,因为它提供不同的操作模式和许多功能,为你提供所需的集成点和控制。它主要支持以下用例:

  • GitOps 自动化模型:在这里,你可以从创建步骤到实施步骤 GitOps 你的 Terraform 资源,例如整个 EKS 集群。
  • 混合 GitOps 自动化模型:在这里,你可以 GitOps 现有基础设施资源的一部分。例如,你有一个现有的 EKS 集群。你可以选择只 GitOps 其节点组或其安全组。

在此基础上,如果你有一个 TFSTATE 文件,就可以利用这些功能:

  • 状态执行:使用 GitOps 来执行它,不改变其他任何东西。
  • 漂移检测:使用 GitOps 只是为了进行漂移检测,这样当发生漂移时,你可以决定以后要做的事情。

此外,特性[4]还包括多租户、计划和手动批准,以及路线图[5]上的更多功能。

现在让我们继续讨论如何实际集成它!

GitOps 你的 Terraform

先决条件

显然,你需要安装 Kubernetes 集群和 Flux。Terraform 控制器至少需要 Flux 0.32,而 Flux 0.32 又至少需要 Kubernetes 版本 1.20.6。使用 flux install 或 flux bootstrap,如flux 文档[6]中所述。

安装

现在你需要安装 Terraform 控制器。有很多方法可以做到这一点,查看安装文档[7]了解更多信息。

一个非常简单的方法是将这个HelmRelease[8]添加到你的 bootstrap 库。

结合你的 Terraform 资源

这就是 Terraform 控制器的全部魅力所在——它为你完成所有艰苦的工作。你需要做的就是:

  1. 定义你的 Terraform 资源的来源
  2. 启用 GitOps 自动化

定义来源

让我们继续,这里我们定义一个源控制器的来源(你可以选择 GitRepository,Bucket,OCIRepository 中的任何一个)。GitRepository 条目可能如下所示:

代码语言:javascript复制
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: GitRepository
metadata:
  name: helloworld
  namespace: flux-system
spec:
  interval: 30s
  url: https://github.com/tf-controller/helloworld
  ref:
    branch: main

GitOps 自动化模式

可以通过设置.spec.approvePlan=auto 来启用 GitOps 自动化模式。在这种模式下,Terraform 资源将被规划,并自动应用。这是一个简单的例子,你可以复制粘贴。

代码语言:javascript复制
apiVersion: infra.contrib.fluxcd.io/v1alpha1
kind: Terraform
metadata:
  name: helloworld
  namespace: flux-system
spec:
  interval: 1m
  approvePlan: "auto"
  path: ./
  sourceRef:
    kind: GitRepository
    name: helloworld
    namespace: flux-system

注意:如果你有一个 kustomization.yaml 文件(在基本的 flux bootstrap 用例中就是这种情况),请确保将上述清单部分所在的文件添加到资源列表中。

一旦你将它提交给 Git,你应该会看到 Terraform 控制器很快就完成了这项工作。一种确认方式是:

代码语言:javascript复制
kubectl -n flux-system get terraforms.infra.contrib.fluxcd.io

NAME READY STATUS AGE

helloworld True No drift:
main/d9c5cc348e555526ea563fb82fc901e37de4d732 1m

很简单,不是吗?

还有什么?

Terraform 控制器团队一直在努力工作,并确保许多常见用例[9]得到支持。上面我们介绍了自动化模式,一些团队可能想要更多的控制,所以也有一个“计划和手动应用”模式。你也可以将其配置为只进行“漂移检测”。

此外,你可以禁用漂移检测,将其与 AWS EKS IRSA 一起使用,与 Terraform 交互(设置变量,管理 terraform 状态),还有健康检查和许多其他灵活性。OCI 的粉丝会喜欢听到它支持 OCI 工件作为来源。

它还集成了 Terraform 云和 Terraform Enterprise[10]

在过去的几周里,Terraform 控制器的性能也得到了显著提高。现在,控制器具有很大的可扩展性,可以同时协调和创建大量的 Terraform 模块。该团队最近用 1500 个 Terraform 模块测试了控制器。

在最新版本(v0.12.0)中,新特性包括:自定义后端支持、与 Flux 通知控制器的互操作性,以及支持 ConfigMap 中人类可读的计划输出。

接下来还有更多,请查看该团队的路线图。当你检查它的时候,也请给反馈。如果你错过了什么,如果你喜欢它,如果你想有所贡献——团队渴望听到你的声音。

参考资料

[1]

Flux 生态系统: https://fluxcd.io/ecosystem/

[2]

Terraform 控制器: https://github.com/weaveworks/tf-controller

[3]

Flux: http://fluxcd.io/

[4]

特性: https://weaveworks.github.io/tf-controller/#features

[5]

路线图: https://github.com/weaveworks/tf-controller#roadmap

[6]

flux 文档: https://fluxcd.io/flux/get-started/

[7]

安装文档: https://weaveworks.github.io/tf-controller/getting_started/#installation

[8]

HelmRelease: https://raw.githubusercontent.com/weaveworks/tf-controller/main/docs/release.yaml

[9]

常见用例: https://weaveworks.github.io/tf-controller/use_cases/

[10]

集成了 Terraform 云和 Terraform Enterprise: https://weaveworks.github.io/tf-controller/tfe_integration/

0 人点赞