איזון עומסי רשת משוקללים לפי מופע

1. מבוא

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

כדי לשמור על איזון עומסים משוקלל, צריך להגדיר את שני התנאים הבאים:

  • צריך להגדיר את מדיניות מאזן העומסים ברשות מוניציפאלית (localityLbPolicy) של שירות הקצה העורפי כ-WEIGHTED_MAGLEV.
  • צריך להגדיר את השירות לקצה העורפי עם בדיקת תקינות של HTTP/HTTP2/HTTPS. התגובות לבדיקת תקינות של HTTP חייבות להכיל שדה כותרת תגובת HTTP מותאם אישית X-Load-Balancing-Endpoint- מסומן, כדי לציין את המשקלים עם ערכי מספרים שלמים מ-0 עד 1,000 בייצוג עשרוני לכל מופע של הקצה העורפי.

אם אתם משתמשים באותה קבוצת מכונות בתור קצה עורפי במספר מאזני עומסים ברשת מבוססי שירות לקצה העורפי שמשתמשים באיזון עומסים משוקלל, מומלץ להשתמש בנתיב בקשה ייחודי לכל בדיקת תקינות של השירות לקצה העורפי. מידע נוסף זמין במאמר קריטריונים להצלחה בבדיקות תקינות של HTTP, HTTPS ו-HTTP/2.

בדיקת התקינות של HTTP אמורה להחזיר תגובת HTTP 200 (OK) כדי לעבור את בדיקות התקינות, והמכונה של הקצה העורפי נחשבת תקינה. במצבים שבהם כל המופעים של הקצה העורפי עוברים את בדיקות התקינות שלהם ומחזירים את X-Load-Balancing-Endpoint-weight במשקל אפס, מאזן העומסים מחלק חיבורים חדשים בין הקצוות העורפיים הבריאים ומטפל בהם במשקל שווה. מאזן העומסים יכול גם להפיץ חיבורים חדשים בין קצוות עורפיים לא תקינים. מידע נוסף מופיע במאמר התפלגות תנועה.

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

אפשר להשתמש באיזון עומסים משוקלל בתרחישים הבאים:

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

מה תלמדו

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

הגדרת סביבה בקצב עצמאי

  1. נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
  • Project ID הוא ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט.
  • לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

הפעלת Cloud Shell

אומנם אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה משתמשים ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.

במסוף Google Cloud, לוחצים על הסמל של Cloud Shell בסרגל הכלים שבפינה השמאלית העליונה:

55efc1aaa7a4d3ad.png

נדרשים רק כמה דקות כדי להקצות את הסביבה ולהתחבר אליה. בסיום התהליך, אתם אמורים לראות משהו כזה:

7ffe5cbb04455448.png

למכונה הווירטואלית הזו נטען כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. כל העבודה ב-Codelab הזה יכולה להתבצע בתוך דפדפן. אתה לא צריך להתקין שום דבר.

2. התחלת ההגדרה

ב-Codelab צריך להשתמש בפרויקט אחד.

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

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

gcloud services enable compute.googleapis.com

הערה: אי אפשר להשתמש במסוף Google Cloud כדי להגדיר את המדיניות של מאזן העומסים ברשות מוניציפאלית ולהקצות משקולות למכונות וירטואליות. במקום זאת, צריך להשתמש ב-Google Cloud CLI.

יצירת כללי רשת VPC, רשתות משנה וכללי חומת אש

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

  1. יצירת רשת VPC ורשת משנה. א. כדי ליצור את רשת ה-VPC, מריצים את הפקודה gcloud compute networks create :
gcloud compute networks create NETWORK_NAME --subnet-mode custom

ב. בדוגמה הזו, טווח כתובות ה-IPv4 הראשי של רשת המשנה הוא 10.10.0.0/24.

כדי ליצור את רשת המשנה, מריצים את הפקודה gcloud compute networks subnets create :

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

מחליפים את מה שכתוב בשדות הבאים:

  • NETWORK_NAME: שם רשת ה-VPC שרוצים ליצור.
  • SUBNET_NAME: השם של רשת המשנה שרוצים ליצור.
  1. יצירת כלל של תעבורת נתונים נכנסת (ingress) מאפשר לחומת האש, כדי לאפשר העברה של מנות שנשלחו ליציאות TCP 80 ו-443 של היעד למכונות הווירטואליות בקצה העורפי. בדוגמה הזו, כלל חומת האש מאפשר חיבורים מכל כתובת IP של המקור. כלל חומת האש חל על מכונות וירטואליות עם תג הרשת network-lb-tag. כדי ליצור את כלל חומת האש, מריצים את הפקודה gcloud compute firewall-rules create:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

מחליפים את FIREWALL_RULE_NAME בשם של כלל חומת האש שרוצים ליצור.

יצירת מכונות וירטואליות והקצאת משקולות

יצירת שלוש מכונות וירטואליות והקצאת משקלים:

  1. מגדירים שלוש מכונות וירטואליות בקצה העורפי כדי להחזיר את המשקולות בכותרת X-Load-Balancing-Endpoint-weight עם תגובות HTTP. במדריך הזה תגדירו מופע של קצה עורפי שידווח על משקל אפס, שמופע קצה עורפי אחר ידווח על משקל 100 ומופע קצה עורפי שלישי שידווח על משקל 900. כדי ליצור את המכונות, מריצים את הפקודה gcloud compute instances create:
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

יצירה של קבוצת מופעי מכונה

במדריך הזה נסביר איך ליצור קבוצת מכונות לא מנוהלות שמכילות את כל שלוש המכונות הווירטואליות(instance-0, instance-100, and instance-900).

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

מחליפים את INSTANCE_GROUP בשם של קבוצת המופעים שרוצים ליצור.

יצירת בדיקת תקינות של HTTP

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

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

מחליפים את HTTP_HEALTH_CHECK_NAME בשם של בדיקת התקינות של HTTP שרוצים ליצור.

יצירת שירות לקצה העורפי

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

  1. יצירת שירות לקצה העורפי עם בדיקת התקינות של HTTP, והגדרת מדיניות מאזן העומסים ברשות מוניציפאלית כ-WEIGHTED_MAGLEV.
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • מחליפים את BACKEND_SERVICE_NAME בשם של השירות לקצה העורפי שרוצים ליצור.
  1. מוסיפים את קבוצת המכונות לשירות לקצה העורפי.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. לשמור כתובת IP אזורית חיצונית למאזן העומסים.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

מחליפים את ADDRESS_NAME בשם של כתובת ה-IP שרוצים ליצור. משתמשים בפקודה compute addresses describe כדי להציג את התוצאה. חשוב לשים לב לכתובת ה-IP החיצונית הסטטית השמורה (‘IP_ADDRESS').

gcloud compute addresses describe ADDRESS_NAME
  1. יוצרים כלל העברה באמצעות כתובת ה-IP החיצונית האזורית השמורה 'IP_ADDRESS'. צריך לחבר את כלל ההעברה לשירות לקצה העורפי.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • מחליפים את הערך הבא: FORWARDING_RULE: השם של כלל ההעברה שרוצים ליצור. IP_ADDRESS: כתובת ה-IP שצריך להקצות למכונה. צריך להשתמש בכתובת ה-IP החיצונית הסטטית השמורה, ולא בשם הכתובת.

אימות משקולות לקצה העורפי באמצעות API של שירות לקצה העורפי

מוודאים שהמשקולות של הקצה העורפי מדווחות בצורה תקינה לבדיקת התקינות של HTTP.

gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

הפלט אמור להיראות כך:

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth