负载均衡的虚拟机

架构

Load Balanced Vms 是一个基础架构构建脚本,用于设置 并配置负载平衡器,以向虚拟机公开公共路由:

  • 计算 - 虚拟机 - Compute Engine
  • 计算 - 集群 - 代管式实例组
  • 计算 - 机器模板 - 实例模板
  • 网络 - 负载均衡 - Cloud 负载平衡器

此示例应用使用 NGINX 设置一个简单的静态 HTML 网站,并且 负载均衡 集群


开始使用

点击以下链接,在 Cloud Shell 中查看源代码的副本。进入该环境后,只需一个命令即可在项目中启动应用的工作副本。

在 Cloud Shell 中打开

在 GitHub 上查看源代码


负载均衡的 VM 组件

负载均衡的虚拟机架构使用了多种产品。 下面列出了这些组件,以及有关 包括指向相关视频、产品文档和 互动演示。
视频 文档 演示
Compute Engine Compute Engine 是 Google Cloud 的虚拟化技术。借助它,您可以启动许多不同配置的虚拟机,以满足您各种计算需求。
Cloud Load Balancing 利用 Google Cloud 负载均衡器,您可以在存储分区前面放置一个负载均衡器,以便使用 SSL 证书、Logging 和 Monitoring。

脚本

安装脚本使用使用 go 和 Terraform CLI 工具编写的可执行文件,获取一个空项目并在其中安装应用。输出应为 以及负载均衡 IP 地址的网址。

./main.tf

启用服务

默认情况下,Google Cloud 服务在项目中处于停用状态。 激活以下必需服务:

  • Compute Engine - 虚拟机和网络服务(例如负载均衡器)
variable "gcp_service_list" {
  description = "The list of apis necessary for the project"
  type        = list(string)
  default = [
      "compute.googleapis.com",
  ]
}

resource "google_project_service" "all" {
  for_each                   = toset(var.gcp_service_list)
  project                    = var.project_number
  service                    = each.key
  disable_dependent_services = false
  disable_on_destroy         = false
}

创建托管虚拟机所依据的实例示例

以下命令会创建一个虚拟机,在该虚拟机上安装所需的软件并部署代码。

resource "google_compute_instance" "exemplar" {
    name         = "${var.basename}-exemplar"
    machine_type = "n1-standard-1"
    zone         = var.zone
    project      = var.project_id

    tags                    = ["http-server"]
    metadata_startup_script = "apt-get update -y \n apt-get install nginx -y \n  printf '${data.local_file.index.content}'  | tee /var/www/html/index.html \n chgrp root /var/www/html/index.html \n chown root /var/www/html/index.html \n chmod +r /var/www/html/index.html"

    boot_disk {
        auto_delete = true
        device_name = "${var.basename}-exemplar"
        initialize_params {
        image = "family/debian-10"
        size  = 200
        type  = "pd-standard"
        }
    }

    network_interface {
        network = "default"
        access_config {
        // Ephemeral public IP
        }
    }

    depends_on = [google_project_service.all]
}

创建快照和磁盘映像

以下命令使用虚拟机创建快照。该快照随后用于创建磁盘映像。 集群中的所有虚拟机都基于此映像。

resource "google_compute_snapshot" "snapshot" {
    project           = var.project_id
    name              = "${var.basename}-snapshot"
    source_disk       = google_compute_instance.exemplar.boot_disk[0].source
    zone              = var.zone
    storage_locations = ["${var.region}"]
    depends_on        = [time_sleep.startup_completion]
}

resource "google_compute_image" "exemplar" {
    project         = var.project_id
    name            = "${var.basename}-latest"
    family          = var.basename
    source_snapshot = google_compute_snapshot.snapshot.self_link
    depends_on      = [google_compute_snapshot.snapshot]
}

创建实例模板

以下命令会创建一个模板,其中包含集群中所有虚拟机的设置和配置。它使用上一个命令中创建的磁盘映像。

该命令包含一个启动脚本,用于自定义集群中虚拟机提供的 HTML。

 resource "google_compute_instance_template" "default" {
    project     = var.project_id
    name        = "${var.basename}-template"
    description = "This template is used to create app server instances."
    tags        = ["httpserver"]

    metadata_startup_script = "sed -i.bak \"s/\{\{NODENAME\}\}/$HOSTNAME/\" /var/www/html/index.html"

    instance_description = "BasicLB node"
    machine_type         = "n1-standard-1"
    can_ip_forward       = false

    // Create a new boot disk from an image
    disk {
        source_image = google_compute_image.exemplar.self_link
        auto_delete  = true
        boot         = true
    }

    network_interface {
        network = "default"
    }

    depends_on = [google_compute_image.exemplar]
}

创建代管式实例组

请求将该实例模板的 N 个机器作为此群组的一部分进行管理。

resource "google_compute_instance_group_manager" "default" {
    project            = var.project_id
    name               = "${var.basename}-mig"
    zone               = var.zone
    target_size        = var.nodes
    base_instance_name = "${var.basename}-mig"


    version {
        instance_template = google_compute_instance_template.default.id
    }

    named_port {
        name = "http"
        port = "80"
    }

    depends_on = [google_compute_instance_template.default]
}

创建外部 IP 地址

需要将主机绑定到域名,并在互联网上进行常规通信。

resource "google_compute_global_address" "default" {
    project    = var.project_id
    name       = "${var.basename}-ip"
    ip_version = "IPV4"
}

创建负载均衡器

以下命令会创建负载均衡器并实现健康检查和后端服务。 它会配置负载均衡器以连接到实例组。

resource "google_compute_health_check" "http" {
    project = var.project_id
    name    = "${var.basename}-health-chk"

    tcp_health_check {
        port = "80"
    }
}

resource "google_compute_firewall" "allow-health-check" {
    project       = var.project_id
    name          = "allow-health-check"
    network       = local.defaultnetwork
    source_ranges = ["130.211.0.0/22", "35.191.0.0/16"]

    allow {
        protocol = "tcp"
        ports    = ["80"]
    }
}

resource "google_compute_backend_service" "default" {
    project               = var.project_id
    name                  = "${var.basename}-service"
    load_balancing_scheme = "EXTERNAL"
    protocol              = "HTTP"
    port_name             = "http"
    backend {
        group = google_compute_instance_group_manager.default.instance_group
    }

    health_checks = [google_compute_health_check.http.id]
    }

    resource "google_compute_url_map" "lb" {
    project         = var.project_id
    name            = "${var.basename}-lb"
    default_service = google_compute_backend_service.default.id
}

启用 HTTP

以下命令配置将端口 80 指向负载均衡器上的网络规则 。

resource "google_compute_target_http_proxy" "default" {
    project = var.project_id
    name    = "${var.basename}-lb-proxy"
    url_map = google_compute_url_map.lb.id
}

resource "google_compute_forwarding_rule" "google_compute_forwarding_rule" {
    project               = var.project_id
    name                  = "${var.basename}-http-lb-forwarding-rule"
    provider              = google-beta
    region                = "none"
    load_balancing_scheme = "EXTERNAL"
    port_range            = "80"
    target                = google_compute_target_http_proxy.default.id
    ip_address            = google_compute_global_address.default.id
}

总结

运行后,您现在应该有一个在多个 Compute Engine 实例上运行的简单网站,该网站由项目中的负载均衡器提供前端服务。此外,您应该拥有修改或扩展此解决方案以适应您环境的所有代码。