מכונות וירטואליות עם איזון עומסים

ארכיטקטורה

‫Load Balanced Vms הוא סקריפט לבניית תשתית שמגדיר אשכול של מכונות וירטואליות ומגדיר מאזן עומסים כדי לחשוף נתיב ציבורי למכונות הווירטואליות:

  • מחשוב – מכונות וירטואליות – Compute Engine
  • ‫Compute – Cluster – Managed Instance Group
  • ‫Compute – תבנית מכונה – תבנית מכונה
  • Networking - Load Balancing - Cloud Load Balancer

באפליקציה לדוגמה הזו מוגדר אתר HTML סטטי פשוט באמצעות NGINX, ומתבצע איזון עומסים באשכול.


שנתחיל?

כדי להעתיק את קוד המקור ב-Cloud Shell, לוחצים על הקישור הבא. אחרי שמגיעים לשם, פקודה אחת תתחיל הרצה של עותק עובד של האפליקציה בפרויקט.

Cloud Shell-פתיחה ב

צפייה בקוד המקור ב-GitHub


רכיבים של מכונות וירטואליות עם איזון עומסים

ארכיטקטורת מכונות ה-VM עם איזון העומסים מתבססת על כמה מוצרים. ברשימה הבאה מפורטים הרכיבים, וגם מידע נוסף על הרכיבים, כולל קישורים לסרטונים קשורים, למסמכי מוצר ולמדריכים אינטראקטיביים.
וידאו Docs הדרכות מפורטות
Compute Engine ‫Compute Engine היא טכנולוגיה וירטואלית של Google Cloud. בעזרת התכונה הזו תוכלו להגדיר הרבה מכונות וירטואליות שונות בהתאם לצרכים שלכם.
Cloud Load Balancing מאזן העומסים של Google Cloud מאפשר לכם להציב מאזן עומסים לפני קטגוריית האחסון, וכך להשתמש באישור SSL, ביומנים ובמעקב.

סקריפטים

סקריפט ההתקנה משתמש בקובץ הפעלה שנכתב ב-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, עם איזון עומסים בחלק הקדמי של הפרויקט. בנוסף, צריך שיהיה לכם את כל הקוד כדי לשנות או להרחיב את הפתרון הזה כך שיתאים לסביבה שלכם.