סימולציה של כשל באזור באשכולות אזוריים של GKE

דרישה רגולטורית נפוצה היא שחברה יכולה להוכיח את היכולת שלה להתאוששות מאסון (DR). באפליקציות שפועלות בענן, הדרישה הזו כוללת את האמינות והזמינות של השירותים כששרתים שמארחים באזור מסוים לא זמינים למשך תקופה מסוימת. המסמך הזה מיועד לאדמינים ולארכיטקטים, לאופרטורים ולאדמינים של גיבויים ותוכנית התאוששות מאסון (DR) שרוצים ללמוד איך לדמות יתירות כשל באזור מסוים כשמשתמשים באשכול אזורי רגיל של Google Kubernetes Engine ‏ (GKE).

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

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

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

מטרות

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

עלויות

במדריך הזה השתמשנו ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

  • Compute Engine
  • אשכול במצב רגיל ב-GKE

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

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

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. התקינו את ה-CLI של Google Cloud.

  3. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  4. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  5. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  6. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  7. מפעילים את ממשקי ה-API של Kubernetes Engine ו-Compute Engine:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable container.googleapis.com compute.googleapis.com
  8. התקינו את ה-CLI של Google Cloud.

  9. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  10. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  11. יוצרים או בוחרים Google Cloud פרויקט.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים
    • יוצרים Google Cloud פרויקט:

      gcloud projects create PROJECT_ID

      מחליפים את PROJECT_ID בשם של פרויקט Google Cloud שיוצרים.

    • בוחרים את הפרויקט שיצרתם: Google Cloud

      gcloud config set project PROJECT_ID

      מחליפים את PROJECT_ID בשם הפרויקט ב- Google Cloud .

  12. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  13. מפעילים את ממשקי ה-API של Kubernetes Engine ו-Compute Engine:

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    gcloud services enable container.googleapis.com compute.googleapis.com

יצירת אשכול רגיל אזורי

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

משתמשים ב-Google Cloud CLI כדי ליצור את האשכול:

  1. יוצרים אשכול GKE Standard חדש באמצעות הגדרת ברירת המחדל:

    gcloud container clusters create CLUSTER_NAME \
      --location CONTROL_PLANE_LOCATION \
      --num-nodes 2
    

    מחליפים את הפרמטרים הבאים:

    • CLUSTER_NAME: השם של האשכול.
    • CONTROL_PLANE_LOCATION: האזור של Compute Engine במישור הבקרה של האשכול, כמו us-central1.

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

  2. בודקים את האזורים של כל צומת שנוצר בשלב הקודם:

    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

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

    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node1   asia-southeast1-c   10.128.0.37
    regional-cluster-1-default-pool-node2   asia-southeast1-c   10.128.0.36
    regional-cluster-1-default-pool-node3   asia-southeast1-b   10.128.0.38
    regional-cluster-1-default-pool-node4   asia-southeast1-b   10.128.0.33
    regional-cluster-1-default-pool-node5   asia-southeast1-a   10.128.0.35
    regional-cluster-1-default-pool-node6   asia-southeast1-a   10.128.0.34
    
  3. מתחברים לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION
    

פריסת אפליקציית מיקרו-שירותים לדוגמה

כדי לראות את ההשפעה של המעבר לגיבוי במקרה של כשל שמוצג במסמך הזה, צריך לפרוס אפליקציה לדוגמה שמבוססת על מיקרו-שירותים באשכול. במסמך הזה משתמשים באפליקציה לדוגמה של Cymbal Bank:

  1. במעטפת, משכפלים את מאגר GitHub הבא ועוברים לספרייה:

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    cd bank-of-anthos/
    
  2. פורסים את האפליקציה לדוגמה Cymbal Bank לאשכול GKE שיצרתם בקטע הקודם:

    kubectl apply -f ./extras/jwt/jwt-secret.yaml
    kubectl apply -f ./kubernetes-manifests
    
  3. ממתינים עד שה-Pods יהיו מוכנים:

    kubectl get pods
    
  4. אחרי כמה דקות, הקפסולות אמורות להיות במצב Running:

    NAME                                  READY   STATUS    RESTARTS   AGE
    accounts-db-0                         1/1     Running   0          16s
    balancereader-7dc7d9ff57-sstm5        0/1     Running   0          15s
    contacts-7ddc76d94-rr28x              0/1     Running   0          14s
    frontend-747b84bff4-2mtlv             0/1     Running   0          13s
    ledger-db-0                           1/1     Running   0          13s
    ledgerwriter-f6cc7889d-9qjfg          0/1     Running   0          13s
    loadgenerator-57d4cb57cc-zqvqb        1/1     Running   0          13s
    transactionhistory-5dd7c7fd77-lwkv8   0/1     Running   0          12s
    userservice-cd5ddb4bb-wwhml           0/1     Running   0          12s
    
  5. כשכל ה-Pods במצב Running, מקבלים את כתובת ה-IP החיצונית של שירות הקצה הקדמי:

    kubectl get service frontend | awk '{print $4}'
    
  6. בחלון של דפדפן אינטרנט, פותחים את כתובת ה-IP שמוצגת בפלט של הפקודה kubectl get service כדי לגשת למופע של Cymbal Bank.

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

סימולציה של כשל באזור

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

הפחתת מספר האזורים במאגר הצמתים

כברירת מחדל, למאגר צמתים של אשכול אזורי יש צמתים שמשתרעים על פני כל האזורים באזור שלו. בתרשים הבא, Cloud Load Balancing מפזר את התנועה למאגר צמתים שמשתרע על פני שלושה אזורים. לכל תחום יש שני צמתים, וה-Pods יכולים לפעול בצמתים בכל אחד מהתחומים האלה.

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

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

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

  1. בודקים את הזמינות של אשכול אזורי ושירותים:

    kubectl get pods -o wide ; kubectl get nodes -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    התוצאה אמורה להיות דומה לפלט הבא:

    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          6m30s   10.28.1.5   regional-cluster-1-default-pool-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          6m30s   10.28.5.6   regional-cluster-1-default-pool-node1
    contacts-7ddc76d94-qv4x5              1/1     Running   0          6m29s   10.28.4.6   regional-cluster-1-default-pool-node2
    frontend-747b84bff4-xvjxq             1/1     Running   0          6m29s   10.28.3.6   regional-cluster-1-default-pool-node6
    ledger-db-0                           1/1     Running   0          6m29s   10.28.5.7   regional-cluster-1-default-pool-node1
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          6m29s   10.28.1.6   regional-cluster-1-default-pool-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          6m29s   10.28.4.7   regional-cluster-1-default-pool-node2
    transactionhistory-5dd7c7fd77-cmc2w   1/1     Running   0          6m29s   10.28.3.7   regional-cluster-1-default-pool-node6
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          6m28s   10.28.5.8   regional-cluster-1-default-pool-node1
    
    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node5   asia-southeast1-c   10.148.0.6
    regional-cluster-1-default-pool-node6   asia-southeast1-c   10.148.0.7
    regional-cluster-1-default-pool-node2   asia-southeast1-a   10.148.0.8
    regional-cluster-1-default-pool-node1   asia-southeast1-a   10.148.0.9
    regional-cluster-1-default-pool-node3   asia-southeast1-b   10.148.0.5
    regional-cluster-1-default-pool-node4   asia-southeast1-b   10.148.0.4
    

    בדוגמה הזו, כל עומסי העבודה של Cymbal Bank נפרסים בכל האזורים. כדי לדמות כשל, משביתים אחד מהאזורים, כמו asia-southeast1-c, שבו פרוס שירות הקצה הקדמי.

  2. יצירת סימולציה של הפסקת חשמל באזור. מעדכנים את מאגר הצמתים הקיים (default-pool) כדי לציין רק שני אזורים מתוך שלושת האזורים:

      gcloud container node-pools update default-pool \
        --cluster=CLUSTER_NAME \
        --node-locations=ZONE_A, ZONE_B \
        --location=CONTROL_PLANE_LOCATION
    

    מחליפים את ZONE_A, ZONE_B בשני האזורים שבהם רוצים שמאגר הצמתים ימשיך לפעול.

  3. בודקים את הזמינות של המיקרו-שירותים אחרי שמעדכנים את מאגר הצמתים:

    kubectl get pods -o wide ; kubectl get nodes -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    הפלט אמור להיראות כמו בדוגמה הבאה:

    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node2   asia-southeast1-a   10.148.0.8
    regional-cluster-1-default-pool-node1   asia-southeast1-a   10.148.0.9
    regional-cluster-1-default-pool-node3   asia-southeast1-b   10.148.0.5
    regional-cluster-1-default-pool-node4   asia-southeast1-b   10.148.0.4
    
    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          28m     10.28.1.5   regional-cluster-1-default-pool-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          28m     10.28.5.6   regional-cluster-1-default-pool-node1
    contacts-7ddc76d94-qv4x5              1/1     Running   0          28m     10.28.4.6   regional-cluster-1-default-pool-node2
    frontend-747b84bff4-mdnkd             1/1     Running   0          9m21s   10.28.1.7   regional-cluster-1-default-pool-node3
    ledger-db-0                           1/1     Running   0          28m     10.28.5.7   regional-cluster-1-default-pool-node1
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          28m     10.28.1.6   regional-cluster-1-default-pool-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          28m     10.28.4.7   regional-cluster-1-default-pool-node2
    transactionhistory-5dd7c7fd77-w2vqs   1/1     Running   0          9m20s   10.28.4.8   regional-cluster-1-default-pool-node2
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          28m     10.28.5.8   regional-cluster-1-default-pool-node1
    

    בדוגמת הפלט הזו, asia-southeast1-c כבר לא בשימוש. עדיין יש גישה לשירות הקצה הקדמי שאליו ניגשים מדפדפן עם כתובת ה-URL http://EXTERNAL_IP. משתמש עדיין יוכל לבצע פעולות של הפקדה ותשלום, גם אם אחד מהאזורים כבר לא זמין.

שימוש במאגר צמתים של אזור יחיד

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

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

האשכול שיוצרים בקטע הזה כדי לדמות כשל במאגר צמתים באזור יחיד כולל את הרכיבים הבאים:

  • מאגר צמתים שמוגדר כברירת מחדל – בדרך כלל נוצר כשיוצרים אשכול אזורי של GKE Standard – זהו מאגר צמתים רב-אזורי (default-pool).

    האוסף הזה עם default-pool אחד הוא מה שיצרתם קודם במסמך הזה.

  • מאגרי צמתים נוספים (zonal-node-pool-1 ו-zonal-node-pool-2) שמריצים גם שירותים עבור אפליקציית Cymbal Bank לדוגמה.

הקווים המקווקווים בתרשים מראים איך התנועה מועברת רק אל zonal-node-pool-2 אחרי שמדמים כשל ב-default-pool וב-zonal-node-pool-1.

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

  1. בודקים את הזמינות של האשכול האזורי:

    gcloud container node-pools list \
        --cluster=CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION
    
    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    התוצאה אמורה להיות דומה לפלט הבא:

    NAME: default-pool
    MACHINE_TYPE: e2-medium
    DISK_SIZE_GB: 100
    NODE_VERSION: 1.27.8-gke.1067004
    
    NAME                                         ZONE.               INT_IP
    regional-cluster-1-default-pool-node5-pzmc   asia-southeast1-c   10.148.0.6
    regional-cluster-1-default-pool-node6-qf1l   asia-southeast1-c   10.148.0.7
    regional-cluster-1-default-pool-node2-dlk2   asia-southeast1-a   10.148.0.8
    regional-cluster-1-default-pool-node1-pkfd   asia-southeast1-a   10.148.0.9
    regional-cluster-1-default-pool-node3-6b6n   asia-southeast1-b   10.148.0.5
    regional-cluster-1-default-pool-node4-h0lc   asia-southeast1-b   10.148.0.4
    

    בפלט לדוגמה הזה, כל ה-Pods של Cymbal Bank נפרסים בכל האזורים באותו האשכול ופועלים ב-default-pool הקיים.

  2. יוצרים שני מאגרי צמתים חדשים של אזור יחיד:

    gcloud beta container node-pools create zonal-node-pool-1 \
      --cluster CLUSTER_NAME \
      --location CONTROL_PLANE_LOCATION \
      --num-nodes 4 \
      --node-locations ZONE_A
    
    gcloud beta container node-pools create zonal-node-pool-2 \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --num-nodes 4 \
        --node-locations ZONE_B
    

    מחליפים את ZONE_A ואת ZONE_B בשני התחומים שבהם רוצים שהמאגרים החדשים של צמתים בתחום יחיד יפעלו.

  3. כדי לדמות כשל באזור, מוחקים את מאגר הצמתים האזורי default-pool ואחד ממאגרי הצמתים החדשים של אזור יחיד:

    gcloud container node-pools delete default-pool \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    
    gcloud container node-pools delete zonal-node-pool-1 \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

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

    בודקים שהמיקרו-שירותים ממשיכים להיות זמינים:

    kubectl get pods -o wide ; kubectl get nodes -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    הפלט שאתם מקבלים אמור להיראות כך:

    NAME                                  ZONE                INT_IP
    regional-cluster-1-node-pool3-node1   asia-southeast1-b   10.148.0.8
    regional-cluster-1-node-pool3-node2   asia-southeast1-b   10.148.0.9
    regional-cluster-1-node-pool3-node3   asia-southeast1-b   10.148.0.5
    regional-cluster-1-node-pool3-node4   asia-southeast1-b   10.148.0.4
    
    NAME                                  READY   STATUS    RESTARTS   AGE     IP          NODE
    accounts-db-0                         1/1     Running   0          28m     10.28.1.5   regional-cluster-1-zonal-node-pool-2-node3
    balancereader-7dc7d9ff57-shwg5        1/1     Running   0          28m     10.28.5.6   regional-cluster-1-zonal-node-pool-2-node1
    contacts-7ddc76d94-qv4x5              1/1     Running   0          28m     10.28.4.6   regional-cluster-1-zonal-node-pool-2-node2
    frontend-747b84bff4-mdnkd             1/1     Running   0          9m21s   10.28.1.7   regional-cluster-1-zonal-node-pool-2-node3
    ledger-db-0                           1/1     Running   0          28m     10.28.5.7   regional-cluster-1-zonal-node-pool-2-node4
    ledgerwriter-f6cc7889d-mttmb          1/1     Running   0          28m     10.28.1.6   regional-cluster-1-zonal-node-pool-2-node3
    loadgenerator-57d4cb57cc-7fvrc        1/1     Running   0          28m     10.28.4.7   regional-cluster-1-zonal-node-pool-2-node2
    transactionhistory-5dd7c7fd77-w2vqs   1/1     Running   0          9m20s   10.28.4.8   regional-cluster-1-zonal-node-pool-2-node2
    userservice-cd5ddb4bb-zfr2g           1/1     Running   0          28m     10.28.5.8   regional-cluster-1-zonal-node-pool-2-node1
    

    בפלט לדוגמה הזה, מכיוון שהשירותים default-pool ו-zonal-node-pool-1 כבר לא קיימים, כל השירותים פועלים ב-zonal-node-pool-2.

הגבלת גישה לצמתים וניקוז שלהם באזור

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

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

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

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

  1. בודקים את הזמינות של האשכול והשירותים האזוריים. בודקים את שמות הצמתים של אזור הכשל של היעד. רוצים לציין אזור שבו פועלים פודי ה-Frontend:

    kubectl get pods -o wide
    

    הפלט אמור להיראות כמו בדוגמה הבאה:

    NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE
    accounts-db-0                         1/1     Running   0          4m7s    10.96.4.4    regional-cluster-1-default-pool-node2
    balancereader-7dc7d9ff57-lv4z7        1/1     Running   0          4m7s    10.96.1.5    regional-cluster-1-default-pool-node1
    contacts-7ddc76d94-wxvg5              1/1     Running   0          4m7s    10.96.6.11   regional-cluster-1-default-pool-node3
    frontend-747b84bff4-gvktl             1/1     Running   0          4m7s    10.96.1.4    regional-cluster-1-default-pool-node1
    ledger-db-0                           1/1     Running   0          4m7s    10.96.4.5    regional-cluster-1-default-pool-node2
    ledger-db-1                           1/1     Running   0          3m50s   10.96.0.13   regional-cluster-1-default-pool-node5
    ledgerwriter-f6cc7889d-4hqbm          1/1     Running   0          4m6s    10.96.0.12   regional-cluster-1-default-pool-node5
    loadgenerator-57d4cb57cc-fmq52        1/1     Running   0          4m6s    10.96.4.6    regional-cluster-1-default-pool-node2
    transactionhistory-5dd7c7fd77-72zpx   1/1     Running   0          4m6s    10.96.6.12   regional-cluster-1-default-pool-node3
    userservice-cd5ddb4bb-b7862           1/1     Running   0          4m6s    10.96.1.6    regional-cluster-1-default-pool-node1
    
  2. משייכים את ה-Pods שמופיעים בפלט הקודם לאזור של הצומת:

    kubectl get node -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    הפלט אמור להיראות כמו בדוגמה הבאה:

    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node1   asia-southeast1-b   10.148.0.41
    regional-cluster-1-default-pool-node2   asia-southeast1-b   10.148.0.42
    regional-cluster-1-default-pool-node3   asia-southeast1-a   10.148.0.37
    regional-cluster-1-default-pool-node4   asia-southeast1-a   10.148.0.38
    regional-cluster-1-default-pool-node5   asia-southeast1-c   10.148.0.40
    regional-cluster-1-default-pool-node6   asia-southeast1-c   10.148.0.39
    

    בדוגמה הקודמת של הפלט, ה-Pods של הקצה הקדמי נמצאים ב-regional-cluster-1-default-pool-node1 באזור asia-southeast1-b.

    בשלב הבא, עוקבים אחרי כל הצמתים באזור asia-southeast1-b, שבדוגמה הזו הם regional-cluster-1-default-pool-node1 ו-regional-cluster-1-default-pool-node2.

  3. מגדירים את הצמתים של היעד ומרוקנים אותם באחד מהתחומים. בדוגמה הזו, אלה שני הצמתים ב-asia-southeast1-b:

    kubectl drain regional-cluster-1-default-pool-node1 \
        --delete-emptydir-data --ignore-daemonsets
    
    kubectl drain regional-cluster-1-default-pool-node2 \
        --delete-emptydir-data --ignore-daemonsets
    

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

  4. בודקים איפה מתוזמנים מחדש ה-Pods החדשים של חזית האתר ודוגמאות אחרות של Pods של Cymbal Bank שפעלו קודם לכן בצומת באזור הכשל:

    kubectl get pods -o wide ; kubectl get nodes -o=custom-columns='NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INT_IP:.status.addresses[0].address'
    

    הפלט אמור להיראות כמו בדוגמה הבאה:

    NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE
    accounts-db-0                         1/1     Running   0          4m7s    10.96.4.4    regional-cluster-1-default-pool-node4
    balancereader-7dc7d9ff57-lv4z7        1/1     Running   0          4m7s    10.96.1.5    regional-cluster-1-default-pool-node6
    contacts-7ddc76d94-wxvg5              1/1     Running   0          4m7s    10.96.6.11   regional-cluster-1-default-pool-node3
    frontend-747b84bff4-gvktl             1/1     Running   0          4m7s    10.96.1.4    regional-cluster-1-default-pool-node3
    ledger-db-0                           1/1     Running   0          4m7s    10.96.4.5    regional-cluster-1-default-pool-node6
    ledger-db-1                           1/1     Running   0          3m50s   10.96.0.13   regional-cluster-1-default-pool-node5
    ledgerwriter-f6cc7889d-4hqbm          1/1     Running   0          4m6s    10.96.0.12   regional-cluster-1-default-pool-node5
    loadgenerator-57d4cb57cc-fmq52        1/1     Running   0          4m6s    10.96.4.6    regional-cluster-1-default-pool-node4
    transactionhistory-5dd7c7fd77-72zpx   1/1     Running   0          4m6s    10.96.6.12   regional-cluster-1-default-pool-node3
    userservice-cd5ddb4bb-b7862           1/1     Running   0          4m6s    10.96.1.6    regional-cluster-1-default-pool-node3
    
    NAME                                    ZONE                INT_IP
    regional-cluster-1-default-pool-node3   asia-southeast1-a   10.148.0.37
    regional-cluster-1-default-pool-node4   asia-southeast1-a   10.148.0.38
    regional-cluster-1-default-pool-node5   asia-southeast1-c   10.148.0.40
    regional-cluster-1-default-pool-node6   asia-southeast1-c   10.148.0.39
    

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

    יכול להיות שתקציבים לשיבוש Pod ‏ (PDB) בצמתים יחסמו את ניקוי הצמתים. חשוב להעריך את מדיניות ה-PDB לפני פעולת הגידור והניקוז. כדי להבין יותר על PDB ועל הקשר שלו לניהול שיבושים, אפשר לקרוא איך לוודא את האמינות וזמן הפעולה של אשכול GKE.

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה:

מחיקת הפרויקט

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

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים