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.
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.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.