עדכון של כללי מדיניות לניהול API באמצעות Apigee Operator for Kubernetes

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

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

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

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

לפני שמתחילים במשימה הזו, חשוב לבצע את השלבים שמתוארים במאמר בנושא יצירת APIMExtensionPolicy. בדף הזה מניחים שהגדרתם אשכול Google Kubernetes Engine‏ (GKE), התקנתם את Apigee Operator for Kubernetes, יצרתם שער Google Kubernetes Engine‏ (GKE) והחלתם לפחות מדיניות אחת לניהול API על השער.

התפקידים הנדרשים

אם הקציתם לחשבון השירות את התפקידים הנדרשים כמו שמתואר במאמר התקנת Apigee Operator ל-Kubernetes, לא נדרשים תפקידים או הרשאות נוספים ב-IAM כדי להשלים את המשימות האלה.

אתם יכולים לבחור להרשות פעולות במשאבים באשכול Google Kubernetes Engine באמצעות מנגנון בקרת הגישה מבוססת-התפקידים (RBAC) המובנה ב-Kubernetes. מידע נוסף זמין במאמר מתן הרשאה לפעולות באשכולות באמצעות בקרת גישה מבוססת-תפקידים.

הוספה של Gateway ו-HTTPRoute חדשים

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

אפשר להשתמש ב-Apigee Operator for Kubernetes עם שערים פנימיים או חיצוניים של GKE, אבל אי אפשר לפרוס את שני סוגי השערים באותו אזור.

כדי להוסיף Gateway ו-HTTPRoute חדשים לאשכול, מבצעים את השלבים הבאים:

  1. מגדירים שער GKE חיצוני חדש. מידע נוסף והוראות מפורטות זמינים במאמר בנושא פריסת שער חיצוני.
  2. יוצרים משאב גלובלי SslCertificate בניהול Google:
    gcloud compute ssl-certificates create CERT_NAME \
      --domains=HOST_NAME \
      --global

    כאשר:

    • CERT_NAME הוא השם של האישור שרוצים ליצור.
    • HOST_NAME_2 הוא שם המארח של השער החדש.

  3. יוצרים קובץ חדש בשם gateway2.yaml במרחב השמות apim.
  4. מעתיקים את התוכן הבא לקובץ החדש:
    # gateway2.yaml
    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: Gateway
    metadata:
      name: global-ext-lb2
      spec:
      gatewayClassName: gke-l7-global-external-managed
      listeners:
      - name: https
        protocol: HTTPS
        allowedRoutes:
          kinds:
          - kind: HTTPRoute
          namespaces:
            from: All
        port: 443
        tls:
          options:
            networking.gke.io/pre-shared-certs: CERT_NAME
  5. מוסיפים קובץ HTTPRoute חדש ל-/post לאותו קובץ, כמו שמודגש למטה:
    # http-route2.yaml
      apiVersion: gateway.networking.k8s.io/v1beta1
      kind: HTTPRoute
      metadata:
        name: http-bin-route-post
        namespace: http
      spec:
        parentRefs:
          - kind: Gateway
            name: global-ext-lb2
            namespace: default
        hostnames:
          - HOST_NAME_2
        rules:
        - matches:
          - path:
              type: PathPrefix
              value: "/post"
          backendRefs:
          - name: httpbin
            kind: Service
            port: 80
            namespace: http
  6. החלת ה-Gateway וה-HTTPRoute החדשים:
    kubectl apply -f gateway2.yaml
  7. בודקים את הסטטוס של HTTPRoute באמצעות הפקודה הבאה::
    kubectl -n http get HttpRoute

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

    NAME             HOSTNAMES                                                  AGE
    http-bin-route   ["my-hostname-2"]   12d
    
  8. בודקים את סטטוס השער באמצעות הפקודה הבאה:
    kubectl get gateway global-ext-lb2

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

    NAME             CLASS                            ADDRESS        PROGRAMMED   AGE
    global-ext-lb2   gke-l7-global-external-managed   34.54.193.92   True         11d
    

    מוודאים שהעמודה Address מכילה כתובת IP תקינה והסטטוס של Programmed הוא True.

  9. מתארים את השער כדי לוודא שהמסלול מצורף:
    kubectl describe gateway global-ext-lb2
  10. הפלט אמור להיראות כך:

    ...
    Listeners:
      Attached Routes:  1
      Conditions:
        Last Transition Time:  2024-10-03T03:10:17Z
    ...

    מוודאים שהערך של Attached Routes הוא 1.

  11. שולחים בקשה ל-Gateway כדי לוודא שהמסלול פועל:
    curl -k -X POST https://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME_2"

    כאשר:

    • GATEWAY_IP_ADDRESS היא כתובת ה-IP של השער, כפי שמוצג בעמודה Address של התשובה שמוחזרת בשלב 7.
    • HOST_NAME_2 הוא שם המארח שמוגדר ב-HTTPRoute של שער.

  12. הפלט אמור להיראות כך:
      {
        "args": {},
        "headers": {
          "Accept": "*/*",
          "Host": "apigee-apim-operator-test.apigee.net",
          "User-Agent": "curl/8.7.1",
          "X-Cloud-Trace-Context": "2bb8a80e29e80662ff9cb89971c447d9/13083106619927322701"
        },
        "origin": "67.164.1.10,34.54.193.72",
        "url": "https://apigee-apim-operator-test.apigee.net/post"
      }
      
  13. יוצרים מדיניות חדשה של תוסף APIM שמפנה אל HTTPRoute של השער החדש שנוצר בשלב קודם:
    1. יוצרים קובץ חדש בשם apim-policy2.yaml במרחב השמות apim.
    2. מעתיקים את התוכן הבא לקובץ החדש:
      # apim-policy2.yaml
      apiVersion: apim.googleapis.com/v1
      kind: APIMExtensionPolicy
      metadata:
        name: global-ext-lb2-apim-policy-2
        namespace: apim
      spec:
        location: global
        failOpen: false
        timeout: 1000ms
        defaultSecurityEnabled: true
        targetRef: # identifies the Gateway where the extension should be installed
          name: global-ext-lb2
          kind: Gateway
          namespace: default
    3. החלת מדיניות חדשה של תוסף APIM:
      kubectl apply -f apim-policy2.yaml

      אחרי שהקובץ מוחל, Apigee Operator for Kubernetes יוצר משאבי רשת ברקע.

    4. בדיקת הסטטוס של מדיניות התוסף APIM:
      kubectl -n apim get APIMExtensionPolicy

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

      NAME                           STATE        ERRORMESSAGE
      global-ext-lb2-apim-policy-2   RUNNING
      

      מוודאים שהערך של STATE הוא RUNNING.

    5. ממתינים חמש דקות כדי לוודא שהשינויים מועברים לכל המופעים של מאזן העומסים, ואז משתמשים בפקודה הבאה כדי לוודא שבקשה לשער החדש נכשלת:
      curl -k -X POST https://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME_2"

      כאשר:

      • GATEWAY_IP_ADDRESS היא כתובת ה-IP של השער שקיבלתם בשלב קודם.
      • HOST_NAME_2 הוא שם המארח שמוגדר ב-HTTPRoute של שער.

      הבקשה אמורה להיכשל עם תגובה שדומה לזו:

      {
        "fault": {
          "faultstring": "Raising fault. Fault name : RF-insufficient-request-raise-fault",
          "detail": {
            "errorcode": "steps.raisefault.RaiseFault"
          }
        }
      }

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

עדכון של מוצר API

לשנות מוצר API קיים כך שיפנה למדיניות החדשה של APIM Extension:

  1. יוצרים קובץ חדש בשם api-product-2.yaml במרחב השמות apim.
  2. מעתיקים את התוכן הבא לקובץ החדש:
    # api-product-2.yaml
    apiVersion: apim.googleapis.com/v1
    kind: APIProduct
    metadata:
      name: api-product-2
      namespace: apim
    spec:
      name: api-product-2
      approvalType: auto
      description: Http bin GET calls
      displayName: api-product-2
    EnforcementRefs:
      - name: global-ext-lb1-apim-policy
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apim
      - name: global-ext-lb2-apim-policy
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apim
      attributes:
      - name: access
        value: private
  3. מחילים את קובץ המוצרים החדש של ה-API:
    kubectl apply -f api-product-2.yaml

    השינויים יחולו על כל האשכול תוך שלוש דקות בערך.

בדוגמה הזו, הקטע EnforcementRefs של מוצר ה-API‏ api-product-2 מתעדכן כך שיפנה גם אל global-ext-lb1-apim-policy וגם אל global-ext-lb2-apim-policy, כמו שמוצג בחלקים המודגשים של yaml.

יצירת מוצר API חדש

יוצרים מוצר API חדש:

  1. יוצרים קובץ חדש בשם api-product-2.yaml במרחב השמות apim.
  2. מעתיקים את התוכן הבא לקובץ החדש:
    # api-product-2.yaml
    apiVersion: apim.googleapis.com/v1
    kind: APIProduct
    metadata:
      name: api-product-2
      namespace: apim
    spec:
      name: api-product-2
      approvalType: auto
      description: Http bin GET calls
      displayName: api-product-2
      enforcementRefs:
      - name: global-ext-lb2-apim-policy
        kind: APIMExtensionPolicy
        group: apim.googleapis.com
        namespace: apim
      attributes:
      - name: access
        value: private
  3. מחילים את קובץ המוצרים החדש של ה-API:
    kubectl apply -f api-product-2.yaml

    השינויים יחולו על כל האשכול תוך שלוש דקות בערך.

בדוגמה הזו, הקטע EnforcementRefs של מוצר ה-API החדש api-product-2 נוצר כדי להפנות אל global-ext-lb2-apim-policy, כפי שמוצג בחלקים המודגשים של yaml.

יצירת קבוצה חדשה של פעולות API

כדי ליצור קבוצה חדשה של פעולות API:

  1. יוצרים קובץ חדש בשם item-set-post.yaml במרחב השמות apim.
  2. מעתיקים את התוכן הבא לקובץ החדש:
    # item-set-post.yaml
    apiVersion: apim.googleapis.com/v1
    kind: APIOperationSet
    metadata:
      name: item-set-post
      namespace: apim
    spec:
      apiProductRefs:
        - name: api-product-2
          kind: APIProduct
          group: apim.googleapis.com
          namespace: apim
      quota:
        limit: 1
        interval: 1
        timeUnit: minute
      restOperations:
        - name: PostItems
          path: "/post"
          methods:
          - POST
  3. מחילים את קובץ הפעולות החדש של ה-API:
    kubectl apply -f item-set-post.yaml

    השינויים יחולו על כל האשכול תוך שלוש דקות בערך.

בדוגמה הזו, הערך restOperations של קבוצת הפעולות החדשה ב-API‏ item-set-post נוצר כדי להפנות לנתיב /post, כמו שמוצג בחלקים המודגשים של הקובץ.

בדיקת ההגדרות החדשות של השער

כדי לבדוק את ההגדרה החדשה של שער הגישה, שולחים את הבקשה הבאה לנתיב /post החדש:

curl -k -X POST https://GATEWAY_IP_ADDRESS/post -H "Host: HOST_NAME_2"

כאשר:

  • GATEWAY_IP_ADDRESS היא כתובת ה-IP של השער שקיבלתם בשלב קודם.
  • HOST_NAME הוא שם המארח שמוגדר ב-HTTPRoute של שער.

הבקשה אמורה להצליח ולהחזיר תגובה שדומה לזו:

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "apigee-apim-operator-test.apigee.net",
    "User-Agent": "curl/8.7.1",
    "X-Api-Key": "f0N6sXXXclGXXXe0oP5XXXdA20PjgrP2x8xXXh7z4XXXKiYt",
    "X-Cloud-Trace-Context": "bb3a768787099bda628781188bfb318b/15554891713516675739"
  },
  "origin": "34.54.193.72",
  "url": "https://34.54.193.72/post"
}

פתרון בעיות

אם נתקלתם בבעיות כשעדכנתם והרחבתם את מדיניות ניהול ה-API שמשמשת עם Apigee Operator for Kubernetes, תוכלו לעיין במאמר פתרון בעיות ב-Apigee Operator for Kubernetes כדי למצוא פתרונות לשגיאות נפוצות.

המאמרים הבאים