动态生成地形DSL

2024-09-30 05:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

用例:

我需要在我的集群上,在外部负载平衡器上注册所有类型为node port的Kubernetes服务,并且有一个外部负载平衡器的terraform提供程序,它接受服务和名称空间名称以及其他一些参数,并在池中注册服务,一旦池使用正确的服务和命名空间名称创建,然后负载平衡器会自动发现nodeports和node-ip,并随时更新池。目前,我必须手动编辑terraform代码来添加服务名称和其他内容,更新负载平衡器配置,为k8s服务创建池。在

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

地形文件中的示例记录:

   # 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>"
}

Tags: 文件代码name名称node进程service空间
1条回答
网友
1楼 · 发布于 2024-09-30 05:23:02

Terraform有几个钩子点可能对你有用。在

你所建议的整体方法可能会很好地发挥作用。HCL语法本身没有那么复杂,你可以直接写出来。Hashicorp的a Go library可以读写它。在

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

如果我必须这样做,我可能会得到一个地形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输出以不同的顺序返回服务对象,它可能需要关闭并交换哪个负载平衡器是哪个;或者,如果删除了某个负载平衡器,则可能会重新分配其他负载平衡器。)

“最正确”(但最难)的答案是向Kubernetes教授云负载平衡器。您可以实现一个标准(Go)k8s.io/cloud-provider接口,在Kubernetes主源代码树中有一个handful of providers。我想fake cloud provider是一个很好的起点。在

相关问题 更多 >

    热门问题