Codelab של אופטימיזציות מתקדמות של איזון עומסים

1. מבוא

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

בקודלאב הזה תלמדו איך להגדיר אפשרויות מתקדמות של איזון עומסים למאזן העומסים הגלובלי החיצוני של אפליקציות. לפני שמתחילים, מומלץ לעיין במסמך בנושא איזון עומסים בענן ( https://cloud.google.com/load-balancing/docs/load-balancing-overview).

c3fb1d3f027e8640.png

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

טופולוגיה של Codelab ותרחישים לדוגמה

2f7368df335d3de9.png

איור 2. הטופולוגיה של הניתוב של מאזן עומסים של HTTP

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

מה תלמדו

  • איך מגדירים את ServiceLbPolicy כדי לשפר את מאזן העומסים.

מה צריך להכין

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

ב-Cloud Shell, מוודאים שמזהה הפרויקט מוגדר

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

הפעלת ממשקי API

הפעלת כל השירותים הנחוצים

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com
gcloud services enable networkservices.googleapis.com

3. יצירת רשת ה-VPC

יצירת רשת VPC

מ-Cloud Shell

gcloud compute networks create httplbs --subnet-mode=auto

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs].
NAME     SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
httplbs  AUTO         REGIONAL

יצירת כללי חומת אש ב-VPC

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

מ-Cloud Shell

gcloud compute firewall-rules create httplb-allow-http-rule \
--allow tcp:80 \
--network httplbs \
--source-ranges 0.0.0.0/0 \
--priority 700

פלט

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule].
Creating firewall...done.
NAME                    NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
httplb-allow-http-rule  httplbs  INGRESS    700       tcp:80        False

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

מ-Cloud Shell

gcloud compute firewall-rules create fw-allow-ssh \
    --network=httplbs \
    --action=allow \
    --direction=ingress \
    --target-tags=allow-ssh \
    --rules=tcp:22

פלט

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh].
Creating firewall...done.
NAME          NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
fw-allow-ssh  httplbs  INGRESS    1000      tcp:22        False

4. הגדרה של קבוצות מכונות מנוהלות

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

היקף הקבוצות של המכונות המנוהלות יכול להיות אזורי או אזורי. במעבדה הזו ניצור קבוצות של מופעי מכונה מנוהלים ברמת תחום (zone).

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

יצירת תבניות המכונות

השלב הראשון הוא ליצור תבנית למכונה.

מ-Cloud Shell

gcloud compute instance-templates create test-template \
   --network=httplbs \
   --tags=allow-ssh,http-server \
   --image-family=debian-9 \
   --image-project=debian-cloud \
   --metadata=startup-script='#! /bin/bash
     apt-get update
     apt-get install apache2 -y
     a2ensite default-ssl
     a2enmod ssl
     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
     systemctl restart apache2'

פלט

NAME           MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template  n1-standard-1               2021-11-09T09:24:35.275-08:00

עכשיו אפשר לוודא שהתבניות למכונות נוצרו בהצלחה באמצעות הפקודה הבאה ב-gcloud:

מ-Cloud Shell

gcloud compute instance-templates list

פלט

NAME                  MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template         n1-standard-1         2021-11-09T09:24:35.275-08:00

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

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

מ-Cloud Shell

gcloud compute instance-groups managed create us-east1-a-mig \
--size=1 \
--template=test-template \
--zone=us-east1-a

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-a-mig  us-east1-a  zone   us-east1-a-mig       0     1            test-template      no

מ-Cloud Shell

gcloud compute instance-groups managed create us-east1-b-mig \
--size=5 \
--template=test-template \
--zone=us-east1-b

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-b-mig  us-east1-b  zone   us-east1-b-mig       0     5            test-template      no

אפשר לוודא שקבוצות המכונות שלנו נוצרו באמצעות הפקודה הבאה ב-gcloud:

מ-Cloud Shell

gcloud compute instance-groups list

פלט

NAME                  LOCATION      SCOPE   NETWORK         MANAGED INSTANCES
us-east1-a-mig        us-east1-a    zone    httplbs          Yes      1
us-east1-b-mig        us-east1-b    zone    httplbs          Yes      5

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

כל מכונה מוגדרת להריץ שרת אינטרנט של Apache עם סקריפט PHP פשוט שמייצר גרסה מוצגת (render) שנראת בערך כך:

הצגת הדף מאת: us-east1-a-mig-ww2h

כדי לוודא ששרתי האינטרנט פועלים כמו שצריך, עוברים אל Compute Engine -> מכונות וירטואליות. חשוב לוודא שהמכונות החדשות (למשל us-east1-a-mig-xxx) נוצרו בהתאם להגדרות של קבוצות המכונות.

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

לחלופין, בדפדפן, עוברים לכתובת http://<IP_Address>

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

יצירת בדיקת תקינות

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

מ-Cloud Shell

gcloud compute health-checks create http http-basic-check \
    --port 80

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check].
NAME              PROTOCOL
http-basic-check  HTTP

שמירה של כתובת IP חיצונית

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

מ-Cloud Shell

gcloud compute addresses create lb-ipv4-2 \
    --ip-version=IPV4 \
    --global

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].

חשוב לזכור את כתובת ה-IP ששמורה.

gcloud compute addresses describe lb-ipv4-2 \
    --format="get(address)" \
    --global

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

עכשיו צריך ליצור שירות לקצה העורפי לקבוצות של המכונות המנוהלות שיצרנו מקודם.

מ-Cloud Shell

gcloud compute backend-services create east-backend-service \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTP \
    --port-name=http \
    --health-checks=http-basic-check \
    --global

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service].
NAME                  BACKENDS  PROTOCOL
east-backend-service            HTTP

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

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

מ-Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global

מ-Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global

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

מ-Cloud Shell

gcloud compute backend-services list

פלט

NAME                  BACKENDS                                                                                               PROTOCOL
east-backend-service  us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig  HTTP

יצירת מפה של כתובות URL

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

gcloud compute url-maps create web-map-http \
    --default-service=east-backend-service \
    --global

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http].
NAME          DEFAULT_SERVICE
web-map-http  backendServices/east-backend-service

יצירת ממשק קצה מסוג HTTP

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

מ-Cloud Shell

gcloud compute target-http-proxies create http-lb-proxy-adv \
    --url-map=web-map-http

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv].
NAME               URL_MAP
http-lb-proxy-adv  web-map-http

בשלב הבא צריך ליצור כלל העברה גלובלי שימפה את כתובת ה-IP ששמורה קודם לשרתי ה-proxy של HTTP.

מ-Cloud Shell

gcloud compute forwarding-rules create http-content-rule \
    --load-balancing-scheme EXTERNAL_MANAGED \
    --address=lb-ipv4-2 \
    --global \
    --target-http-proxy=http-lb-proxy-adv \
    --ports=80

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

6. אימות הפעולה של מאזן העומסים

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

יצירת Siege-vm

עכשיו ניצור את המכונה הווירטואלית של siege, שבה נשתמש כדי ליצור עומס.

מ-Cloud Shell

gcloud compute instances create siege-vm \
    --network=httplbs \
    --zone=us-east1-a \
    --machine-type=e2-medium \
    --tags=allow-ssh,http-server \
    --metadata=startup-script='sudo apt-get -y install siege'

פלט

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm].
NAME      ZONE             MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
siege-vm  us-central1-ir1  e2-medium                  10.132.0.15  34.143.20.68  RUNNING

לאחר מכן תוכלו להתחבר למכונה הווירטואלית שיצרתם באמצעות SSH. לאחר היצירה, לוחצים על SSH כדי להפעיל טרמינל ולהתחבר.

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

מ-Cloud Shell

siege -c 20 http://$lb-ipv4-2

פלט

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

בדיקת חלוקת העומסים

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

Stop the Siege

עכשיו, אחרי שהוכחתם שפיצול התנועה המתקדם פועל, הגיע הזמן לעצור את המצור. לשם כך, חוזרים למסוף SSH של siege-vm ומקישים על CTRL+C כדי להפסיק את הרצת המצור.

7. הגדרת מדיניות Service Lb

יצירת מדיניות של Service LB

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

מ-Cloud Shell

gcloud beta network-services service-lb-policies create http-policy \
    --auto-capacity-drain --location=global

אפשר לאמת שהמדיניות נוצרה בהצלחה באמצעות הפקודה הבאה ב-gcloud:

מ-Cloud Shell

gcloud beta network-services service-lb-policies list --location=global

פלט

NAME
http-policy

צירוף מדיניות Service LB לשירות לקצה העורפי

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

מ-Cloud Shell

gcloud beta compute backend-services update east-backend-service \
    --service-lb-policy=http-policy --global

8. שיפור בריאות הקצה העורפי

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

התכונה 'ניקוי אוטומטי של קיבולת' תסיר באופן אוטומטי MIG לקצה עורפי מאזן העומסים כשהמספר הכולל של הקצוות העורפיים התקינים יירד מתחת לסף מסוים (25%). כדי לבדוק את התכונה הזו, נעבור ל-SSH לתוך המכונות הווירטואליות ב-us-east1-b-mig ונהפוך אותן ללא בריאות. אם הסף הוא 25%, תצטרכו להתחבר ב-SSH לארבע מהמכונות הווירטואליות ולכבות את שרת Apache.

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

sudo apachectl stop

בשלב הזה, התכונה של ניצול אוטומטי של קיבולת תופעל, והמכונה us-east1-b-mig לא תקבל בקשות חדשות.

9. איך לוודא שתכונת ניקוז הקיבולת האוטומטית פועלת

הפעלה מחדש של המצור

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

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

מ-Cloud Shell

siege -c 20 http://$lb-ipv4-2

פלט

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

בשלב הזה, תבחינו שכל הבקשות נשלחות אל us-east1-a-mig.

Stop the Siege

עכשיו, אחרי שהוכחתם שהחלוקה המתקדמת של התנועה פועלת, הגיע הזמן להפסיק את המצור. כדי לעשות זאת, חוזרים לטרמינל ה-SSH של siege-vm ומקישים על CTRL+C כדי להפסיק את ההתקפה.

10. שלבי ניקוי

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

מ-Cloud Shell

gcloud compute instances delete siege-vm --zone=us-east1-a

gcloud compute forwarding-rules delete http-content-rule --global
gcloud compute target-http-proxies delete http-lb-proxy-adv

gcloud compute url-maps delete web-map-http

gcloud compute backend-services delete east-backend-service --global

gcloud compute addresses delete lb-ipv4-2 --global
gcloud compute health-checks delete http-basic-check 

gcloud beta network-services service-lb-policies delete http-policy --location=global

gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a
gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b

gcloud compute instance-templates delete test-template 

gcloud compute firewall-rules delete httplb-allow-http-rule
gcloud compute firewall-rules delete fw-allow-ssh

gcloud compute networks delete httplbs 

11. מעולה!

כל הכבוד על השלמת ה-Codelab.

אילו נושאים דיברנו?

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

השלבים הבאים

  • כדאי לנסות תכונות אחרות שמדיניות ה-Service LB מספקת.