שימוש ב-Apigee Adapter ל-Envoy עם Apigee Hybrid

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

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

בדוגמה הזו מוסבר איך להשתמש ב-Apigee Adapter ל-Envoy עם פריסת Apigee Hybrid.

דרישות מוקדמות

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

סקירה כללית

בדוגמה הזו מוסבר איך להשתמש ב-Apigee Adapter ל-Envoy עם Apigee Hybrid. בדוגמה הזו, תפרסו שירות HTTP פשוט באותו אשכול Kubernetes שבו נפרס Apigee Hybrid. לאחר מכן, מגדירים את Apigee Adapter ל-Envoy כדי לנהל קריאות ל-API של השירות הזה באמצעות Apigee.

האיור הבא מציג את הארכיטקטורה הבסיסית של שילוב Apigee hybrid:

תצוגה כללית של Envoy Adapter שמשולב בסביבת Apigee Hybrid, כולל מישור הניהול, מישור זמן הריצה ושירותי GCP

‫Envoy proxy נפרס עם שירות ה-HTTP של היעד כ-sidecar של Istio ב-Service mesh של Istio. ה-sidecar מטפל בתעבורת ה-API אל שירות היעד וממנו, ומתקשר עם השירות המרוחק. השירות המרוחק מתקשר גם עם מישור הניהול ההיברידי כדי לאחזר מידע על מוצרי API ועל שרתי proxy.

בדיקת ההגדרות האישיות של gcloud

  1. בודקים שההגדרה של gcloud מוגדרת לפרויקט GCP שמשויך לארגון ההיברידי.

    כדי להציג את ההגדרות הנוכחיות:

    gcloud config list

    במקרה הצורך, מגדירים את מזהה הפרויקט הנכון ב-GCP באמצעות הפקודה הבאה:

    gcloud config set project project-id
  2. צריך לאמת את הפרויקט ב-GCP באמצעות Google Cloud SDK ‏ (gcloud):
    gcloud auth login

הקצאת Apigee Hybrid

בשלב הזה, תשתמשו ב-Remote Service CLI כדי להקצות היברידי באמצעות remote-service proxy ל-API. פקודת ההקצאה גם מגדירה אישור ב-Apigee ויוצרת פרטי כניסה שהשירות המרוחק ישתמש בהם כדי להתחבר בצורה מאובטחת בחזרה ל-Apigee.

  1. עוברים לספרייה $CLI_HOME:
    cd $CLI_HOME
  2. אם אתם לא הבעלים של פרויקט GCP שמשויך לארגון Apigee Hybrid, ודאו שחשבון המשתמש שלכם ב-GCP כולל את התפקיד אדמין של ארגון Apigee, או את התפקידים יוצר API ומבצע פריסה.

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

  3. מריצים את הפקודה הבאה כדי לקבל אסימון גישה:
    TOKEN=$(gcloud auth print-access-token);echo $TOKEN
  4. יוצרים את משתני הסביבה הבאים. המשתנים האלה ישמשו כפרמטרים בסקריפט ההקצאה:
    export ORG=organization_name
    export ENV=environment_name
    export RUNTIME=host_alias_url
    export NAMESPACE=hybrid_runtime_namespace
    export AX_SERVICE_ACCOUNT=analytics_service_account

    כאשר:

    משתנה תיאור
    organization_name השם של הארגון ב-Apigee בהתקנת Apigee Hybrid.
    environment_name השם של סביבה בארגון Apigee Hybrid.
    host_alias_url כתובת URL שכוללת את hostAlias עבור מארח וירטואלי שהוגדר בהגדרה ההיברידית. כתובת ה-URL חייבת להתחיל ב-https://. לדוגמה: https://apitest.apigee-hybrid-docs.net
    hybrid_runtime_namepace מרחב השמות שבו רכיבי זמן הריצה ההיברידיים נפרסים. הערה: מרחב השמות שמוגדר כברירת מחדל לפריסה היברידית הוא apigee.
    analytics_service_account הנתיב לקובץ JSON של מפתח חשבון שירות ב-Google Cloud עם התפקיד Apigee Analytics Agent. תיאור מפורט של הפרמטר הזה מופיע במאמר בנושא פקודת הקצאה.
  5. מריצים את הפקודה הבאה כדי להקצות את שרת ה-proxy של השירות המרוחק ל-Apigee Hybrid:

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

    ./apigee-remote-service-cli provision --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml

    אם אתם משדרגים, משתמשים בפקודה הזו עם הדגל --force-proxy-install כדי להקצות Apigee:

    ./apigee-remote-service-cli provision --force-proxy-install --organization $ORG --environment $ENV \
         --runtime $RUNTIME --namespace $NAMESPACE --analytics-sa $AX_SERVICE_ACCOUNT --token $TOKEN > config.yaml
  6. בודקים את התוכן של הקובץ config.yaml. הוא אמור להיראות בערך כך:
    # Configuration for apigee-remote-service-envoy (platform: GCP)
    # generated by apigee-remote-service-cli provision on 2020-11-20 02:49:28
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          remote_service_api: https://apitest.example.com/remote-service
          org_name: hybrid-gke
          env_name: test
        analytics:
          collection_interval: 10s
        auth:
          jwt_provider_key: https://apitest.example.com/remote-service/token
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-gke-new-test-policy-secret
      namespace: apigee
    type: Opaque
    data:
      remote-service.crt: eyJrZXlzIjpbeyJrdHkiOiJSU0EiLCJhbGci...
      remote-service.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURS...
      remote-service.properties: a2lkPTIwMjAtMDctMDZ...
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: hybrid-gke-new-test-analytics-secret
      namespace: apigee
    type: Opaque
    data:
      client_secret.json: ewogICJ0eXBlIjogInNlcnZ...
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
  7. מחילים את הגדרת השירות (הפלט של הקובץ שנוצר על ידי פקודת ההקצאה) על האשכול:
    kubectl apply -f $CLI_HOME/config.yaml
  8. מאמתים את ה-proxy ואת האישור. הפעולות הבאות אמורות להחזיר JSON תקין:
    curl -i $RUNTIME/remote-service/certs

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

    {
        "keys": [
            {
                "alg": "RS256",
                "e": "AQAB",
                "kid": "2020-05-11T11:32:26-06:00",
                "kty": "RSA",
                "n": "0v-nbTQyAmtVZ-wZRP0ZPIbrVaX91YO9JZ9xCQPb4mOdOSS7yKfTDJGg0KM130sGVYBvR76alN8
                fhrrSDEG5VXG8YYMqPXarwRC7MRJWocCQ_ECYrjDD0_Q018M2HyXZYSd8fhAogi9mVUYsEmCKqJH53Dh1
                jqsHOQzBLKsX0iDO9hEZNFtjbX0UCbSxsUlmBCub7Uj2S-PahA6DEQOMhQjZM7bBMtkTMpFmaJ_RZTmow
                BHP57qMna17R8wHD4kUsO2u_-3HHs5PSj1NrEYoVU2dwLQw0GlkB__ZWeFgXTqot81vb-PmoM9YxwoZrm
                TcHdljugWy_s7xROPzTod0uw"
            }
        ]
    }

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

משתמשים בפקודה apigee-remote-service-cli samples create כדי ליצור קובצי תצורה לדוגמה.

בדוגמה הזו, צריך את הקבצים שנוצרו:

  • httpbin.yaml – הגדרת פריסה לשירות HTTP.
  • apigee-envoy-adapter.yaml – הגדרת פריסה של השירות המרוחק עבור Envoy.
  • envoyfilter-sidecar.yaml – הגדרה שמתקינה EnvoyFilter. למרחב השמות שמוגדר כברירת מחדל.

כדי ליצור את הדוגמאות:

  1. עוברים לספרייה $CLI_HOME.
  2. מריצים את הפקודה הבאה כדי ליצור את הקבצים:

    ./apigee-remote-service-cli samples create -c ./config.yaml

    הקבצים הבאים מופקים בספרייה ./samples:

    ls samples
    apigee-envoy-adapter.yaml envoyfilter-sidecar.yaml httpbin.yaml request-authentication.yaml
    

מידע נוסף זמין במאמר בנושא פקודת דוגמאות.

פריסת שירות בדיקה באשכול

בשלב הזה, תפרסו שירות פשוט לבדיקת בקשות ותשובות של HTTP באותו אשכול שבו נפרס Apigee Hybrid.

  1. מפעילים את ההחדרה של Istio במרחב השמות default של האשכול. בשלב מאוחר יותר, תפרסו Envoy sidecar לאותו אשכול. הפעלת ההחדרה של Istio מאפשרת פריסה של sidecar. בדוגמה הזו נעשה שימוש במרחב השמות default, וכל ההוראות הבאות מניחות שזה המצב.

    אם אתם משתמשים ב-Istio בקוד פתוח:

    kubectl label namespace default istio-injection=enabled --overwrite

    אם אתם משתמשים ב-ASM:

    kubectl label namespace default istio-injection- istio.io/rev=REVISION --overwrite
  2. החלת שירות httpbin פשוט על האשכול במרחב השמות שמוגדר כברירת מחדל:
    kubectl apply -f $CLI_HOME/samples/httpbin.yaml
  3. עכשיו בודקים את השירות. מפעילים שירות curl שפועל באשכול ופותחים טרמינל:
    kubectl run -it curl --image=curlimages/curl --restart=Never -- sh
  4. כדי לבדוק את השירות, מתקשרים אליו מתוך האשכול:
    curl -i httpbin.default.svc.cluster.local/headers

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

    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:09:01 GMT
    content-type: application/json
    content-length: 328
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 7
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-B3-Parentspanid": "69f88bc3e322e157",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "8dd725f30e393d8b",
        "X-B3-Traceid": "38093cd817ad30a569f88bc3e322e157"
      }
    }

הפעלת שירות מרוחק עבור Envoy

בשלב הזה, מפעילים את השירות המרוחק עבור לקוח Envoy ב-Service mesh שבה מותקן Apigee Hybrid. השירות הזה מספק את נקודות הקצה ל-sidecar של Istio שמותקנים בשירותי היעד. תותקן גם תוכנת sidecar עם שירות httpbin.

  1. החלת Apigee Remote Service על service mesh:
    kubectl apply -f $CLI_HOME/samples/apigee-envoy-adapter.yaml
  2. מחילים את EnvoyFilter על קבצי ה-sidecar של Istio במרחב השמות שמוגדר כברירת מחדל. התגית EnvoyFilter מאפשרת ל-httpbin sidecar לתקשר עם Apigee Remote Service.
    kubectl apply -f $CLI_HOME/samples/envoyfilter-sidecar.yaml

בדיקת ההטמעה

  1. עכשיו חוזרים אל מעטפת ה-curl שפתחתם בשלב פריסת שירות בדיקה באשכול ומפעילים את השירות httpbin:
    curl -i httpbin.default.svc.cluster.local/headers
    

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

    curl -i httpbin.default.svc.cluster.local/headers
    HTTP/1.1 403 Forbidden
    date: Tue, 12 May 2020 17:51:36 GMT
    server: envoy
    content-length: 0
    x-envoy-upstream-service-time: 11
  2. מגדירים מוצר API ומקבלים מפתח API כמו שמוסבר במאמר איך מקבלים מפתח API.
  3. מבצעים קריאה ל-API באמצעות המפתח:
    export APIKEY=YOUR_API_KEY
    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: $APIKEY"

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

    curl -i httpbin.default.svc.cluster.local/headers -H "x-api-key: kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS"
    HTTP/1.1 200 OK
    server: envoy
    date: Tue, 12 May 2020 17:55:34 GMT
    content-type: application/json
    content-length: 828
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 301
    
    {
      "headers": {
        "Accept": "*/*",
        "Content-Length": "0",
        "Host": "httpbin.default.svc.cluster.local",
        "User-Agent": "curl/7.70.0-DEV",
        "X-Api-Key": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Accesstoken": "",
        "X-Apigee-Api": "httpbin.default.svc.cluster.local",
        "X-Apigee-Apiproducts": "httpbin",
        "X-Apigee-Application": "httpbin",
        "X-Apigee-Authorized": "true",
        "X-Apigee-Clientid": "kyOTalNNLMPfOSy6rnVeclmVSL6pA2zS",
        "X-Apigee-Developeremail": "jdoe@example.com",
        "X-Apigee-Environment": "envoy",
        "X-Apigee-Organization": "acme-org",
        "X-Apigee-Scope": "",
        "X-B3-Parentspanid": "1476f9a2329bbdfa",
        "X-B3-Sampled": "0",
        "X-B3-Spanid": "1ad5c19bfb4bc96f",
        "X-B3-Traceid": "6f329a34e8ca07811476f9a2329bbdfa"
      }
    }

השלבים הבאים

תעבורת הנתונים של API לשירות httpbin מנוהלת עכשיו על ידי Apigee. אלה כמה תכונות שכדאי לנסות:

  • אם הגדרתם את מוצר ה-API שלכם כמו שמוסבר במאמר איך מקבלים מפתח API, מגבלת המכסה הוגדרה ל-5 בקשות לדקה. כדאי לנסות להתקשר אל שירות httpbin כמה פעמים נוספות כדי להפעיל את המכסה. כשמגיעים למכסה, מוחזרת שגיאה בסטטוס HTTP 403.
  • ניגשים ל-Apigee Analytics בממשק המשתמש של Edge. עוברים אל Analyze > API Metrics > API Proxy Performance.
  • יוצרים אסימוני JWT ומשתמשים בהם כדי לאמת קריאות ל-API.
  • משתמשים ב-CLI כדי לנהל, ליצור אסימונים ולשלוט בהתאמות. פרטים על CLI זמינים במאמר העזר.