您可以在 Terraform 中使用 YAML 定义 Kubernetes Services / Pods 吗?

Can you define Kubernetes Services / Pods using YAML in Terraform?

我正在使用 Kubernetes Provider 在 Terraform 中描述 services/pods。

使用 Hashicorp 配置语言定义 kubernetes_pod or kubernetes_service 资源可能会造成混淆,因为 Kubernetes 文档描述了 YAML 中的所有内容,这意味着您需要将其转换为 HCL。

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

虽然 Terraform 通常使用 HCL,但这是 JSON 的超集(很像 YAML 本身)所以 can also read JSON.

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

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

以这种方式做事的好处是你有一个可重用的 Kubernetes 配置,它可以 运行 使用 kubectl 或其他工具,但赋予你 Terraform 生命周期管理的力量,能够计划更改和与基础架构的非 Kubernetes 部分集成(例如将实例设置为 运行 Kubernetes 集群)。

我用得不多,但我相信 Kops 可以让你在典型的 Kubernetes YAML 文件中保留 pod/service 配置,然后可以使用 Terraform 来管理配置,甚至允许你输出 Terraform 配置,这样您就可以 运行 它在 Kops 本身之外。

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

https://github.com/sl1pm4t/k2tf

描述:

A tool for converting Kubernetes API Objects (in YAML format) into HashiCorp's Terraform configuration language.

The converted .tf files are suitable for use with the Terraform Kubernetes Provider

hashicorp/kubernetes 提供商不支持原始 YAML/JSON,他们无意实施它。

可能的解决方案是:

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

使用 kubectl 提供商。

此提供程序的核心是 kubectl_manifest 资源,允许针对 Kubernetes 处理和应用自由格式的 yaml。然后跟踪这个 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?

Supporting YAML/JSON in hashicorp/kubernetes was considered before (the very first proposal of K8S provider was exactly that) and during the initial implementation of this provider and we decided not to do it.

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

From Terraform's developer perspective it is very tricky to get around the way K8S API works where you send an array [a, b, c] to the Create API and then you Get back [a, b, c, d]. This happens for example with pods that get some secret volumes attached automatically, but happens with most other resources I had the chance to play with. The whitelisting/blacklisting is tricky part.