4

我正在使用Kubernetes Provider来描述 Terraform 中的服务/pod。

使用 Hashicorp 配置语言定义kubernetes_podkubernetes_service资源可能会让人感到困惑,因为 Kubernetes 文档描述了 YAML 中的所有内容,这意味着您需要将其翻译成 HCL。

是否可以将 pod 定义为 YAML 并将它们与kubernetes_pod资源一起kubernetes_service用作模板?

4

3 回答 3

3

虽然 Terraform 通常使用 HCL,但这是 JSON 的超集(很像 YAML 本身),因此也可以读取 JSON

一种可能的选择是采用您已有的 YAML 示例并将它们转换为 JSON,然后在这些示例上使用 Terraform。

不幸的是,这不太可能奏效,因为关键字可能与 Terraform 的预期方式不同,因此您需要编写一些东西来将输入 YAML 基本转换为 Terraform 资源 JSON。此时,将 HCL 输出添加到转换中可能是值得的,这样如果您打算保留 Terraform 配置而不是一次性转换和应用配置,则输出的 Terraform 配置更具可读性。

以这种方式做事的好处是您拥有一个可重用的 Kubernetes 配置,可以使用kubectl或其他工具运行,但为您提供 Terraform 生命周期管理的功能,能够计划更改并与基础架构的非 Kubernetes 部分集成(例如就像设置实例来运行 Kubernetes 集群一样)。

我用的不多,但我相信Kops将允许您将 pod/service 配置保留在典型的 Kubernetes YAML 文件中,然后可以使用 Terraform 来管理配置,甚至允许您输出 Terraform 配置,以便您可以在外部运行它科普斯本身。

于 2017-11-11T09:48:37.427 回答
2

提供hashicorp/kubernetes者不支持原始 YAML/JSON,并且他们无意实现它。

可能的解决方案是:

  • K2tf,一种用于将 Kubernetes RAW YAML 清单转换为Kubernetes 提供商的 Terraform HCL 的工具。
  • 使用替代社区 Kubernetes 提供程序,例如gavinbunny/kubectl,它确实支持原始 YAML 并且可以跟踪 Terraform 状态下的每个资源和属性,这与 kubernetes-alpha 提供程序不同。
  • 另一种解决方案是使用hashcorp/kubernetes-alpha提供程序,您可以传入 Terraform 对象或将原始 YAML 清单转换为 TF 对象以在提供程序资源中使用。缺点是属性不会作为单个对象进行跟踪,因此更改将导致整个资源受到污染。

使用kubectl提供程序。

该提供程序的核心是kubectl_manifest资源,允许处理自由格式的 yaml 并将其应用于 Kubernetes。然后跟踪此 yaml 对象并无缝处理创建、更新和删除 - 包括漂移检测。如果您想在 Terraform 中跟踪清单,此提供程序是理想的:

resource "kubectl_manifest" "test" {
    yaml_body = file("path/to/manifest.yaml")
}

使用kubernetes-alpha提供程序

kubernetes_manifest代表清单属性中描述的一个 Kubernetes 资源。清单值是常规 Kubernetes YAML 清单的 HCL 转录。要将现有清单从 YAML 转录到 HCL,请使用 Terrafrom 内置函数yamldecode(),或使用tfk8s工具将 YAML 转换为 kubernetes-alpha 提供程序清单资源的清单属性。

使用示例yamldecode

resource "kubernetes_manifest" "service" {
  provider = kubernetes-alpha

  manifest = yamldecode(file("path/to/manifest.yaml"))
}

为什么 kubernetes 提供者不支持 RAW YAML?

hashicorp/kubernetes 之前考虑过支持 YAML/JSON (K8S 提供者的第一个提议正是如此),并且在该提供者的初始实施期间,我们决定不这样做。

原因是您无法准确跟踪从 RAW YAML 创建的资源作为 Terraform 对象。

从 Terraform 的开发人员的角度来看,要绕过 K8S API 的工作方式非常棘手,您将数组 [a, b, c] 发送到 Create API,然后返回 [a, b, c, d]。例如,自动附加一些秘密卷的 pod 会发生这种情况,但我有机会使用的大多数其他资源都会发生这种情况。白名单/黑名单是棘手的部分。

于 2021-04-21T22:14:14.680 回答
1

您可能还对以下项目感兴趣,该项目允许您将 YAML 文件转换为 Terraform 的 HCL。

https://github.com/sl1pm4t/k2tf

描述:

将 Kubernetes API 对象(YAML 格式)转换为 HashiCorp 的 Terraform 配置语言的工具。

转换后的 .tf 文件适用于Terraform Kubernetes Provider

于 2019-11-13T00:09:23.763 回答