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

1. מבוא

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

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

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

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

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

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

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

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

מה תלמדו

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

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

מפעילים את Cloud Shell

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

ב-מסוף 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) כדי לאפשר חיבורים למכונות הווירטואליות של ה-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. במדריך הזה, מגדירים שרת עורפי (backend instance) אחד לדיווח על משקל של אפס, שרת עורפי (backend instance) שני לדיווח על משקל של 100 ושרת עורפי (backend instance) שלישי לדיווח על משקל של 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'

יצירת קבוצת מופעים

במדריך הזה, מספקים הוראות ליצירה של קבוצת מופעים לא מנוהלת שמכילה את כל שלושת מופעי מכונות ה-VM‏(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 בשם של שירות לקצה העורפי שרוצים ליצור.
  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