VMS mit Load-Balancing ist ein Skript zum Aufbau der Infrastruktur, das ein Cluster VMs ausführen und einen Load-Balancer konfigurieren, um eine öffentliche Route zu den VMs verfügbar zu machen:
- Computing – VMs – Compute Engine
- Compute – Cluster – Verwaltete Instanzgruppe
- Compute – Maschinenvorlage – Instanzvorlage
- Netzwerk – Load-Balancing – Cloud-Load-Balancer
In dieser Beispielanwendung wird eine einfache statische HTML-Website mit NGINX eingerichtet und über Ihren Cluster verteilt.
Jetzt starten
Klicken Sie auf den folgenden Link, um den Quellcode in Cloud Shell zu kopieren. Einmal können Sie mit einem einzigen Befehl eine Arbeitskopie der Anwendung in Ihrem Projekt...
VM-Komponenten mit Load-Balancing
Die Architektur mit Load Balanced VMs nutzt mehrere Produkte. 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 go
geschrieben ist, und die Terraform-Befehlszeilentools, um
ein leeres Projekt zur Installation
der darin enthaltenen Anwendung. Die Ausgabe sollte eine
eine funktionierende Anwendung und eine URL
für die Load-Balancing-IP-Adresse.
./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 (z. B. 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 erstellen, auf dem verwaltete VMs als Basis dienen sollen
Mit dem folgenden Befehl wird eine VM erstellt, auf der die erforderliche Software installiert und der Code bereitgestellt wird.
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 mit der VM ein Snapshot erstellt. 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 die HTML-Seite angepasst wird, die 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 Anzahl von 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
Er ist erforderlich, um einen Host an den Domainnamen zu binden und allgemein 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 wird ein Load Balancer erstellt und Systemdiagnosen und Back-End-Dienste implementiert. Der Load-Balancer wird so konfiguriert, dass eine Verbindung zur Instanzgruppe hergestellt wird.
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
Mit dem folgenden Befehl werden Netzwerkregeln konfiguriert, die auf Port 80 auf den Load-Balancer verweisen. für den Dienst.
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 sollte nun eine einfache Website auf mehreren Compute Engine-Instanzen ausgeführt werden, die von einem Load Balancer in Ihrem Projekt verwaltet wird. Außerdem sollten Sie den gesamten Code haben, um diese Lösung an Ihre Umgebung anzupassen oder zu erweitern.