VMs com balanceamento de carga

+

Arquitetura

O script Load Balanced VMs é um script de criação de infraestrutura que configura um cluster de VMs e configura um balanceador de carga para expor uma rota pública às VMs:

  • Computação – VMs – Compute Engine
  • Compute - Cluster - Grupo de instâncias geridas
  • Compute - Machine Template - Instance Template
  • Redes – Balanceamento de carga – Balanceador de carga da nuvem

Esta aplicação de exemplo configura um site HTML estático simples através do NGINX e equilibra a carga no seu cluster.


Começar

Clique no seguinte link para aceder a uma cópia do código fonte no Cloud Shell. Quando estiver lá, um único comando vai iniciar uma cópia funcional da aplicação no seu projeto.

Abra no Cloud Shell

Veja o código fonte no GitHub


Componentes de VMs com balanceamento de carga

A arquitetura de VMs com balanceamento de carga usa vários produtos. A lista seguinte apresenta os componentes, juntamente com mais informações sobre os componentes, incluindo links para vídeos relacionados, documentação do produto e visitas guiadas interativas.
Vídeo Docs Instruções passo a passo
Compute Engine O Compute Engine é a tecnologia virtual do Google Cloud. Com ele, pode criar muitas configurações diferentes de VMs para se adequarem às suas necessidades de computação.
Cloud Load Balancing O Google Cloud Load Balancer permite-lhe colocar um balanceador de carga à frente do contentor de armazenamento, o que lhe permite usar certificados SSL, registo e monitorização.

Scripts

O script de instalação usa um executável escrito em go e ferramentas da CLI do Terraform para usar um projeto vazio e instalar a aplicação no mesmo. A saída deve ser uma aplicação funcional e um URL para o endereço IP de equilíbrio de carga.

./main.tf

Ative os serviços

Os serviços Google Cloud estão desativados num projeto por predefinição. Ative os seguintes serviços obrigatórios:

  • Compute Engine: máquinas virtuais e serviços de rede (como o balanceador de carga)
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
}

Crie um exemplar de instância no qual basear as VMs geridas

O comando seguinte cria uma VM, instala o software necessário na mesma e implementa o código.

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

Crie um instantâneo e uma imagem de disco

O comando seguinte usa a VM para criar uma captura de ecrã. Em seguida, o instantâneo é usado para criar uma imagem de disco. Todas as MV no cluster baseiam-se nesta imagem.

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

Crie um modelo de instância

O comando seguinte cria um modelo com as definições e a configuração de todas as MV no cluster. Usa a imagem de disco criada no comando anterior.

O comando inclui um script de arranque que personaliza o HTML apresentado pelas VMs no 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]
}

Crie um grupo de instâncias geridas

Pede que o número N de máquinas do modelo de instância seja gerido como parte deste grupo.

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

Crie um endereço IP externo

Necessário para associar um anfitrião ao nome do domínio e comunicar em geral na Internet.

resource "google_compute_global_address" "default" {
    project    = var.project_id
    name       = "${var.basename}-ip"
    ip_version = "IPV4"
}

Crie um balanceador de carga

O comando seguinte cria um balanceador de carga e implementa verificações de funcionamento e serviços de back-end. Configura o balanceador de carga para se ligar ao grupo de instâncias.

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
}

Ative o HTTP

O seguinte comando configura regras de rede que apontam a porta 80 no balanceador de carga para o serviço.

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
}

Conclusão

Depois de executado, deve ter um Website simples em execução em várias instâncias do Compute Engine, com um balanceador de carga no seu projeto. Além disso, deve ter todo o código para modificar ou expandir esta solução de forma a adequar-se ao seu ambiente.