VM con bilanciamento del carico

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Architettura

Il VM con bilanciamento del carico è uno script di creazione dell'infrastruttura che imposta un cluster di VM e configura un bilanciatore del carico per esporre una route pubblica alle VM:

  • Compute - VM - Compute Engine
  • Compute - Cluster - Gruppo di istanze gestite
  • Compute - Modello di macchina - Modello di istanza
  • Networking - bilanciamento del carico - bilanciatore del carico Cloud

Questa applicazione di esempio configura un semplice sito HTML statico utilizzando NGINX e bilancia il carico con il tuo cluster.


Inizia

Fai clic sul link seguente per copiare una copia del codice sorgente in Cloud Shell. Da lì, con un unico comando verrà avviata una copia funzionante dell'applicazione nel tuo progetto.

Apri in Cloud Shell

Visualizza il codice sorgente su GitHub


Componenti VM con bilanciamento del carico

L'architettura VM con bilanciamento del carico sfrutta diversi prodotti. Di seguito sono elencati i componenti, insieme a ulteriori informazioni sui componenti, inclusi i link ai video correlati, la documentazione del prodotto e le procedure dettagliate interattive.
Video Documenti Procedure dettagliate
Compute Engine Compute Engine è la tecnologia virtuale di Google Cloud. Con questo strumento puoi avviare molte configurazioni diverse di VM per adattarle alla forma di qualsiasi esigenza di computing.
Cloud Load Balancing Il bilanciatore del carico Google Cloud ti consente di posizionare un bilanciatore del carico davanti al bucket di archiviazione, in modo da poter utilizzare i certificati SSL, Logging e Monitoring.

Script

Lo script di installazione utilizza un file eseguibile scritto in go e negli strumenti dell'interfaccia a riga di comando di Terraform per eseguire un progetto vuoto e installare l'applicazione al suo interno. L'output deve essere un'applicazione funzionante e un URL per l'indirizzo IP di bilanciamento del carico.

./main.tf

Abilitazione dei servizi

I servizi Google Cloud sono disabilitati in un progetto per impostazione predefinita. Attiva i seguenti servizi richiesti:

  • Compute Engine - Macchine virtuali e servizi di networking (come il bilanciatore del carico)
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 esempio di istanza su cui basare le VM gestite

Il comando seguente crea una VM, installa il software richiesto ed 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 quindi utilizzato per creare un'immagine disco. Tutte le VM nel 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 comando seguente crea un modello con le impostazioni e la configurazione per tutte le VM nel cluster. Utilizza l'immagine disco creata nel comando precedente.

Il comando include uno script di avvio che personalizza il codice HTML pubblicato dalle VM nel 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

Richiedi la gestione di un numero N di macchine del modello di istanza 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

Necessario associare un host al nome di dominio e 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 comando seguente 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
}

Abilita HTTP

Il comando seguente configura le regole di networking che puntano alla porta 80 sul bilanciatore del carico verso il 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

Dopo l'esecuzione, ora dovresti avere un sito web semplice in esecuzione su più istanze Compute Engine, preceduto da un bilanciatore del carico nel progetto. Inoltre, dovresti disporre di tutto il codice per modificare o estendere questa soluzione in base al tuo ambiente.