负载均衡虚拟机

架构

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

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

此示例应用使用 NGINX 设置一个简单的静态 HTML 网站,并在整个集群范围内进行负载均衡。


开始使用

点击以下链接即可转到 Cloud Shell 中的源代码副本。之后,只需一个命令即可在项目中启动应用的工作副本。

在 Cloud Shell 中打开

查看 GitHub 上的源代码


负载均衡虚拟机组件

负载均衡虚拟机架构使用了多种产品。下面列出了组件以及组件的详细信息,包括相关视频链接、产品文档和互动式演示。
视频 文档 演示
Compute Engine Compute Engine 是 Google Cloud 的虚拟技术。借助 Cloud Spanner,您可以启动许多不同的虚拟机配置,以适应您的任何计算需求。
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 实例上运行的简单网站,并具有项目中的负载均衡器。此外,您还应具备修改或扩展此解决方案以适应您的环境的所有代码。