הגדרה של מאזן עומסי רשת חיצוני להעברת סיגנל ללא שינוי עם מאגר יעד

בדוגמה הזו מניחים שיש לכם כמה שרתי אינטרנט שפועלים במכונות Compute Engine, ושהמערכת מאזנת ביניהם חיבורי TCP חדשים. בדוגמה הזו נעשה שימוש בבדיקת תקינות של HTTP מדור קודם, כדי שחיבורים חדשים יישלחו רק למכונות וירטואליות תקינות בעורף.

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

לפני שמתחילים

מתקינים את Google Cloud CLI. סקירה כללית מלאה של הכלי זמינה במדריך לכלי gcloud. אפשר למצוא פקודות שקשורות לאיזון עומסים בקבוצת הפקודות gcloud compute.

אפשר גם לקבל עזרה מפורטת לגבי כל פקודה של gcloud באמצעות הדגל --help:

gcloud compute http-health-checks create --help

אם לא הפעלתם את Google Cloud CLI בעבר, קודם מריצים את gcloud init כדי לבצע אימות.

בנוסף, צריך ליצור כתובת IP חיצונית סטטית למאזן העומסים. אם אתם משתמשים בתמונה שסופקה על ידי Compute Engine, המכונות הווירטואליות (VM) שלכם מוגדרות באופן אוטומטי לטיפול בכתובת ה-IP הזו. אם אתם משתמשים בתמונה אחרת, תצטרכו להגדיר את הכתובת הזו ככינוי ב-eth0 או כ-loopback בכל מופע.

במדריך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים את bash.

הגדרת מכונות וירטואליות ב-Compute Engine

בתרחיש הזה של איזון עומסים, תיצרו שלוש מכונות וירטואליות ב-Compute Engine ותתקינו עליהן את Apache. תוסיפו כלל חומת אש שמאפשר לתעבורת HTTP להגיע למכונות.

במקרים שבהם מכונות וירטואליות משמשות כבק-אנד למאזני עומסי רשת חיצוניים להעברת סיגנל ללא שינוי, צריך להפעיל בהן את סביבת האורח המתאימה של Linux, את סביבת האורח המתאימה של Windows או תהליכים אחרים שמספקים פונקציונליות שוות ערך.

הגדרת מופעי הקצה העורפי

המסוף

  1. נכנסים לדף VM instances במסוף Google Cloud .

    כניסה לדף VM instances

  2. לוחצים על Create instance.

  3. מגדירים את Name לערך www1.

  4. מגדירים את Region ל-us-central1.

  5. מגדירים את Zone לערך us-central1-b.

  6. בקטע דיסק אתחול, תמונת ברירת המחדל של מערכת ההפעלה Debian GNU/Linux 12 (bookworm) כבר נבחרה.

  7. לוחצים על אפשרויות מתקדמות.

  8. לוחצים על Networking (רשת) ומגדירים את השדה הבא:

    1. בשדה Network tags (תגי רשת), מזינים network-lb-tag.
  9. לוחצים על ניהול. מזינים את הסקריפט הבא בשדה סקריפט לטעינה בזמן ההפעלה.

     #! /bin/bash
     sudo apt-get update
     sudo apt-get install apache2 -y
     sudo service apache2 restart
     echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
     

    1. לוחצים על יצירה.
  10. יוצרים מכונה בשם www2 עם אותן הגדרות, אבל עם הסקריפט הבא שמוכנס לשדה Automation, סקריפט לטעינה בזמן ההפעלה.

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
     

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

        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
      

gcloud

כל הפקודות שבהמשך מורצות במערכת המקומית, והן מניחות שמוצגת הנחיה של הפקודה bash.

כדי לראות את שמות התמונות של מערכת ההפעלה, המאפיינים והסטטוס, משתמשים בפקודה gcloud compute images list.

  1. יוצרים שלוש מכונות וירטואליות חדשות באזור נתון ונותנים לכולן את אותו התג. בדוגמה הזו, האזור שמוגדר הוא us-central1-b. הגדרת השדה tags מאפשרת לכם להפנות למופעים האלה בבת אחת, למשל באמצעות כלל לחומת אש. הפקודות האלה גם מתקינות את Apache בכל מופע ומקצות לכל מופע דף בית ייחודי.

    gcloud compute instances create www1 \
      --image-family debian-12 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www2 \
      --image-family debian-12 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www3 \
      --image-family debian-12 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

api

Create instance www1 in zone us-central1-b with the instances.insert method

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-12-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

יוצרים מופעים בשמות www2 ו-www3 עם אותן הגדרות, אבל מחליפים את www1 בשדות deviceName, value ו-name.

יצירת כלל חומת אש שמאפשר תעבורת נתונים חיצונית למכונות הווירטואליות האלה

המסוף

  1. נכנסים לדף Firewall policies במסוף Google Cloud .

    לדף Firewall policies

  2. לוחצים על יצירת כלל לחומת האש.

  3. מזינים שם של www-firewall-network-lb.

  4. בוחרים את הרשת שכלל חומת האש חל עליה (ברירת מחדל).

  5. בקטע יעדים, בוחרים באפשרות תגי יעד ספציפיים.

  6. בשדה Target tags (תגי יעד), מזינים network-lb-tag.

  7. מגדירים את Source filter בתור IPv4 ranges.

  8. מגדירים את Source IPv4 ranges (טווח כתובות IPv4 של המקור) ל-0.0.0.0/0, כדי לאפשר תעבורת נתונים מכל מקור.

  9. בקטע Specified protocols and ports (פרוטוקולים ויציאות שצוינו), מסמנים את תיבת הסימון TCP ומזינים 80.

  10. לוחצים על יצירה. יכול להיות שיעבור זמן מה עד שכלל חומת האש החדש יוצג ב-Console, או שתצטרכו ללחוץ על רענון כדי לראות את הכלל.

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

api

יוצרים כלל חומת אש שמאפשר את כל תעבורת הנתונים בתת-הרשת באמצעות firewalls.insert ** method**

POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

קבלת כתובות ה-IP החיצוניות של המופעים ואימות שהם פועלים

המסוף

  1. נכנסים לדף VM instances במסוף Google Cloud .

    כניסה לדף VM instances

  2. הכתובות של המכונות מופיעות בעמודה כתובת IP חיצונית.

  3. כדי לוודא שהמכונות פועלות, מחפשים סימן וי ירוק מימין לשם המכונה. אם לא מופיע סימן וי ירוק, אפשר לעיין בדף הכללי לפתרון בעיות במכונות.

gcloud

  1. מציגים את רשימת המכונות הווירטואליות כדי לקבל את כתובות ה-IP שלהן מהעמודה EXTERNAL_IP.

    gcloud compute instances list
    
  2. מוודאים שכל מופע פועל.

    בשורת הפקודה, מריצים את הפקודה curl באמצעות כתובת ה-IP החיצונית של כל מופע כדי לוודא שכל המופעים מגיבים.

    curl http://[IP_ADDRESS]
    

api

כדי לקבל מידע על מופע www1, משתמשים בשיטה instances.get

מוודאים שהשדה status מכיל את הערך RUNNING, ומחפשים את כתובת ה-IP החיצונית בשדה natIP.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-12-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

חוזרים על הקריאה ל-API עבור www2 ו-www3.

הגדרת שירות איזון העומסים

בשלב הבא, מגדירים את שירות איזון העומסים.

כשמגדירים את שירות איזון העומסים, המכונות הווירטואליות מקבלות חבילות שמיועדות לכתובת ה-IP החיצונית הקבועה שהגדרתם. אם אתם משתמשים בתמונה שסופקה על ידי Compute Engine, המכונות שלכם מוגדרות אוטומטית לטיפול בכתובת ה-IP הזו. אם אתם משתמשים בתמונה אחרת, תצטרכו להגדיר את הכתובת הזו ככינוי ב-eth0 או כ-loopback בכל מופע.

המסוף

אי אפשר להשתמש במסוף Google Cloud כדי ליצור מאזנים חיצוניים של עומסי רשת להעברת סיגנל ללא שינוי שמבוססים על מאגר כתובות IP לטירגוט. במקום זאת, אפשר להשתמש ב-gcloud או ב-API בארכיטקטורת REST.

gcloud

  1. יצירת כתובת IP חיצונית סטטית למאזן העומסים

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. הוספת משאב לבדיקת תקינות של HTTP מדור קודם

    בדוגמה הזו נעשה שימוש בהגדרות ברירת המחדל של מנגנון בדיקת התקינות, אבל אפשר גם להתאים אישית את בדיקת התקינות.

    gcloud compute http-health-checks create basic-check
    
  3. הוספת מאגר יעד

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

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. הוספת המופעים למאגר היעדים

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    מופעים במאגר מטרות חייבים להשתייך לאותו אזור, אבל יכולים להיות מפוזרים באזורים שונים באותו אזור. לדוגמה, אפשר להגדיר מכונות באזור us-central1-f ומכונות באזור us-central1-b במאגר יעד אחד כי הן נמצאות באותו אזור, us-central1.

  5. הוספת כלל להעברה

    מוסיפים כלל העברה שפועל בשם כתובת IP חיצונית וטווח יציאות שמפנים למאגר היעד. בשדה --address, צריך להשתמש בכתובת ה-IP המספרית או בשם המוגדר במלואו.

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

api

  1. יצירת כתובת IP חיצונית סטטית למאזן העומסים

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. הוספת בדיקת תקינות של HTTP מדור קודם

    בדוגמה הזו נעשה שימוש בהגדרות ברירת המחדל של מנגנון בדיקת התקינות, אבל אפשר גם להתאים אישית את ההגדרות.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. הוספה של מאגר יעד

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

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. הוספת המופעים למאגר היעד

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    חוזרים על הקריאה הזו ל-API עבור המופעים www2 ו-www3.

    מופעים במאגר מטרות חייבים להשתייך לאותו אזור, אבל יכולים להיות מפוזרים באזורים שונים באותו אזור. לדוגמה, אפשר להגדיר מכונות באזור us-central1-f ומכונות באזור us-central1-b במאגר יעד אחד כי הן נמצאות באותו אזור, us-central1.

  5. הוספת כלל העברה

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

הפניית תנועה למופעים

אחרי שמגדירים את שירות איזון העומסים, אפשר להתחיל לשלוח תעבורה לכלל ההעברה ולראות איך התעבורה מתפזרת למופעים שונים.

חיפוש כתובת ה-IP החיצונית של כלל ההעברה

המסוף

  1. עוברים לכרטיסייה כללי העברה בדף Advanced איזון עומסים במסוף Google Cloud .
    עוברים לכרטיסייה Forwarding Rules
  2. מאתרים את www-rule, כלל ההעברה שבו משתמש מאזן העומסים.
  3. בעמודה IP Address של www-rule, רושמים את כתובת ה-IP החיצונית שמופיעה.

gcloud

מזינים את הפקודה הבאה כדי לראות את כתובת ה-IP החיצונית של כלל ההעברה www-rule שמשמש את מאזן העומסים.

gcloud compute forwarding-rules describe www-rule --region us-central1

api

צפייה בכתובת ה-IP החיצונית של כלל ההעברה www-rule באמצעות השיטה forwardingRules.get

בפלט, מחפשים את השדה IPAddress.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

אין תמיכה ב-ICMP במופעי קצה עורפי

מאזנים חיצוניים של עומסי רשת להעברת סיגנל ללא שינוי לא מעבירים חבילות ICMP למופעי קצה עורפי. אם שולחים מנות ICMP, למשל באמצעות ping או traceroute, התשובה לא מגיעה ממופעי ה-Backend של מאזן העומסים.

Google Cloud יכול להיות שהתשתית תשלח תגובת ICMP, גם אם יש לכם כללי חומת אש שאוסרים על תעבורת ICMP בשרתים העורפיים של מאזן העומסים. אי אפשר לשנות את ההתנהגות הזו.

שימוש בפקודה curl כדי לגשת לכתובת ה-IP החיצונית

התשובה מהפקודה curl מתחלפת באופן אקראי בין שלושת המקרים. אם התגובה שלכם לא מצליחה בהתחלה, יכול להיות שתצטרכו להמתין כ-30 שניות עד שההגדרה תיטען במלואה ועד שהמופעים שלכם יסומנו כפעילים, לפני שתנסו שוב:

$ while true; do curl -m1 IP_ADDRESS; done

המאמרים הבאים