代码之家  ›  专栏  ›  技术社区  ›  Ijaz Ahmad

动态生成地形DSL

  •  0
  • Ijaz Ahmad  · 技术社区  · 7 年前

    用例:

    我需要在我的集群、外部负载平衡器上注册node port类型的所有Kubernetes服务,并且该外部负载平衡器有一个terraform提供程序,它接受服务和名称空间名称以及其他一些参数,并在池上注册服务,一旦使用正确的服务和名称空间名称创建了池,然后负载平衡器会自动发现节点报告和节点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>"
    }
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   David Maze    7 年前

    你建议的整体方法可能会很好。HCL语法本身并不复杂,你可以直接写出来。Hashicorp公司 a Go library 能读能写的。

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

    如果我必须这样做,我可能会伸手去拿一个地形 external data source

    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 可以实现的接口,以及 handful of providers 在主Kubernetes源树中。我猜 fake cloud provider 是一个很好的起点。

    推荐文章