动态生成Terraform DSL

时间:2018-10-28 00:28:36

标签: python kubernetes terraform

是否有一些python / go库从JSON文件生成Terraform代码,或者是否有任何模板语言来生成terraform代码。

用例:

我需要在集群上的外部负载均衡器上注册所有类型为节点端口的Kubernetes服务,并且该外部负载均衡器有一个terraform提供程序,该提供程序使用服务和名称空间名称以及一些其他参数来注册该服务在池上,使用正确的service和名称空间名称创建池后,负载均衡器会自动发现节点端口和节点IP,并始终保持池更新。当前,我必须手动编辑terraform代码以添加服务名称和其他内容,以更新负载均衡器配置以创建k8s服务池。

一旦我弄清楚了如何从给定的集群状态生成/更新terraform文件,我会将这个过程作为集群守护程序放置在pod中,它将每隔X个间隔运行一次脚本,以便更新负载均衡器当用户创建和删除k8s服务时。

terraform文件中的示例记录:

   # Pool automatically populated by K8s Service Discovery
resource "vtm_pool" "<cluster name>_<k8s namsepace>_<k8s service name>" {
  name                          = ""<cluster name>_<k8s namsepace>_<service name>""
  monitors                      = ["Ping"]
  service_discovery_enabled     = "true"
  service_discovery_interval    = "15"
  service_discovery_plugin      = "${var.k8s_discovery_plugin}"
  service_discovery_plugin_args = "-s <k8s service name > -n <k8s namsepace> -c <kubeconf file name>"
}

1 个答案:

答案 0 :(得分:2)

Terraform有几个挂钩点可能对您有用。

您建议的总体方法可能会很好。 HCL语法本身并不复杂,您可以将其写出来。 Hashicorp有a Go library可以读写的文件。

Terraform也directly supports JSON input。该语法更难手写,但可能更易于机器生成。 HCL语法如何转换为JSON有一些微妙之处,可能值得阅读整个页面(甚至是HCL部分),但这可能是最容易机器生成的。

如果必须这样做,我可能会寻求Terraform external data source。那可以运行任何产生JSON输出的程序,但是一旦有了它,它就会在Terraform空间中“本地”运行。您可以编写类似(未经测试)的内容:

data "external" "services" {
  program = ["kubectl", "get", "service",
             "-o", "json",
             "--field-selector", "spec.type==LoadBalancer"]
}
resource "vtm_pool" "k8s_services" {
  count = "${length(data.external.services.result)}"
  name = "${data.external.services.*.metadata.name[count.index]}"
}

(过去,我很难解决Terraform可以固定在特定索引上的问题,因此,如果您执行类似操作,并且kubectl输出以不同的顺序返回Service对象,则可能想离开并交换哪个负载均衡器;或者如果删除某些负载均衡器,则可能会重新分配其他所有负载均衡器。)

“最正确”(但最困难)的答案是教Kubernetes有关您的云负载均衡器的知识。您可以实现一个标准(Go)k8s.io/cloud-provider接口,而在Kubernetes源树的主树中则有一个handful of providers。我猜想fake cloud provider和其他任何一个起点一样好。