פתרון בעיות ב-Cloud Endpoints ב-GKE

במאמר הזה מוצגות טכניקות לפתרון בעיות בפריסות של Endpoints ב-Google Kubernetes Engine ‏ (GKE) וב-Kubernetes.

נכשל ב-kubectl create -f gke.yaml

אם מוצגת לכם הודעת השגיאה Failed in kubectl create -f gke.yaml, אתם יכולים לפעול לפי השלבים הבאים:

  1. אישור gcloud:

    gcloud auth login
    gcloud auth application-default login
    
  2. יוצרים אשכול. אפשר להשתמש בפקודה gcloud הבאה או ליצור אשכול באמצעות מסוףGoogle Cloud .

    gcloud container clusters create CLUSTER_NAME
    

    מחליפים את CLUSTER_NAME בשם האשכול.

  3. מקבלים פרטי כניסה לאשכול ומאפשרים ל-kubectl לגשת אליהם:

    gcloud container clusters get-credentials CLUSTER_NAME
    

המדדים והיומנים של נקודות הקצה לא מוצגים

אם אתם מצליחים לשלוח בקשות ל-API, אבל לא רואים מדדים או יומנים בדף Endpoints > Services במסוףGoogle Cloud , נסו את הפעולות הבאות:

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

גישה ליומנים מ-Extensible Service Proxy

אם אתם צריכים לגשת ליומנים של Extensible Service Proxy ‏ (ESP) כדי לאבחן בעיות, אתם יכולים להשתמש ב-kubectl באופן הבא:

  1. כדי לקבל את שם הפוד:

    kubectl get pod
    
    NAME                       READY     STATUS    RESTARTS   AGE
    esp-echo-174578890-x09gl   2/2       Running   2          21s
    

    שם ה-pod הוא esp-echo-174578890-x09gl ויש בו שני קונטיינרים: esp ו-echo.

  2. כדי לראות את היומנים ב-pod, משתמשים בפקודה kubectl logs:

    kubectl logs POD_NAME -c CONTAINER_NAME
    

    כאשר POD_NAME ו-CONTAINER_NAME מוחזרים מהפקודה kubectl get pod בשלב הקודם. לדוגמה:

      kubectl logs esp-echo-174578890-x09gl -c esp
    

אימות שם השירות

אם מוצגת הודעת השגיאה Fetching service config failed, צריך לוודא ששם השירות שצוין בשדה --service בקובץ מניפסט הפריסה (שנקרא קובץ deployment.yaml) זהה לשם בשדה host במסמך OpenAPI (שנקרא קובץ openapi.yaml).

אם השם השגוי מופיע בקובץ deployment.yaml:

  1. פותחים את הקובץ deployment.yaml ועוברים לקטע שהוגדר עבור מאגר התגים של ספק שירותי הדוא"ל. לדוגמה:

    containers:
    - name: esp
      image: gcr.io/endpoints-release/endpoints-runtime:1
      args: [
        "--http_port=8081",
        "--backend=127.0.0.1:8080",
        "--service=SERVICE_NAME",
        "--rollout_strategy=managed"
      ]
    

    משנים את SERVICE_NAME כך שיתאים לשם בשדה host ב-openapi.yaml ושומרים את הקובץ deployment.yaml.

  2. מפעילים את שירות Kubernetes:

      kubectl create -f deployment.yaml
    

אם השם השגוי מופיע בקובץ openapi.yaml:

  1. מקבלים את שם השירות ש-Endpoints הוגדר להשתמש בו.

  2. מוחקים את השירות:

    gcloud endpoints services delete SERVICE_NAME
    

    מחליפים את SERVICE_NAME בשם מהשלב הקודם. יעברו 30 ימים עד שהשירות יימחק מ-Google Cloud. במהלך התקופה הזו, לא תוכלו להשתמש שוב בשם השירות.

  3. פותחים את קובץ openapi.yaml, מתקנים את השם בשדה host ושומרים את הקובץ.

  4. פורסים את הגדרת השירות המעודכנת:

      gcloud endpoints services deploy openapi.yaml
    
  5. ממתינים עד שהפריסה של הגדרות השירות תושלם.

  6. מפעילים את שירות Kubernetes:

      kubectl create -f deployment.yaml
    

בדיקת קובצי ההגדרות

  1. משתמשים ב-ssh כדי להתחבר ל-Pod באמצעות kubectl:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

    מחליפים את CONTAINER_NAME בשם של הקונטיינר ואת POD_NAME בשם של ה-Pod.

  2. בספרייה etc/nginx/endpoints/, בודקים אם יש שגיאות בקובצי ההגדרות הבאים:

    • nginx.conf- קובץ ההגדרות nginx עם הנחיות ESP
    • service.jso – קובץ הגדרת השירות

גישה לדף הסטטוס של נקודות הקצה

אם הגדרתם את rollout_strategy ל-managed כשהתחלתם את ESP, ואתם צריכים לגלות את מזהה ההגדרה שמופע של ESP משתמש בו, המידע מופיע בדף הסטטוס של Endpoints.

כדי לגשת לדף הסטטוס של נקודות הקצה:

  1. משתמשים ב-ssh כדי להתחבר ל-Pod באמצעות kubectl:

    kubectl exec -ti -c CONTAINER_NAME POD_NAME bash
    

    מחליפים את CONTAINER_NAME בשם הקונטיינר ואת POD_NAME בשם הפוד.

  2. מתקינים את curl.

  3. כתבו:

      curl http://localhost:8090/endpoints_status
    

    יוצג משהו דומה לזה:

    "serviceConfigRollouts": {
        "rolloutId": "2017-08-09r27",
        "percentages": {
             "2017-08-09r26": "100"
        }
    }
    

הערך ב-rolloutId הוא מזהה הגדרות השירות שבו ESP משתמש. כדי לוודא ש-ESP משתמש באותה הגדרה כמו Endpoints, אפשר לעיין במאמר בנושא אחזור שם השירות ומזהה ההגדרה.