פריסות של proxy ל-API נכשלות ללא אזהרה על Pod-ים פעילים של זמן ריצה

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

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

תסמינים

פריסות של שרתי proxy ל-API נכשלות עם האזהרה No active runtime pods בממשק המשתמש של Apigee hybrid.

הודעות שגיאה

האזהרה No active runtime pods מוצגת בתיבת הדו-שיח Details לצד הודעת השגיאה Deployment issues on ENVIRONMENT: REVISION_NUMBER בדף של ה-proxy ל-API:

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

הודעת שגיאה בממשק משתמש היברידי מספר 1: שגיאה במאגר הנתונים

יכול להיות שתראו את השגיאה Datastore בדפים מוצרי API ואפליקציות בממשק המשתמש ההיברידי, כמו שמוצג בהמשך:

הודעת שגיאה בממשק משתמש היברידי מספר 2: שגיאת שרת פנימית

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

פלט פקודה של Kubectl

יכול להיות שתראו שהסטטוסים של הפודים apiege-mart, apigee-runtime ו-apigee- synchronizer משתנים ל-CrashLoopBackOff בפלט הפקודה kubectl get pods:

הודעות שגיאה ביומן הרכיבים

השגיאות הבאות של בדיקת הפעילות יופיעו ביומני ה-podapigee-runtime בגרסאות Apigee hybrid >= 1.4.0:

{"timestamp":"1621575431454","level":"ERROR","thread":"qtp365724939-205","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Error occurred : probe failed Probe cps-datastore-
connectivity-liveliness-probe failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts =
[]}\n\n\tcom.apigee.probe.ProbeAPI.getResponse(ProbeAPI.java:66)\n\tcom.apigee.probe.ProbeAPI.getLiv
eStatus(ProbeAPI.java:55)\n\tsun.reflect.GeneratedMethodAccessor52.invoke(Unknown
Source)\n\tsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\t
","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

{"timestamp":"1621575431454","level":"ERROR","thread":"qtp365724939-205","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Returning error response : ErrorResponse{errorCode =
probe.ProbeRunError, errorMessage = probe failed Probe cps-datastore-connectivity-liveliness-probe
failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts = []}}","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

Cannot build a cluster without contact points השגיאה הבאהapigee-synchronizer תופיע ביומני ה-pod בגרסאות של Apigee Hybrid >= 1.4.0:

{"timestamp":"1621575636434","level":"ERROR","thread":"main","logger":"KERNEL.DEPLOYMENT","message":
"ServiceDeployer.deploy() : Got a life cycle exception while starting service [SyncService, Cannot
build a cluster without contact points] : {}","context":"apigee-service-
logs","exception":"java.lang.IllegalArgumentException: Cannot build a cluster without contact
points\n\tat com.datastax.driver.core.Cluster.checkNotEmpty(Cluster.java:134)\n\tat
com.datastax.driver.core.Cluster.<init>(Cluster.java:127)\n\tat
com.datastax.driver.core.Cluster.buildFrom(Cluster.java:193)\n\tat
com.datastax.driver.core.Cluster$Builder.build(Cluster.java:1350)\n\tat
io.apigee.persistence.PersistenceContext.newCluster(PersistenceContext.java:214)\n\tat
io.apigee.persistence.PersistenceContext.<init>(PersistenceContext.java:48)\n\tat
io.apigee.persistence.ApplicationContext.<init>(ApplicationContext.java:19)\n\tat
io.apigee.runtimeconfig.service.RuntimeConfigServiceImpl.<init>(RuntimeConfigServiceImpl.java:75)
\n\tat
io.apigee.runtimeconfig.service.RuntimeConfigServiceFactory.newInstance(RuntimeConfigServiceFactory.
java:99)\n\tat
io.apigee.common.service.AbstractServiceFactory.initializeService(AbstractServiceFactory.java:301)\n
\tat
...","severity":"ERROR","class":"com.apigee.kernel.service.deployment.ServiceDeployer","method":"sta
rtService"}

השגיאות הבאות של בדיקת הפעילות יופיעו ביומני ה-apigee-martpod בגרסאות Apigee Hybrid >= 1.4.0:

{"timestamp":"1621576757592","level":"ERROR","thread":"qtp991916558-144","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Error occurred : probe failed Probe cps-datastore-
connectivity-liveliness-probe failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts =
[]}\n\n\tcom.apigee.probe.ProbeAPI.getResponse(ProbeAPI.java:66)\n\tcom.apigee.probe.ProbeAPI.getLiv
eStatus(ProbeAPI.java:55)\n\tsun.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)\n\tsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\t","conte
xt":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

{"timestamp":"1621576757593","level":"ERROR","thread":"qtp991916558-144","mdc":{"targetpath":"/v1/pr
obes/live"},"logger":"REST","message":"Returning error response : ErrorResponse{errorCode =
probe.ProbeRunError, errorMessage = probe failed Probe cps-datastore-connectivity-liveliness-probe
failed due to com.apigee.probe.model.ProbeFailedException{ code =
cps.common.datastoreConnectionNotHealthy, message = Datastore connection not healthy, associated
contexts = []}}","context":"apigee-service-
logs","severity":"ERROR","class":"com.apigee.rest.framework.container.ExceptionMapper","method":"toR
esponse"}

מידע על השגיאה No active runtime pods

בגרסה Apigee hybrid 1.4.0, התכונה liveness probe נוספה לתרמילי apigee-runtime ו-apigee-mart כדי לבדוק את הסטטוס של תרמילי Cassandra. אם כל ה-pods של Cassandra לא יהיו זמינים, בדיקות הפעילות של ה-pods‏ apigee-runtime ו-apigee-mart ייכשלו. לכן, תרמילי ה-apigee-runtime ו-apigee-mart יעברו למצב CrashLoopBackOff , ופריסות של שרתי proxy של API ייכשלו עם האזהרה No active runtime pods. גם הפוד apigee-synchronizer יעבור למצב CrashLoopBackOff כי פודי Cassandra לא זמינים.

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

אלה כמה סיבות אפשריות לשגיאה הזו:

מטרה תיאור
פודים של Cassandra מושבתים פודים של Cassandra מושבתים, ולכן פודים של apigee-runtime לא יוכלו לתקשר עם מסד הנתונים של Cassandra.
שכפול Cassandra מוגדר עם פוד אחד בלבד אם יש רק פוד אחד של Cassandra, הוא יכול להפוך לנקודת כשל בודדת.

הסיבה: תרמילי Cassandra מושבתים

במהלך תהליך הפריסה של ה-proxy ל-API, ‏ apigee-runtime pods מתחברים למסד הנתונים של Cassandra כדי לאחזר משאבים, כמו מפות של מפתח/ערך (KVM) ומטמונים, שמוגדרים ב-proxy ל-API. אם אין פודים של Cassandra שפועלים, הפודים של apigee-runtime לא יוכלו להתחבר למסד הנתונים של Cassandra. התוצאה היא כשל בפריסת ה-API Proxy.

אבחון

  1. מציגים רשימה של פודים של Cassandra:
    kubectl -n apigee get pods -l app=apigee-cassandra
    

    פלט לדוגמה 1:

    NAME                         READY   STATUS    RESTARTS   AGE
    apigee-cassandra-default-0   0/1     Pending   0          9m23s

    פלט לדוגמה 2:

    NAME                 READY   STATUS            RESTARTS   AGE
    apigee-cassandra-0   0/1     CrashLoopBackoff  0          10m
  2. מאמתים את הסטטוס של כל Cassandra pod. הסטטוס של כל ה-pods של Cassandra צריך להיות Running. אם אחד מ-pods של Cassandra נמצא במצב שונה, יכול להיות שזו הסיבה לבעיה. כדי לפתור את הבעיה:

רזולוציה

  1. אם אחד מ-pods של Cassandra נמצא במצב Pending, כדאי לעיין במאמר Cassandra pods are stuck in the Pending state כדי לפתור את הבעיה.
  2. אם אחד מ-pods של Cassandra נמצא במצב CrashLoopBackoff, כדאי לעיין במאמר Cassandra pods are stuck in the CrashLoopBackoff state כדי לפתור את הבעיה.

    פלט לדוגמה:

    kubectl -n apigee get pods -l app=apigee-runtime
    NAME                                                           READY   STATUS    RESTARTS   AGE
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-2gnch   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-42jdv   1/1     Running   13         45m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-l7wq7   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-q2thb   1/1     Running   8          38m
    
    kubectl -n apigee get pods -l app=apigee-mart
    NAME                                                  READY   STATUS    RESTARTS   AGE
    apigee-mart-apigee-hybrid-s-2664b3e-143-u0a5c-rtg69   2/2     Running   8          28m
    
    kubectl -n apigee get pods -l app=apigee-synchronizer
    NAME                                                              READY   STATUS    RESTARTS   AGE
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp269nb   2/2     Running   10         29m
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp2w2jp   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpkfkvq   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpxmzhn   2/2     Running   0          4m40s
    

הגורם: עותק Cassandra שהוגדר עם פוד אחד בלבד

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

אבחון

  1. מקבלים את קבוצת ה-Cassandra Stateful ובודקים את מספר העותקים הנוכחי:
    kubectl -n apigee get statefulsets -l app=apigee-cassandra
    

    פלט לדוגמה:

    NAME                               READY           AGE
    apigee-cassandra-default           1/1             21m
  2. אם מספר העותקים מוגדר ל-1, צריך לבצע את השלבים הבאים כדי להגדיל אותו למספר גבוה יותר.

רזולוציה

בפריסות של Apigee Hybrid שאינן בסביבת ייצור, יכול להיות שמספר העותקים של Cassandra מוגדר כ-1. אם זמינות גבוהה של Cassandra חשובה בפריסות שאינן ייצור, צריך להגדיל את מספר העותקים ל-3 כדי לפתור את הבעיה הזו.

כדי לפתור את הבעיה:

  1. מעדכנים את הקובץ overrides.yaml ומגדירים את מספר העותקים של Cassandra ל-3:
    cassandra:
      replicaCount: 3

    מידע על ההגדרה של Cassandra זמין במאמר חומר עזר בנושא מאפייני הגדרה.

  2. מחילים את ההגדרות שלמעלה באמצעות Helm:

    הרצת בדיקה:

      helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE \
      --dry-run
    

    התקנת תרשים Helm

      helm upgrade datastore apigee-datastore/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --atomic \
      -f OVERRIDES_FILE
    
  3. מקבלים את קבוצת ה-Cassandra Stateful ובודקים את מספר העותקים הנוכחי:
    kubectl -n get statefulsets -l app=apigee-cassandra
    

    פלט לדוגמה:

    NAME                              READY         AGE
    apigee-cassandra-default          3/3           27m
  4. מקבלים את ה-pods של Cassandra ובודקים את מספר המופעים הנוכחי. אם לא כל הפודים מוכנים ונמצאים במצב Running, צריך להמתין עד ליצירה ולהפעלה של פודים חדשים של Cassandra:
    kubectl -n get pods -l app=apigee-cassandra

    פלט לדוגמה:

    NAME                         READY   STATUS    RESTARTS   AGE
    apigee-cassandra-default-0   1/1     Running   0          29m
    apigee-cassandra-default-1   1/1     Running   0          21m
    apigee-cassandra-default-2   1/1     Running   0          19m

    פלט לדוגמה:

    kubectl -n apigee get pods -l app=apigee-runtime
    NAME                                                           READY   STATUS    RESTARTS   AGE
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-2gnch   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-42jdv   1/1     Running   13         45m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-l7wq7   1/1     Running   13         43m
    apigee-runtime-apigee-hybrid-s-test1-8b64f12-143-501i7-q2thb   1/1     Running   8          38m
    
    kubectl -n apigee get pods -l app=apigee-mart
    NAME                                                  READY   STATUS    RESTARTS   AGE
    apigee-mart-apigee-hybrid-s-2664b3e-143-u0a5c-rtg69   2/2     Running   8          28m
    
    kubectl -n apigee get pods -l app=apigee-synchronizer
    NAME                                                              READY   STATUS    RESTARTS   AGE
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp269nb   2/2     Running   10         29m
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zp2w2jp   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpkfkvq   2/2     Running   0          4m40s
    apigee-synchronizer-apigee-hybrid-s-test1-8b64f12-143-96zpxmzhn   2/2     Running   0          4m40s
    

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

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

  1. מזהה פרויקט ב-Google Cloud
  2. ארגון Apigee Hybrid/Apigee
  3. ב-Apigee Hybrid: overrides.yaml, אנונימיזציה של מידע רגיש
  4. סטטוס של pod ב-Kubernetes בכל מרחבי השמות:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
    
  5. ‫dump של פרטי אשכול Kubernetes:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*
    

קובצי עזר