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

1. מבוא

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

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

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

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

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

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

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

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

מה תלמדו

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

הגדרת סביבה בקצב אישי

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג למשתתפים בפרויקט. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שהוא מוגדר). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך להתייחס אליה. ברוב ה-codelab, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-PROJECT_ID). אם לא אהבתם את המזהה שנוצר, תוכלו ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש אחר ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר לאורך כל הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תהיה עלות בכלל. כדי להשבית את המשאבים ולא לחייב אתכם אחרי שתסיימו את המדריך הזה, תוכלו למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

הפעלת Cloud Shell

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

ב-Google Cloud Console, לוחצים על סמל 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) כדי לאפשר חיבורים למכונות הווירטואליות של ה-backend של מאזן העומסים.

  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 למכונות הווירטואליות של ה-backend. בדוגמה הזו, כלל חומת האש מאפשר חיבורים מכל כתובת 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. מגדירים שלוש מכונות VM בקצה העורפי כך שיחזירו את המשקלים בכותרת 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 שמכילה את המשקל של מכונת ה-VM של ה-Backend."

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 בשם של שירות ה-Backend שרוצים ליצור.
  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 של שירות קצה עורפי

מוודאים שהמשקלים של ה-backend מדווחים בצורה תקינה לבדיקת תקינות ה-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