Load Balanced Vms è uno script per la creazione dell'infrastruttura che configura un cluster di VM e un bilanciatore del carico per esporre una route pubblica alle VM:
- Compute - VM - Compute Engine
 - Compute - Cluster - Managed Instance Group
 - Compute - Modello macchina - Modello istanza
 - Networking - Bilanciamento del carico - Cloud Load Balancing
 
Questa applicazione di esempio configura un semplice sito HTML statico utilizzando NGINX e il bilanciamento del carico all'interno del cluster.
Inizia
Fai clic sul seguente link per una copia del codice sorgente in Cloud Shell. Una volta lì, un singolo comando avvierà una copia funzionante dell'applicazione nel tuo progetto.
Visualizza il codice sorgente su GitHub
Componenti delle VM con bilanciamento del carico
L'architettura delle VM con bilanciamento del carico utilizza diversi prodotti. Di seguito sono elencati i componenti, insieme a ulteriori informazioni su di essi, inclusi link a video correlati, documentazione del prodotto e walkthrough interattivi.Script
Lo script di installazione utilizza un file eseguibile scritto in go e gli strumenti Terraform CLI per 
prendere un progetto vuoto e installarvi l'applicazione. L'output deve essere un'applicazione funzionante e un URL per l'indirizzo IP del bilanciamento del carico.
./main.tf
Attiva i servizi
I servizi Google Cloud sono disabilitati in un progetto per impostazione predefinita. Attiva i seguenti servizi obbligatori:
- Compute Engine: macchine virtuali e servizi di rete (come 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
}
Crea un'istanza modello su cui basare le VM gestite
Il comando seguente crea una VM, installa il software necessario e esegue il deployment del codice.
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]
}
Crea snapshot e immagine disco
Il comando seguente utilizza la VM per creare uno snapshot. Lo snapshot viene poi utilizzato per creare un'immagine disco. Tutte le VM del cluster si basano su questa immagine.
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]
}
Crea modello di istanza
Il seguente comando crea un modello con le impostazioni e la configurazione di tutte le VM del cluster. Utilizza l'immagine disco creata nel comando precedente.
Il comando include uno script di avvio che personalizza il codice HTML visualizzato dalle VM del cluster.
 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]
}
Crea gruppo di istanze gestite
Richiede il numero N di macchine del modello di istanza da gestire all'interno di questo gruppo.
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]
}
Crea indirizzo IP esterno
Occorre per associare un host al nome di dominio e per comunicare in generale su internet.
resource "google_compute_global_address" "default" {
    project    = var.project_id
    name       = "${var.basename}-ip"
    ip_version = "IPV4"
}
Crea bilanciatore del carico
Il seguente comando crea un bilanciatore del carico e implementa controlli di integrità e servizi di backend. Configura il bilanciatore del carico in modo che si connetta al gruppo di istanze.
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
}
Attivare HTTP
Il seguente comando configura le regole di rete che indirizzano la porta 80 sul bilanciatore del carico al servizio.
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
}
Conclusione
Al termine dell'esecuzione, dovresti avere un semplice sito web in esecuzione su più istanze Compute Engine, con un bilanciatore del carico davanti nel progetto. Inoltre, dovresti avere tutto il codice per modificare o estendere questa soluzione in base al tuo ambiente.