Load Balanced VMs

Architektur

„Load Balanced Vms“ ist ein Skript zum Erstellen einer Infrastruktur, mit dem ein Cluster von VMs eingerichtet und ein Load Balancer konfiguriert wird, um eine öffentliche Route für die VMs bereitzustellen:

  • Compute – 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 der Cluster wird ausgelastet.


Jetzt starten

Klicken Sie auf den folgenden Link, um eine Kopie des Quellcodes in Cloud Shell aufzurufen. Dort können Sie mit einem einzigen Befehl eine funktionierende Kopie der Anwendung in Ihrem Projekt erstellen.

In Cloud Shell öffnen

Quellcode auf GitHub ansehen


Komponenten für VMs 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.
Video Docs Schritt-für-Schritt-Anleitungen
Compute Engine Die Compute Engine ist die virtuelle Technologie von Google Cloud. Damit können Sie viele verschiedene VM-Konfigurationen erstellen, die Ihren Rechenanforderungen entsprechen.
Cloud Load Balancing Mit dem Google Cloud Load Balancer können Sie einen Load Balancer vor den Speicher-Bucket platzieren und so SSL-Zertifikate, Logging und Monitoring verwenden.

Skripts

Das Installationsskript verwendet eine in go geschriebene ausführbare Datei und Terraform-Befehlszeilentools, um eine leere Anwendung zu erstellen und darin die Anwendung zu installieren. Die Ausgabe sollte eine funktionierende Anwendung und eine URL für die Load Balancing-IP-Adresse 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 (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 basieren sollen

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 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

Hiermit wird angefordert, dass N Maschinen der Instanzvorlage als Teil dieser Gruppe verwaltet werden.

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 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

Mit dem folgenden Befehl werden Netzwerkregeln konfiguriert, die Port 80 des Load Balancers 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 nun eine einfache Website auf mehreren Compute Engine-Instanzen haben, 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.