【问题标题】:Terraform and GCS : how to create a multi zone LBTerraform 和 GCS:如何创建多区域 LB
【发布时间】:2018-03-09 16:23:00
【问题描述】:

我想创建一个负载均衡器,用于处理 GCP 中同一区域的多个区域上的两个或多个实例

我是这样开始的: - 创建一个处理两个实例组的后端服务:

resource "google_compute_backend_service" "www-service" {
  name     = "${var.environment}-www-service"
  protocol = "HTTP"
  port_name   = "http"

  backend {
    group = "${google_compute_instance_group.instance-group-0.self_link}"
  }

  backend {
    group = "${google_compute_instance_group.instance-group-1.self_link}"
  }

  health_checks = ["${google_compute_health_check.health-check1.self_link}"]
}

然后我有两个实例组,每个实例组都有一个具有该语法的实例:

resource "google_compute_instance_group" "instance-group-0" {
  count        = "${var.web_count}"
  name = "${var.environment}-instance-group-0"

  instances = ["${google_compute_instance.www.self_link}"]

  named_port {
    name = "http"
    port = "80"
  }
  network = "${google_compute_network.platform-network.self_link}"
}

我收到一个错误:

google_compute_backend_service.www-service: Resource 'google_compute_instance_group.instance-group-0' not found for variable 'google_compute_instance_group.instance-group-0.self_link'

我看到在 backend_service 中切换 backend/group 声明会将错误移至 group-1,因此我可以猜测这不是正确的语法,尽管您可以在 Google GUI 中创建具有多个实例组的 ba​​ckend_service。

我有两个问题:

第一季度。如何使用多个实例组创建 backend_service? 什么是正确的语法?

第二季度。是否可以通过如下语法引用 compute_instance_group 中的 compute_instance:

instances = ["${google_compute_instance.www.[count.index].self_link}"]

(上面的语法不起作用)

【问题讨论】:

    标签: google-cloud-platform terraform


    【解决方案1】:

    感谢您的回答

    最后我找到了多个 Github 票证的语法:

    resource "google_compute_instance_group" "instance-group-0" {
      name = "${var.environment}-instance-group-0"
      zone = "${data.google_compute_zones.available.names[0]}" 
    
      instances = ["${slice(google_compute_instance.www.*.self_link, 0, floor(var.web_count/2)-1)}"]
    
      named_port {
        name = "http"
        port = "80"
      }
      network = "${google_compute_network.platform-network.self_link}"
    } 
    

    实例组 1 相同,但切片不同

    然后:

    resource "google_compute_instance" "www" {
      count        = "${var.web_count}"
      zone         =  "${data.google_compute_zones.available.names[floor((2*count.index)/var.web_count)]"}
    

    我必须说可以采取不同的设计决策: - 使用区域托管实例组更简单,除了模板是静态的 - 使用 Kubernetes

    【讨论】:

    • 对于 terraform 0.12 及更高版本:instances = slice(google_compute_instance.www.*.self_link, 0, floor(var.web_count/2)-1)
    • 如果我只想使用两个区域的实例作为后端,如 aws/azure 应用程序网关,我发现区域托管实例组很痛苦。您的解决方案更好更简单。我使用了“动态“后端”来使代码更具适应性dynamic "backend"{ for_each = [for s in google_compute_instance_group.gateway: { name = s.self_link }] content { group = backend.value.name } }
    【解决方案2】:

    A1 - 每个后端服务只能使用一个实例组。您需要为每个组创建一个新的后端。然后,您可以将多个后端分配给您的负载均衡器。

    另一方面,错误消息与您正在使用的资源类型有关。这是unmanaged Instance groups、Managed instance groups 和backend services 的资源页面。您可以找到不同compute APIs here 的列表。

    A2- 你应该使用 $(ref.name.selfLink) 代替,我相信这种语法应该有效,你仍然可以使用你的变量。另外,请确保更新 adding instances to the group 的 API 调用语法

    【讨论】:

      猜你喜欢
      • 2020-11-02
      • 2022-01-02
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 2021-07-11
      • 2021-12-13
      相关资源
      最近更新 更多