Vms Seimbang Beban

Arsitektur

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

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

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


Mulai

Klik link berikut untuk mendapatkan salinan kode sumber di Cloud Shell. Setelah ada, satu perintah akan menjalankan salinan aplikasi yang berfungsi di project Anda..

Buka di Cloud Shell

Lihat kode sumber di GitHub


Komponen Vms Load Balanced

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

Skrip

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

./main.tf

Mengaktifkan layanan

Layanan Google Cloud dinonaktifkan dalam 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 menjadi dasar VM terkelola

Perintah berikut membuat VM, menginstal software yang diperlukan, 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 tersebut kemudian digunakan untuk membuat Disk Image. Semua VM di 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. Menggunakan disk image yang dibuat di perintah sebelumnya.

Perintah tersebut mencakup 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]
}

Buat Grup Instance Terkelola

Meminta N jumlah mesin dari Instance Template 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]
}

Buat Alamat IP Eksternal

Diperlukan untuk mengikat {i>host<i} 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 membuat load balancer dan mengimplementasikan health check dan layanan backend. Otorisasi 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
}

Aktifkan HTTP

Perintah berikut mengonfigurasi aturan jaringan yang mengarahkan port 80 pada 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, sekarang Anda akan memiliki situs web sederhana yang berjalan di beberapa instance Compute Engine, yang ditangani oleh load balancer di project Anda. Selain itu, Anda harus memiliki semua kode untuk dimodifikasi atau memperluas solusi ini agar sesuai dengan lingkungan Anda.