Load Balanced Vms 是一个基础架构构建脚本,用于设置 并配置负载平衡器,以向虚拟机公开公共路由:
- 计算 - 虚拟机 - Compute Engine
- 计算 - 集群 - 代管式实例组
- 计算 - 机器模板 - 实例模板
- 网络 - 负载均衡 - Cloud 负载平衡器
此示例应用使用 NGINX 设置一个简单的静态 HTML 网站,并且 负载均衡 集群
开始使用
点击以下链接,在 Cloud Shell 中查看源代码的副本。进入该环境后,只需一个命令即可在项目中启动应用的工作副本。
负载均衡的 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 实例上运行的简单网站,该网站由项目中的负载均衡器提供前端服务。此外,您应该拥有修改或扩展此解决方案以适应您环境的所有代码。