„Load Balancingd Vms“ ist ein Infrastrukturerstellungsskript, das einen Cluster von VMs einrichtet und einen Load-Balancer konfiguriert, um eine öffentliche Route zu den VMs freizugeben:
- Compute – VMs – Compute Engine
- Compute – Cluster – verwaltete Instanzgruppe
- Compute – Maschinenvorlage – Instanzvorlage
- Netzwerk – Load-Balancing – Cloud-Load-Balancer
In dieser Beispielanwendung wird mit NGINX eine einfache statische HTML-Website eingerichtet. Außerdem erfolgt das Load-Balancing im gesamten Cluster.
Jetzt starten
Klicken Sie auf den folgenden Link, um eine Kopie des Quellcodes in Cloud Shell zu erhalten. Dort wird mit einem einzigen Befehl eine funktionierende Kopie der Anwendung in Ihrem Projekt erstellt.
Komponenten für Load-Balancing für VPCs
In der Load-Balancing-VMS-Architektur werden mehrere Produkte verwendet. Im Folgenden finden Sie eine Liste der Komponenten sowie weitere Informationen zu den Komponenten, einschließlich Links zu ähnlichen Videos, Produktdokumentationen und interaktiven Schritt-für-Schritt-Anleitungen.Skripts
Das Installationsskript verwendet eine ausführbare Datei, die in den go
- und Terraform-Befehlszeilentools geschrieben wurde, um ein leeres Projekt zu erstellen und die Anwendung darin zu installieren. Die Ausgabe sollte eine funktionierende Anwendung und eine URL für die IP-Adresse des Load-Balancings sein.
./main.tf
Dienste aktivieren
Google Cloud-Dienste sind in einem Projekt standardmäßig deaktiviert. Aktivieren Sie die folgenden erforderlichen Dienste:
- Compute Engine – virtuelle Maschinen und Netzwerkdienste wie Load-Balancer
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
}
Instanzbeispiel für verwaltete VMs erstellen
Mit dem folgenden Befehl wird eine VM erstellt, die erforderliche Software darauf installiert und Code bereitgestellt.
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]
}
Snapshot und Laufwerk-Image erstellen
Mit dem folgenden Befehl wird die VM zum Erstellen eines Snapshots verwendet. Der Snapshot wird dann verwendet, um ein Laufwerk-Image zu erstellen. Alle VMs im Cluster basieren auf diesem Image.
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]
}
Instanzvorlage erstellen
Mit dem folgenden Befehl wird eine Vorlage mit den Einstellungen und der Konfiguration für alle VMs im Cluster erstellt. Dabei wird das im vorherigen Befehl erstellte Laufwerk-Image verwendet.
Der Befehl enthält ein Startskript, mit dem der HTML-Code angepasst wird, der von den VMs im Cluster bereitgestellt wird.
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]
}
Verwaltete Instanzgruppe erstellen
Fordert n Maschinen der Instanzvorlage an, die als Teil dieser Gruppe verwaltet werden sollen.
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]
}
Externe IP-Adresse erstellen
erforderlich, um einen Host an den Domainnamen zu binden und im Allgemeinen im Internet zu kommunizieren.
resource "google_compute_global_address" "default" {
project = var.project_id
name = "${var.basename}-ip"
ip_version = "IPV4"
}
Load-Balancer erstellen
Mit dem folgenden Befehl erstellen Sie einen Load-Balancer und implementieren Systemdiagnosen und Back-End-Dienste. Er konfiguriert den Load-Balancer so, dass er eine Verbindung zur Instanzgruppe herstellt.
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 aktivieren
Der folgende Befehl konfiguriert Netzwerkregeln, die Port 80 auf dem Load-Balancer auf den Dienst verweisen.
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
}
Fazit
Nach der Ausführung sollten Sie jetzt eine einfache Website haben, die auf mehreren Compute Engine-Instanzen mit einem Load-Balancer in Ihrem Projekt ausgeführt wird. Außerdem sollten Sie den gesamten Code haben, um diese Lösung zu ändern oder an Ihre Umgebung anzupassen.