Load Balanced Vms הוא סקריפט לבניית תשתית שמגדיר אשכול של מכונות וירטואליות ומגדיר מאזן עומסים כדי לחשוף נתיב ציבורי למכונות הווירטואליות:
- מחשוב – מכונות וירטואליות – Compute Engine
- Compute – Cluster – Managed Instance Group
- Compute – תבנית מכונה – תבנית מכונה
- Networking - Load Balancing - Cloud Load Balancer
באפליקציה לדוגמה הזו מוגדר אתר HTML סטטי פשוט באמצעות NGINX, ומתבצע איזון עומסים באשכול.
שנתחיל?
כדי להעתיק את קוד המקור ב-Cloud Shell, לוחצים על הקישור הבא. אחרי שמגיעים לשם, פקודה אחת תתחיל הרצה של עותק עובד של האפליקציה בפרויקט.
רכיבים של מכונות וירטואליות עם איזון עומסים
ארכיטקטורת מכונות ה-VM עם איזון העומסים מתבססת על כמה מוצרים. ברשימה הבאה מפורטים הרכיבים, וגם מידע נוסף על הרכיבים, כולל קישורים לסרטונים קשורים, למסמכי מוצר ולמדריכים אינטראקטיביים.סקריפטים
סקריפט ההתקנה משתמש בקובץ הפעלה שנכתב ב-go ובכלים של Terraform CLI כדי לקחת פרויקט ריק ולהתקין בו את האפליקציה. הפלט צריך להיות אפליקציה פעילה וכתובת URL לכתובת ה-IP של איזון העומסים.
./main.tf
הפעלת שירותים
שירותי Google Cloud מושבתים בפרויקט כברירת מחדל. מפעילים את השירותים הנדרשים הבאים:
- Compute Engine – מכונות וירטואליות ושירותי רשת (כמו 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
}
יצירת מופע לדוגמה שעליו יתבססו מכונות וירטואליות מנוהלות
הפקודה הבאה יוצרת מכונה וירטואלית, מתקינה בה את התוכנה הנדרשת ופורסת קוד.
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]
}
יצירת snapshot ותמונת דיסק
הפקודה הבאה משתמשת במכונה הווירטואלית כדי ליצור snapshot. לאחר מכן, נעשה שימוש ב-snapshot כדי ליצור תמונת דיסק. כל המכונות הווירטואליות באשכול מבוססות על התמונה הזו.
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]
}
יצירת תבנית של הגדרות מכונה
הפקודה הבאה יוצרת תבנית עם ההגדרות וההגדרה של כל המכונות הווירטואליות באשכול. היא משתמשת בתמונת הדיסק שנוצרה בפקודה הקודמת.
הפקודה כוללת סקריפט לטעינה בזמן ההפעלה שמבצע התאמה אישית של ה-HTML שמוצג על ידי המכונות הווירטואליות באשכול.
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]
}
יצירת קבוצה של מופעי מכונה מנוהלים
בקשות למספר N של מכונות בתבנית המופע שינוהלו כחלק מהקבוצה הזו.
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]
}
יצירת כתובת IP חיצונית
הוא נדרש כדי לקשר מארח לשם הדומיין, וכדי לתקשר באופן כללי באינטרנט.
resource "google_compute_global_address" "default" {
project = var.project_id
name = "${var.basename}-ip"
ip_version = "IPV4"
}
יצירת מאזן עומסים
הפקודה הבאה יוצרת מאזן עומסים ומיישמת בדיקות תקינות ושירותים לקצה העורפי. הוא מגדיר את מאזן העומסים כך שיתחבר לקבוצת המופעים.
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
}
הפעלת HTTP
הפקודה הבאה מגדירה כללי רשת שמפנים את יציאה 80 במאזן העומסים לשירות.
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
}
סיכום
אחרי ההרצה, אמור להיות לכם אתר פשוט שפועל בכמה מופעים של Compute Engine, עם איזון עומסים בחלק הקדמי של הפרויקט. בנוסף, צריך שיהיה לכם את כל הקוד כדי לשנות או להרחיב את הפתרון הזה כך שיתאים לסביבה שלכם.