我正在使用Kubernetes Provider来描述Terraform中的服务/pod。
使用Hashicorp配置语言来定义kubernetes_pod或kubernetes_service资源可能会让人感到困惑,因为kubernetes文档描述了YAML中的所有内容,这意味着你需要将其翻译成HCL。
是否可以将pod定义为YAML,并将其与kubernetes_pod
和kubernetes_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