负载均衡虚拟机是一种基础架构构建脚本,用于设置虚拟机集群并配置负载平衡器,以向虚拟机公开公共路由:
- 计算 - 虚拟机 - Compute Engine
- 计算 - 集群 - 代管式实例组
- 计算 - 机器模板 - 实例模板
- 网络 - 负载均衡 - Cloud Load Balancer
此示例应用使用 NGINX 设置一个简单的静态 HTML 网站,并在整个集群范围内进行负载均衡。
开始使用
点击以下链接即可转到 Cloud Shell 中的源代码副本。之后,只需一个命令即可在项目中启动应用的工作副本。
负载均衡虚拟机组件
负载均衡虚拟机架构使用了多种产品。下面列出了组件以及组件的详细信息,包括相关视频链接、产品文档和互动式演示。脚本
安装脚本使用 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 实例上运行的简单网站,并具有项目中的负载均衡器。此外,您还应具备修改或扩展此解决方案以适应您的环境的所有代码。