VM yang Di-load Balanced

+

Arsitektur

Load Balanced Vms adalah skrip pembuatan infrastruktur yang menyiapkan cluster VM dan mengonfigurasi Load Balancer untuk mengekspos rute publik ke VM:

  • Komputasi - VM - Compute Engine
  • Compute - Cluster - Grup Instance Terkelola
  • Compute - Machine Template - Instance Template
  • Jaringan - Load Balancing - Cloud Load Balancer

Contoh aplikasi ini menyiapkan situs HTML statis sederhana menggunakan NGINX, dan melakukan load balancing di seluruh cluster Anda.


Mulai

Klik link berikut untuk melihat salinan kode sumber di Cloud Shell. Setelah di sana, satu perintah akan membuat salinan aplikasi yang berfungsi di project Anda.

Buka di Cloud Shell

Melihat kode sumber di GitHub


Komponen VM Load Balanced

Arsitektur VM dengan Load Balancing menggunakan beberapa produk. Berikut adalah daftar komponen, beserta informasi selengkapnya tentang komponen tersebut, termasuk link ke video terkait, dokumentasi produk, dan panduan interaktif.
Video Dokumen Panduan
Compute Engine Compute Engine adalah teknologi Virtual Google Cloud. Dengannya, Anda dapat membuat banyak konfigurasi VM yang berbeda agar sesuai dengan kebutuhan komputasi apa pun yang Anda miliki.
Cloud Load Balancing Google Cloud Load Balancer memungkinkan Anda menempatkan load balancer di depan Storage Bucket, sehingga Anda dapat menggunakan sertifikat SSL, Logging, dan Monitoring.

Skrip

Skrip penginstalan menggunakan file yang dapat dieksekusi yang ditulis di go dan alat Terraform CLI untuk mengambil project kosong dan menginstal aplikasi di dalamnya. Output-nya harus berupa aplikasi yang berfungsi dan URL untuk alamat IP load balancing.

./main.tf

Mengaktifkan layanan

Layanan Google Cloud dinonaktifkan di project secara default. Aktifkan layanan yang diperlukan berikut:

  • Compute Engine - Virtual machine dan layanan jaringan (seperti 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
}

Membuat contoh instance yang akan menjadi dasar VM terkelola

Perintah berikut membuat VM, menginstal software yang diperlukan di dalamnya, dan men-deploy kode.

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

Membuat snapshot dan disk image

Perintah berikut menggunakan VM untuk membuat snapshot. Snapshot kemudian digunakan untuk membuat Image Disk. Semua VM dalam cluster didasarkan pada image ini.

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

Buat template instance

Perintah berikut membuat template dengan setelan dan konfigurasi untuk semua VM dalam cluster. Kode ini menggunakan image disk yang dibuat dalam perintah sebelumnya.

Perintah ini menyertakan skrip startup yang menyesuaikan HTML yang ditayangkan oleh VM di 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]
}

Membuat Grup Instance Terkelola

Meminta sejumlah N mesin Template Instance untuk dikelola sebagai bagian dari grup ini.

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

Membuat Alamat IP Eksternal

Diperlukan untuk mengikat host ke nama domain, dan berkomunikasi secara umum di Internet.

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

Buat load balancer

Perintah berikut akan membuat load balancer dan menerapkan health check serta layanan backend. Tindakan ini akan mengonfigurasi load balancer untuk terhubung ke grup instance.

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
}

Mengaktifkan HTTP

Perintah berikut mengonfigurasi aturan jaringan yang mengarahkan port 80 di load balancer ke layanan.

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
}

Kesimpulan

Setelah dijalankan, Anda kini akan memiliki situs web sederhana yang berjalan di beberapa instance Compute Engine, yang dilayani oleh load balancer di project Anda. Selain itu, Anda harus memiliki semua kode untuk mengubah atau memperluas solusi ini agar sesuai dengan lingkungan Anda.