בעיות מוכרות ב-GKE Networking

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

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

בוחרים את גרסת GKE:

אפשר גם לחפש את הבעיה:

הגרסאות שזוהו גרסאות קבועות הבעיה והפתרון העקיף
‫1.29, 1.30, 1.31, 1.32, 1.33 1.34

קריסת מאגר cilium-agent בתוך ה-Pod של anetd אחרי מחיקה של מדיניות רשת FQDN

באשכולות שבהם מופעל GKE Dataplane V2, יכול להיות שיתרחש קראש רגעי של cilium-agent קונטיינרים, מה שיוביל לזמן ארוך יותר של תיאום לאירועים שצריך לתכנת במישור הנתונים. הבעיה הזו נגרמת בגלל ביטול הפניה של מצביע nil לאחר מחיקה של מדיניות רשת FQDN.

הבעיה נגרמת בגלל מחיקה של מדיניות רשת FQDN. כשהבעיה מתרחשת, קונטיינר Cilium-agent בתוך ה-Pods של anetd מחזיר הודעת שגיאה שדומה להודעה הבאה: panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x33e237d]


פתרון עקיף:

כדי לפתור את הבעיה הזו, במקום למחוק מדיניות FQDN, אפשר לתקן אותה כך שלא תהיה לה השפעה, על ידי הקפדה על כך שאף Pod לא יהיה כפוף לה:

      kubectl patch fqdnnetpol -n namespace policy-name --patch '
      spec:
        podSelector:
          matchLabels:
            miss: me
      '
    

הפתרון

שדרוג גרסת האשכול לגרסה 1.34

‫1.28, 1.29, 1.30, 1.31, 1.32, 1.33

דליפת כתובות IP של Pod בצמתים עם GKE Dataplane V2

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

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

  • ‫1.33 ואילך
  • ‫1.32 ואילך
  • ‫1.31.2-gke.1115000 ואילך
  • ‫1.30.8-gke.1051001 ואילך
  • ‫1.29.10-gke.1059000 ואילך
  • ‫1.28.15-gke.1024000 ואילך

במקרה כזה, הפעלתם של פודים חדשים שמתוזמנים בצומת המושפע נכשלת ומוחזרת הודעת שגיאה שדומה להודעה הבאה: failed to assign an IP address to container.


פתרון עקיף:

כדי לצמצם את הבעיה, אפשר להחיל את DaemonSet של הפתרון על האשכול כדי לנקות את משאבי ה-IP שדלפו:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cleanup-ipam-dir
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: cleanup-ipam
  template:
    metadata:
      labels:
        name: cleanup-ipam
    spec:
      hostNetwork: true
      securityContext:
        runAsUser: 0
        runAsGroup: 0
        seccompProfile:
          type: RuntimeDefault
      automountServiceAccountToken: false
      containers:
      - name: cleanup-ipam
        image: gcr.io/gke-networking-test-images/ubuntu-test:2022@sha256:6cfbdf42ccaa85ec93146263b6e4c60ebae78951bd732469bca303e7ebddd85e
        command:
        - /bin/bash
        - -c
        - |
          while true; do
          for hash in $(find /hostipam -iregex '/hostipam/[0-9].*' -mmin +10 -exec head -n1 {} \; ); do
          hash="${hash%%[[:space:]]}"
          if [ -z $(ctr -n k8s.io c ls | grep $hash | awk '{print $1}') ]; then
          grep -ilr $hash /hostipam
          fi
          done | xargs -r rm
          echo "Done cleaning up /var/lib/cni/networks/gke-pod-network at $(date)"
          sleep 120s
          done
        volumeMounts:
        - name: host-ipam
          mountPath: /hostipam
        - name: host-ctr
          mountPath: /run/containerd
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
      volumes:
      - name: host-ipam
        hostPath:
          path: /var/lib/cni/networks/gke-pod-network
      - name: host-ctr
        hostPath:
          path: /run/containerd

‫1.31, ‏ 1.32, ‏ 1.33
  • ‫1.33.1-gke.1107000 ואילך
  • ‫1.32.8-gke.1108000 ואילך

הפסקות זמניות במאזני עומסים של Ingress ושל שירותים באשכולות עם רשת מדור קודם

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

הבעיה משפיעה על אשכולות GKE שמשתמשים ברשת מדור קודם ופועלים בגרסה 1.31 ואילך.

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

    gcloud container clusters describe CLUSTER_NAME --location=LOCATION --format="value(subnetwork)"
  

אם מריצים את הפקודה הזו על אשכול עם רשת מדור קודם, הפלט יהיה ריק.

פתרון עקיף:

רשתות מדור קודם הוצאו משימוש לפני זמן מה, ולכן הפתרון המומלץ הוא להעביר את הרשת מדור קודם לרשת VPC. אפשר לעשות את זה על ידי המרת רשת מדור קודם שמכילה אשכולות GKE. אם אתם לא יכולים לבצע את ההעברה הזו כרגע, תוכלו לפנות אל Cloud Customer Care.

‫1.30, 1.31, 1.32
  • ‫1.30.10-gke.1070000 ואילך
  • ‫1.31.5-gke.1068000 ואילך
  • ‫1.32.1-gke.1002000 ואילך

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

יכול להיות שמאזני עומסים (LB) שנוצרו לשירותים פנימיים של LoadBalancer לא יכללו צמתים חדשים שנוצרו בקבוצת המכונות של הבק-אנד. Google Cloud

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

פתרונות אפשריים:

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

    הערה: אי אפשר להשבית את חלוקת המשנה ב-GKE אחרי שמפעילים אותה.

  • יוצרים עוד שירות פנימי של איזון עומסים. במהלך הסנכרון, גם קבוצת המופעים תתוקן בשירות המושפע. אפשר להסיר את השירות החדש אחרי הסנכרון.
  • מוסיפים ואז מסירים את התווית node.kubernetes.io/exclude-from-external-load-balancers מאחד הצמתים.
  • הוספת צומת לאשכול. אפשר להסיר את הצומת אחרי שהשירות מתחיל לפעול.
‫1.31,1.32
  • ‫1.31.7-gke.1158000 ואילך
  • ‫1.32.3-gke.1499000 ואילך

בעיות ב-Gateway API בגלל הסרת storedVersions ממצב CRD

‫Kube-Addon-Manager ב-GKE מסיר באופן שגוי את v1alpha2 storedVersion מהסטטוס של Gateway API CRD כמו gateway,‏ httpRoute,‏ gatewayClass ו-referenceGrant. הבעיה הזו מתרחשת גם כשיש עדיין מופעים של ה-CRD האלה באשכול בפורמט v1alpha2. אם משדרגים את הגרסה של אשכול GKE בלי storedVersions, הקריאות ל-Gateway API נכשלות. הקריאות שנכשלו עלולות גם לשבור בקרי שמטמיעים את Gateway API.

האשכול שלכם עלול להיות בסיכון אם מתקיימים כל התנאים הבאים:

  • ‫Gateway API מופעל באשכול.
  • בשלב כלשהו בעבר התקנתם גרסה של CRD של Gateway API.v1alpha2
  • האשכול שלכם פועל בגרסת GKE שמושפעת מהבעיה.

פתרון עקיף:

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

לחלופין, אם אתם צריכים לשדרג את גרסת האשכול, אתם צריכים לעדכן את גרסת האחסון של כל ה-CRD של Gateway API המושפעים ל-v1beta1. בדוגמה הבאה מעדכנים את ה-CRD‏ gatewayClass:

  1. בודקים אם קיימת v1alpha2 גרסת האחסון:
    kubectl get crd gatewayclasses.gateway.networking.k8s.io -ojsonpath="{.status.storedVersions}"
  2. כדי לשנות את גרסת האחסון ל-v1beta1, מריצים את הפקודה הבאה בכל משאבי GatewayClass שקיימים באשכול:
    kubectl annotate gatewayclass gateway-class-name bump-storage-version="yes"
  3. מסירים את גרסת האחסון v1alpha2 ומגדירים את גרסת האחסון ל-v1beta1:
    kubectl patch customresourcedefinitions gatewayclasses.gateway.networking.k8s.io --subresource='status' --type='merge' -p '{"status":{"storedVersions":["v1beta1"]}}'
  4. מבצעים את השדרוג כרגיל.
‫1.32
  • ‫1.32.3-gke.1170000 ואילך

הפעלת Pods חדשים נכשלת והם נתקעים במצב ContainerCreating

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

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "[sandbox-ID]": plugin type="cilium-cni" failed (add): unable to create endpoint: Cilium API client timeout exceeded

הבעיה משפיעה על אשכולות GKE בגרסאות שבין 1.32 לבין גרסאות מוקדמות מ-1.32.3-gke.1170000, שנוצרו בגרסאות GKE 1.31 או 1.32. הסיבה הבסיסית היא שמבנה נתונים בזיכרון ששמר אוסף של זהויות Cilium שהוקצו לא סונכרן בצורה נכונה עם מצב שרת Kubernetes API.

כדי לוודא את גרסת GKE ששימשה ליצירת האשכול, אפשר להריץ שאילתה על משאב initialClusterVersion באמצעות הפקודה הבאה:

  gcloud container clusters describe [cluster_name] --location [location] --format='value(initialClusterVersion)'
  

אם הרישום ביומן מופעל באשכול GKE, מאגר cilium-agent רושם את ההודעה unable to resolve identity: timed out waiting for cilium-operator to allocate CiliumIdentity for key ב-Logs Explorer באמצעות השאילתה הבאה:

   resource.type="k8s_container"
   resource.labels.container_name="cilium-agent"
  

פתרון עקיף:

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

  gcloud container clusters upgrade [cluster_name] --location [location] --cluster-version=[version] --master
  
‫1.27,‏ 1.28,‏ 1.29,‏ 1.30,‏ 1.31

ה-NEG Controller מפסיק לנהל נקודות קצה כשמסירים יציאה משירות

אם בקר ה-NEG מוגדר ליצור Standalone NEG עבור שירות, ואחת מהיציאות המוגדרות מוסרת מהשירות בהמשך, בקר ה-NEG יפסיק בסופו של דבר לנהל את נקודות הקצה של ה-NEG. בנוסף לשירותים שבהם המשתמש יוצר הערה של NEG עצמאי, זה משפיע גם על שירותים שמפנים אליהם שער GKE,‏ MCI ושער GKE מרובה אשכולות.

פתרון עקיף:

כשמסירים יציאה משירות עם הערה של Standalone NEG, צריך לעדכן גם את ההערה כדי להסיר את היציאה הרלוונטית.

‫1.28

שגיאה בהגדרת TLS של שער

זיהינו בעיה בהגדרת TLS לשערי כניסה באשכולות שמופעלת בהם גרסת GKE‏ 1.28.4-gke.1083000. הדבר משפיע על הגדרות TLS שמשתמשות ב-SSLCertificate או ב-CertificateMap. אם משדרגים אשכול עם שערים קיימים, העדכונים שבוצעו בשער ייכשלו. במקרה של שערים חדשים, מאזני העומסים לא יוקצו. הבעיה הזו תיפתר בגרסת תיקון (patch) קרובה של GKE 1.28.

‫1.27,‏ 1.28,‏ 1.29
  • ‫1.26.13-gke.1052000 ואילך
  • ‫1.27.10-gke.1055000 ואילך
  • ‫1.28.6-gke.1095000 ואילך
  • ‫1.29.1-gke.1016000 ואילך

כשלים לסירוגין ביצירת חיבור

יכול להיות שבאשכולות בגרסאות של מישור הבקרה 1.26.6-gke.1900 ואילך יתרחשו כשלים לסירוגין בהקמת חיבורים.

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

‫1.27,‏ 1.28,‏ 1.29
  • ‫1.27.11-gke.1118000 ואילך
  • ‫1.28.7-gke.1100000 ואילך
  • ‫1.29.2-gke.1217000 ואילך

בעיות בפענוח DNS במערכת הפעלה שמותאמת לקונטיינרים

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

‫1.28 ‫1.28.3-gke.1090000 ואילך

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

באשכולות שבהם מופעל GKE Dataplane V2, כש-Pod של לקוח מתחבר לעצמו באמצעות שירות או כתובת ה-IP הווירטואלית של מאזן עומסי רשת פנימי מסוג passthrough, חבילת התשובה לא מזוהה כחלק מחיבור קיים בגלל חיפוש שגוי של conntrack ב-dataplane. המשמעות היא שמדיניות רשת שמגבילה תעבורת נתונים נכנסת (ingress) ל-Pod נאכפת באופן שגוי על החבילה.

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

פתרון עקיף:

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

‫1.27,1.28
  • ‫1.28.3-gke.1090000 ואילך
  • ‫1.27.11-gke.1097000 ואילך

אובדן מנות בזרימות של חיבורי hairpin

בקטעי קוד עם GKE Dataplane V2 מופעל, כש-Pod יוצר חיבור TCP לעצמו באמצעות Service, כך ש-Pod הוא גם המקור וגם היעד של החיבור, מעקב החיבורים של GKE Dataplane V2 eBPF עוקב אחרי מצבי החיבור באופן שגוי, מה שמוביל לדליפה של רשומות conntrack.

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

פתרון עקיף:

אפשר לנסות את הפתרונות הבאים:

  • הפעלה של שימוש חוזר ב-TCP (keep-alives) באפליקציה שפועלת ב-Pod שאולי מתקשר עם עצמו באמצעות שירות. כך נמנעת הנפקת דגל ה-FIN של TCP ונמנעת דליפה של רשומת מעקב החיבור.
  • כשמשתמשים בחיבורים לטווח קצר, חושפים את ה-Pod באמצעות מאזן עומסים של שרת proxy, כמו Gateway, כדי לחשוף את השירות. כתוצאה מכך, היעד של בקשת החיבור מוגדר לכתובת ה-IP של מאזן העומסים, ומונע מ-GKE Dataplane V2 לבצע SNAT לכתובת ה-IP של ה-loopback.
גרסה מוקדמת יותר מ-1.31.0-gke.1506000 ‫1.31.0-gke.1506000 ואילך

הקלדת רשת במכשיר ב-GKE multi-network נכשלת עם שמות רשת ארוכים

יצירת האשכול נכשלת עם השגיאה הבאה:

error starting very-long-string-that-exceeds-character-limit-gpu-nic0 device plugin endpoint: listen unix /var/lib/kubelet/plugins_registry/networking.gke.io.networks_very-long-string-that-exceeds-character-limit-gpu-nic0.sock: bind: invalid argument

פתרון עקיף:

הגבלת האורך של שמות אובייקטים ברשת לפי סוג המכשיר ל-41 תווים או פחות. הנתיב המלא של כל שקע דומיין של UNIX מורכב, כולל שם הרשת המתאים. יש מגבלה ב-Linux על אורך נתיבי שקע (עד 107 בייט). אחרי שכוללים את הספרייה, הקידומת של שם הקובץ והסיומת .sock, שם הרשת מוגבל למקסימום של 41 תווים.

‫1.27, 1.28, 1.29, 1.30
  • ‫1.30.4-gke.1282000 ואילך
  • ‫1.29.8-gke.1157000 ואילך
  • ‫1.28.13-gke.1078000 ואילך
  • ‫1.27.16-gke.1342000 ואילך

בעיות בקישוריות של hostPort Pods אחרי שדרוג של מישור הבקרה

באשכולות שבהם מדיניות הרשת מופעלת, יכולות להיות בעיות בקישוריות עם Pods של hostPort. בנוסף, יכול להיות שיעברו עוד 30 עד 60 שניות עד ש-Pods חדשים יהיו מוכנים.

הבעיה מתרחשת כשמשדרגים את מישור הבקרה של GKE באשכול לאחת מהגרסאות הבאות של GKE

  • ‫1.30 עד 1.30.4-gke.1281999
  • ‫1.29.1-gke.1545000 עד 1.29.8-gke.1156999
  • ‫‎1.28.7-gke.1042000 עד ‎1.28.13-gke.1077999
  • ‫1.27.12-gke.1107000 עד 1.27.16-gke.1341999

פתרון עקיף:

משדרגים או יוצרים מחדש צמתים מיד אחרי שדרוג מישור הבקרה של GKE.

‫1.31, 1.32
  • ‫1.32.1-gke.1729000 ואילך
  • ‫1.31.6-gke.1020000 ואילך

תעבורת UDP שבורה בין Pods שפועלים באותו צומת

באשכולות שבהם הופעלה חשיפה בתוך הצומת, יכול להיות שתהיה תנועת UDP שבורה בין Pods שפועלים באותו צומת.

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

  • ‫1.32.1-gke.1729000 ואילך
  • ‫1.31.6-gke.1020000 ואילך

הנתיב המושפע הוא תעבורת UDP מ-Pod ל-Pod באותו צומת דרך Hostport או Service.

הפתרון

משדרגים את האשכול לאחת מהגרסאות המתוקנות הבאות:

  • ‫1.32.3-gke.1927000 ואילך
  • ‫1.31.7-gke.1390000 ואילך
‫1.28, 1.29, 1.30, 1.31

תקינות הפודים של Calico באשכולות עם פחות מ-3 צמתים בסך הכול ומעבדי vCPU לא מספיקים

אי אפשר לתזמן את הפודים calico-typha ו-calico-node באשכולות שעומדים בכל התנאים הבאים: יש פחות מ-3 צמתים בסך הכול, לכל צומת יש מכסת ליבות וירטואליות (vCPU) של 1 או פחות, ומדיניות הרשת מופעלת. הסיבה לכך היא מחסור במשאבי CPU.

פתרונות אפשריים:

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

הפסקות זמניות בשערים מרובי-אשכולות (MCG) באשכולות אזוריים במהלך שדרוגים של רמת הבקרה

פריסות שמשתמשות ב-Multi-Cluster Gateway ‏ (MCG) באשכולות אזוריים של GKE עלולות לחוות הפסקות שירות עם שגיאות מסוג `503` במהלך אירועים שגורמים להפעלה מחדש של מישור הבקרה, כמו שדרוג של אשכול. הבעיה הזו מתרחשת כי MCG מסתמך על מנגנון מדור קודם לגילוי של קבוצת נקודות קצה ברשת (NEG), שמדווח באופן שגוי על אפס בק-אנדים כשצמתים באשכול אזורי הופכים ללא זמינים באופן זמני במהלך ההפעלה מחדש של מישור הבקרה. כתוצאה מכך, מאזן העומסים מסיר את כל השרתים העורפיים, מה שגורם לאובדן תנועה.

פתרונות אפשריים:

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

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

NEG is not attached to any BackendService with health checking. Marking condition "cloud.google.com/load-balancer-neg-ready" to True.

הבעיה הזו גורמת למאזן העומסים לדווח על שגיאה 503 (failed_to_pick_backend) בתעבורה בזמן ש-GKE מבצע את העדכון המתגלגל בעומס העבודה של הפריסה.

אם יש מספר קטן יחסית של Pods (לדוגמה, 2) בהשוואה למספר ה-NEGs, הסיכון ל מרוץ תהליכים הזה גדל. נוצרים NEGs לכל אזור, עם NEG אחד לכל אזור, מה שבדרך כלל מוביל לשלושה NEGs. אם יש מספר גדול יחסית של Pods, כך שלכל NEG יש תמיד כמה Pods לפני שתהליך העדכון בהדרגה (rolling) מתחיל, הסיכוי להפעלת מרוץ תהליכים זה הוא נמוך מאוד.

פתרון עקיף:

הדרך הכי טובה למנוע את מרוץ התהליכים הזה היא להוסיף עוד שרתים עורפיים לקבוצת נקודות הקצה ברשת. חשוב לוודא ששיטת העדכון בהדרגה (rolling) מוגדרת כך שלפחות Pod אחד תמיד פועל. לדוגמה, אם רק 2 פודים פועלים בדרך כלל, הגדרה לדוגמה יכולה להיראות כך:

strategy:
   type: RollingUpdate
   rollingUpdate:
     maxUnavailable: 0
     maxSurge: 1
    

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

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

פתרון עקיף:

כדי לראות את קבוצות ה-NEG בפרויקט, מריצים את הפקודה הבאה:

gcloud compute network-endpoint-groups list

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

כדי למחוק NEG, מריצים את הפקודה הבאה ומחליפים את <var>NEG_NAME</var> בשם ה-NEG:

gcloud compute network-endpoint-groups delete <var>NEG_NAME</var>

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


פתרון עקיף:

כדי לוודא שלא יהיו שיבושים בשירות בגלל פריסת עומסי עבודה, צריך להגדיר את הערכים של minReadySeconds ושל terminationGracePeriodSeconds ל-60 שניות ומעלה.

  • terminationGracePeriodSeconds מאפשרת ל-Pod להיסגר בצורה מסודרת על ידי המתנה לסיום החיבורים אחרי שתזמנו מחיקה של Pod.
  • minReadySeconds מוסיף תקופת השהיה אחרי שנוצר Pod.

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