קריאות ל-API נכשלות עם שגיאות של פסק זמן

הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.

לעיון במסמכי התיעוד של Apigee Edge

תיאור הבעיה

יכול להיות שתבחינו באחד מהסימפטומים הבאים:

  1. אפליקציות הלקוח מקבלות שגיאות של זמן קצוב לתפוגה כתגובה לקריאות ל-API ב-Apigee hybrid.
  2. מופיעות שגיאות כמו Error from server (invalid) או The Job "apigee-resources-install" is invalid במהלך החלת ההגדרה (overrides.yaml) על האשכול במהלך התקנה היברידית.

הודעות שגיאה

יכול להיות שתיתקלו באחת מהשגיאות הבאות:

תגובת שגיאה לקריאות ל-API

בקשות API ב-Apigee Hybrid עשויות להיכשל ולהציג את הודעת השגיאה הבאה:

* Connection failed
* connect to 34.84.67.39 port 443 failed: Operation timed out
* Failed to connect to example.apis.com port 443: Operation timed out
* Closing connection 0
curl: (7) Failed to connect to example.apis.com port 443: Operation timed out

שגיאות שנצפו במהלך החלת ההגדרה (overrides.yaml) על אשכולות

יכול להיות שתיתקלו באחת מהשגיאות הבאות במהלך החלת ההגדרה (קובץ overrides.yaml) על אשכולות במהלך ההתקנה:

שגיאה מספר 1

helm upgrade operator apigee-operator/ \
  --install \
  --create-namespace \
  --namespace APIGEE_NAMESPACE \
  --atomic \
  -f OVERRIDES_FILE

...
...
Error from server (Invalid): error when applying patch:
to:
Resource: "batch/v1, Resource=jobs", GroupVersionKind: "batch/v1, Kind=Job"
Name: "istio-init-crd-10-1.4.6", Namespace: "istio-system"
to:
Resource: "batch/v1, Resource=jobs", GroupVersionKind: "batch/v1, Kind=Job"
Name: "istio-init-crd-11-1.4.6", Namespace: "istio-system"
to:
Resource: "batch/v1, Resource=jobs", GroupVersionKind: "batch/v1, Kind=Job"
Name: "istio-init-crd-14-1.4.6", Namespace: "istio-system"

שגיאה מספר 2

helm upgrade operator apigee-operator/ \
--install \
--create-namespace \
--namespace APIGEE_NAMESPACE \
--atomic \
-f OVERRIDES_FILE

...
...
The Job "apigee-resources-install" is invalid: spec.template: Invalid value:
core.PodTemplateSpec{ObjectMeta:v1.ObjectMeta{Name:"apigee-resources-install",
GenerateName:"", Namespace:"", SelfLink:"", UID:"", ResourceVersion:"",
Generation:0,

סיבות אפשריות

השגיאות האלה יכולות לקרות אם שירות istio-ingressgateway נמצא במצב pending ולא יכול להתחבר לכתובת IP חיצונית, כמו שמוצג בהמשך:

kubectl get services -n istio-system
NAME                      TYPE         CLUSTER-IP   EXTERNAL-IP  PORT(S)             AGE
istio-ingressgateway      LoadBalancer 10.198.5.104 <pending>    15020:31927/TCP,    12h
                                                                 80:31381/TCP,
                                                                 443:31391/TCP,
                                                                 31400:31401/TCP,
                                                                 15443:32623/TCP

יכולות להיות כמה סיבות לכך שהשירות istio-ingressgateway יהיה במצב pending:

מטרה תיאור
משימות במצב שגיאה או בהמתנה במרחב השמות istio-system יכול להיות שהמשימות incomplete/erroneous במרחב השמות istio-system יגרמו לשירות istio-ingressgateway להיות במצב pending לנצח ולא יוכל להתחבר לכתובת IP חיצונית.
טווח כתובות IP שגוי שהוקצה למאזן עומסים חיצוני יכול להיות שטווח כתובות ה-IP שגוי מוגדר בקובץ istio-operator.yaml, ולכן השירות istio-ingressgateway נכנס למצב pending לתמיד ולא יכול להתחבר לכתובת IP חיצונית במהלך ההתקנה.

הגורם: משימות במרחב השמות istio-system במצב שגיאה או בהמתנה

אבחון

  1. כדי לבדוק את סטטוס העבודות במרחב השמות istio-system, משתמשים בפקודה הבאה:
    kubectl get jobs -n istio-system
    
  2. הסטטוס של המשרות צריך להיות complete. אם הסטטוס של העבודות הוא erroneous/pending, זו הסיבה לבעיה.

רזולוציה

  1. אם אחת מהמשימות במצב pending או erroneous, מוחקים אותה באמצעות הפקודה הבאה:
    kubectl -n istio-system delete job JOB_NAME_FROM_STEP_1
    
  2. מריצים מחדש את ההתקנה על ידי החלת הקובץ overrides.yaml:

    מעדכנים את apigee-serving-cert באמצעות Helm:

    helm install operator apigee-operator/
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f OVERRIDES_FILE \
    --dry-run=server

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

    מתקינים את התרשים:

    helm upgrade operator apigee-operator/
    --namespace APIGEE_NAMESPACE \
    --atomic \
    -f OVERRIDES_FILE

הסיבה: טווח כתובות IP שגוי הוקצה למאזן עומסים חיצוני

אבחון

  1. בודקים את כתובת ה-IP שהוגדרה למאזן העומסים בקובץ istio- operator.yaml. לדוגמה, בקטע הקוד הבא אפשר לראות את המיקום בקובץ istio-operator.yaml שבו מוגדרת כתובת ה-IP:
    -name: istio-ingressgateway
      enabled: true
      k8s:
        service:
          type: LoadBalancer
         loadBalancerIP: 10.195.24.23
  2. שירות istio-ingressgateway מוגדר כמאזן עומסים (כפי שמצוין בסוג) בקובץ istio-operator.yaml. במהלך ההתקנה של ASM, נוצר מאזן עומסים עם כתובת ה-IP שהוגדרה, והוא מחובר כדי לתקשר עם שירות istio- ingressgateway. לכן, כתובת ה-IP שהוגדרה צריכה להיות נכונה ושמורה למאזן העומסים.
  3. צריך לפנות לצוות הרשת ולוודא שכתובת ה-IP שהוגדרה עבור loadBalancerIP נכונה. אם היא לא נכונה, שירות מאזן העומסים לא יוכל להתחבר לכתובת ה-IP. כתוצאה מכך, השירות istio-ingressgateway יישאר במצב pending לנצח.

רזולוציה

  1. עובדים עם צוות הרשת ומגדירים את כתובת ה-IP הנכונה בקובץ istio- operator.yaml.
  2. מריצים מחדש את ההתקנה של Apigee ingress gateway ומחילים את הקובץ overrides.yaml:
    helm upgrade $ORG_NAME apigee-org/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE

צריך לאסוף פרטי אבחון

אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את נתוני האבחון הבאים ואז לפנות לצוות התמיכה של Google Cloud Customer Care:

  1. מזהה הפרויקט ב-Google Cloud
  2. השם של הארגון ב-Apigee Hybrid
  3. שם אשכול Kubernetes
  4. שם הפרויקט ב-Google Cloud אם אשכול Kubernetes נמצא בפרויקט אחר ב-Google Cloud
  5. הקובץ overrides.yaml
  6. קובץ Istio-operator .yaml שמשמש במהלך ההתקנה של ASM.
  7. איסוף היומנים מכל תא istio-ingressgateway במרחב השמות istio-system:
    kubectl logs NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.log
    
  8. אוספים את התיאור של כל פוד במרחב השמות istio-system:
    kubectl describe pod NAME_OF_ISTIO_INGRESSGATEWAY_POD -n istio-system > /tmp/NAME_OF_ISTIO_INGRESSGATEWAY_POD.yaml
    
  9. אוספים את רשימת השירותים במרחב השמות istio-system:
    kubectl get svc -n istio-system