בדוגמה הזו מניחים שיש לכם כמה שרתי אינטרנט שפועלים במכונות 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 או תהליכים אחרים שמספקים פונקציונליות שוות ערך.
הגדרת מופעי הקצה העורפי
המסוף
נכנסים לדף VM instances במסוף Google Cloud .
לוחצים על Create instance.
מגדירים את Name לערך
www1.מגדירים את Region ל-us-central1.
מגדירים את Zone לערך us-central1-b.
בקטע דיסק אתחול, תמונת ברירת המחדל של מערכת ההפעלה Debian GNU/Linux 12 (bookworm) כבר נבחרה.
לוחצים על אפשרויות מתקדמות.
לוחצים על Networking (רשת) ומגדירים את השדה הבא:
- בשדה Network tags (תגי רשת), מזינים
network-lb-tag.
- בשדה Network tags (תגי רשת), מזינים
לוחצים על ניהול. מזינים את הסקריפט הבא בשדה סקריפט לטעינה בזמן ההפעלה.
#! /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
- לוחצים על יצירה.
יוצרים מכונה בשם
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
יוצרים מכונה בשם
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.
יוצרים שלוש מכונות וירטואליות חדשות באזור נתון ונותנים לכולן את אותו התג. בדוגמה הזו, האזור שמוגדר הוא 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.
יצירת כלל חומת אש שמאפשר תעבורת נתונים חיצונית למכונות הווירטואליות האלה
המסוף
נכנסים לדף Firewall policies במסוף Google Cloud .
לוחצים על יצירת כלל לחומת האש.
מזינים שם של
www-firewall-network-lb.בוחרים את הרשת שכלל חומת האש חל עליה (ברירת מחדל).
בקטע יעדים, בוחרים באפשרות תגי יעד ספציפיים.
בשדה Target tags (תגי יעד), מזינים
network-lb-tag.מגדירים את Source filter בתור IPv4 ranges.
מגדירים את Source IPv4 ranges (טווח כתובות IPv4 של המקור) ל-
0.0.0.0/0, כדי לאפשר תעבורת נתונים מכל מקור.בקטע Specified protocols and ports (פרוטוקולים ויציאות שצוינו), מסמנים את תיבת הסימון TCP ומזינים
80.לוחצים על יצירה. יכול להיות שיעבור זמן מה עד שכלל חומת האש החדש יוצג ב-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 החיצוניות של המופעים ואימות שהם פועלים
המסוף
נכנסים לדף VM instances במסוף Google Cloud .
הכתובות של המכונות מופיעות בעמודה כתובת IP חיצונית.
כדי לוודא שהמכונות פועלות, מחפשים סימן וי ירוק מימין לשם המכונה. אם לא מופיע סימן וי ירוק, אפשר לעיין בדף הכללי לפתרון בעיות במכונות.
gcloud
מציגים את רשימת המכונות הווירטואליות כדי לקבל את כתובות ה-IP שלהן מהעמודה
EXTERNAL_IP.gcloud compute instances list
מוודאים שכל מופע פועל.
בשורת הפקודה, מריצים את הפקודה
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
יצירת כתובת IP חיצונית סטטית למאזן העומסים
gcloud compute addresses create network-lb-ip-1 \ --region us-central1הוספת משאב לבדיקת תקינות של HTTP מדור קודם
בדוגמה הזו נעשה שימוש בהגדרות ברירת המחדל של מנגנון בדיקת התקינות, אבל אפשר גם להתאים אישית את בדיקת התקינות.
gcloud compute http-health-checks create basic-check
הוספת מאגר יעד
מוסיפים מאגר יעד באותו אזור שבו נמצאים מופעי המכונות הווירטואליות. משתמשים בבדיקת התקינות שנוצרה בשלב הקודם עבור מאגר היעדים הזה.
gcloud compute target-pools create www-pool \ --region us-central1 --http-health-check basic-checkהוספת המופעים למאגר היעדים
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.הוספת כלל להעברה
מוסיפים כלל העברה שפועל בשם כתובת 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
יצירת כתובת IP חיצונית סטטית למאזן העומסים
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses { "name": "network-lb-ip-1" }הוספת בדיקת תקינות של HTTP מדור קודם
בדוגמה הזו נעשה שימוש בהגדרות ברירת המחדל של מנגנון בדיקת התקינות, אבל אפשר גם להתאים אישית את ההגדרות.
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks { "name": "basic-check" }הוספה של מאגר יעד
מוסיפים מאגר יעד באותו אזור שבו נמצאות המכונות הווירטואליות. משתמשים בבדיקת התקינות שנוצרה בשלב הקודם עבור מאגר היעדים הזה.
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" ] }-
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. הוספת כלל העברה
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 החיצונית של כלל ההעברה
המסוף
- עוברים לכרטיסייה כללי העברה בדף Advanced איזון עומסים במסוף Google Cloud .
עוברים לכרטיסייה Forwarding Rules - מאתרים את
www-rule, כלל ההעברה שבו משתמש מאזן העומסים. - בעמודה 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
המאמרים הבאים
- במאמר מאזן עומסי רשת חיצוני להעברת סיגנל ללא שינוי שמבוסס על מאגר יעד – סקירה כללית מוסבר איך מאזני עומסים חיצוניים להעברת סיגנל ללא שינוי פועלים עם מאגרי יעד.
- כדי להבין איך מאזני עומסי רשת חיצוניים להעברת סיגנל ללא שינוי פועלים עם שירותים אזוריים בעורף במקום עם מאגרי יעדים, אפשר לעיין במאמרים הבאים:
- כדי להגדיר הגנה מתקדמת מפני DDoS ברשת עבור מאזן עומסי רשת חיצוני להעברת סיגנל ללא שינוי באמצעות Cloud Armor, קראו את המאמר בנושא הגדרת הגנה מתקדמת מפני DDoS ברשת.
- במאמר שימוש ב-UDP עם מאזני עומסי רשת חיצוניים להעברת סיגנל ללא שינוי מוסבר על בעיות ופתרונות כשמשתמשים ב-UDP עם מאזני עומסי רשת חיצוניים להעברת סיגנל ללא שינוי.
- כדי למחוק משאבים ולא לשלם עליהם, אפשר לעיין במאמר בנושא ניקוי הגדרות של איזון עומסים.