你能在Terraform中使用YAML定义Kubernetes服务/Pods吗



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

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

是否可以将pod定义为YAML,并将其与kubernetes_podkubernetes_service资源一起用作模板?

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

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

不幸的是,这不太可能奏效,因为关键字可能与Terraform的预期不同,所以您需要编写一些东西来将输入的YAML转换为Terraform资源JSON。在这一点上,如果你打算保留Terraform配置,而不是一次转换和应用配置,那么在转换中添加HCL输出可能是值得的,这样你输出的Terraform配置就更可读了。

这样做的好处是,您有一个可重复使用的Kubernetes配置,可以使用kubectl或其他工具运行,但它提供了Terraform生命周期管理的功能,能够计划更改并与基础设施的非Kubernete部分集成(例如设置运行Kubernets集群的实例)。

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

hashicorp/kubernetes提供程序不支持原始的YAML/JSON,他们也无意实现它。

可能的解决方案有:

  • K2tf,一个用于将Kubernetes RAW YAML清单转换为用于Kubernete提供商的Terraform HCL的工具
  • 使用另一个社区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资源,如manifest属性中所述。manifest值是常规Kubernetes YAML manifest的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]发送到CreateAPI,然后你回来[a,b,c,d]。例如pod会自动附加一些秘密卷,但会发生和大多数其他资源我有机会玩。这个白名单/黑名单是一个棘手的部分。

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

https://github.com/sl1pm4t/k2tf

描述:

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

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

最新更新