הגדרת Ingress למאזני עומסים חיצוניים של אפליקציות

בדף הזה מוסבר איך להגדיר מאזן עומסים של אפליקציות (ALB) חיצוני באמצעות יצירת אובייקט Ingress של Kubernetes.

לפני שאתם קוראים את הדף הזה, חשוב שתכירו את המושגים של רשתות GKE.

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

לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:

  • מפעילים את Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-Google Cloud CLI למשימה הזו, מתקינים ואז מאתחלים את ה-CLI של gcloud. אם כבר התקנתם את ה-CLI של gcloud, הריצו את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.
  • מוודאים שיש לכם אשכול קיים במצב Autopilot או במצב Standard. כדי ליצור אשכול חדש, קראו את המאמר יצירת אשכול Autopilot.
  • שימו לב שאשכולות IPv6 עם מחסנית אחת לא תומכים ב-GKE Ingress. כדי להגדיר מאזני עומסים חיצוניים של אפליקציות (ALB) באשכולות IPv6 עם מחסנית אחת, צריך להשתמש ב-Gateway API.

הפעלת התוסף HttpLoadBalancing

התוסף HttpLoadBalancing צריך להיות מופעל באשכול. התוסף הזה מופעל כברירת מחדל. באשכולות Autopilot אי אפשר להשבית את התוסף הזה.

אפשר להפעיל את התוסף HttpLoadBalancing באמצעות מסוף Google Cloud או Google Cloud CLI.

המסוף

  1. נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .

    כניסה ל-Google Kubernetes Engine

  2. לוחצים על שם האשכול שרוצים לשנות.

  3. בקטע Networking, בשדה HTTP איזון עומסים, לוחצים על Edit HTTP איזון עומסים.

  4. מסמנים את התיבה Enable HTTP load balancing.

  5. לוחצים על שמירת השינויים.

gcloud

gcloud container clusters update CLUSTER_NAME --update-addons=HttpLoadBalancing=ENABLED

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

יצירת כתובת IP סטטית

מאזן עומסים חיצוני של אפליקציות (ALB) מספק כתובת IP יציבה אחת, שבה אפשר להשתמש כדי לנתב בקשות לשירות אחד או יותר. אם אתם רוצים כתובת IP קבועה, אתם צריכים לשמור כתובת IP חיצונית סטטית גלובלית לפני שאתם יוצרים Ingress.

אם משנים Ingress קיים כדי להשתמש בכתובת IP סטטית במקום בכתובת IP זמנית, יכול להיות ש-GKE ישנה את כתובת ה-IP של מאזן העומסים כשהוא ייצור מחדש את כלל ההעברה של מאזן העומסים.

יצירת מאזן עומסים חיצוני של אפליקציות (ALB)

בתרגיל הזה תגדירו מאזן עומסים חיצוני של אפליקציות (ALB) כדי לנתב בקשות לשירותים שונים בהתאם לנתיב של כתובת ה-URL.


לחצו על תראו לי איך כדי לקרוא הסבר מפורט על המשימה ישירות במסוף Google Cloud :

תראו לי איך


יצירת פריסות ושירותים

יוצרים שני פריסות עם שירותים בשמות hello-world-1 ו-hello-world-2:

  1. שומרים את המניפסט הבא בתור hello-world-deployment-1.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-world-deployment-1
    spec:
      selector:
        matchLabels:
          greeting: hello
          version: one
      replicas: 3
      template:
        metadata:
          labels:
            greeting: hello
            version: one
        spec:
          containers:
          - name: hello-app-1
            image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
            env:
            - name: "PORT"
              value: "50000"
    

    המניפסט הזה מתאר פריסה לדוגמה עם שלוש רפליקות.

  2. מחילים את המניפסט על האשכול:

    kubectl apply -f hello-world-deployment-1.yaml
    
  3. שומרים את המניפסט הבא בתור hello-world-service-1.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: hello-world-1
    spec:
      type: NodePort
      selector:
        greeting: hello
        version: one
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50000
    

    המניפסט הזה מתאר שירות עם המאפיינים הבאים:

    • כל Pod שיש לו גם את התווית greeting: hello וגם את התווית version: one הוא חבר בשירות.
    • ‫GKE מעביר בקשות שנשלחות לשירות ביציאת TCP‏ 60000 לאחד מה-Pods החברים ביציאת TCP‏ 50000.
    • סוג השירות הוא NodePort, וזה נדרש אלא אם משתמשים באיזון עומסים מקורי בקונטיינר. אם אתם משתמשים באיזון עומסים שמותאם לקונטיינרים, אין הגבלה על סוג השירות, אבל מומלץ להשתמש בשירות מסוג type ClusterIP, אלא אם אתם צריכים במפורש את ה-nodePort שמסופק על ידי שירות NodePort. שירותי LoadBalancer לא נתמכים כרכיבי backend של Ingress.
  4. מחילים את המניפסט על האשכול:

    kubectl apply -f hello-world-service-1.yaml
    
  5. שומרים את המניפסט הבא בתור hello-world-deployment-2.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-world-deployment-2
    spec:
      selector:
        matchLabels:
          greeting: hello
          version: two
      replicas: 3
      template:
        metadata:
          labels:
            greeting: hello
            version: two
        spec:
          containers:
          - name: hello-app-2
            image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
            env:
            - name: "PORT"
              value: "8080"
    

    המניפסט הזה מתאר פריסה לדוגמה עם שלוש רפליקות.

  6. מחילים את המניפסט על האשכול:

    kubectl apply -f hello-world-deployment-2.yaml
    
  7. שומרים את המניפסט הבא בתור hello-world-service-2.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: hello-world-2
    spec:
      type: NodePort
      selector:
        greeting: hello
        version: two
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    

    המניפסט הזה מתאר שירות עם המאפיינים הבאים:

    • כל Pod שיש לו גם את התווית greeting: hello וגם את התווית version: two הוא חבר בשירות.
    • ‫GKE מעביר בקשות שנשלחות לשירות ביציאת TCP‏ 80 לאחד מה-Pods החברים ביציאת TCP‏ 8080.
  8. מחילים את המניפסט על האשכול:

    kubectl apply -f hello-world-service-2.yaml
    

יצירת Ingress

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

  1. שומרים את המניפסט הבא בתור my-ingress.yaml:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
      annotations:
        # If the class annotation is not specified it defaults to "gce".
        kubernetes.io/ingress.class: "gce"
    spec:
      rules:
      - http:
          paths:
          - path: /*
            pathType: ImplementationSpecific
            backend:
              service:
                name: hello-world-1
                port:
                  number: 60000
          - path: /v2
            pathType: ImplementationSpecific
            backend:
              service:
                name: hello-world-2
                port:
                  number: 80
    

    המניפסט הזה מתאר Ingress עם המאפיינים הבאים:

    • יש שתי מחלקות Ingress ב-GKE. כדי לציין מחלקת Ingress, צריך להשתמש בהערה kubernetes.io/ingress.class. אי אפשר לציין GKE Ingress באמצעות spec.ingressClassName.

    • המחלקה gce פורסת מאזן עומסים חיצוני של אפליקציות (ALB).

    • המחלקה gce-internal פורסת מאזן עומסים פנימי של אפליקציות.

    • כשפורסים משאב Ingress בלי ההערות spec.ingressClassName ו-kubernetes.io/ingress.class, ‏GKE יוצר מאזן עומסים חיצוני של אפליקציות (ALB). ההתנהגות הזו זהה למה שקורה כשמציינים את ההערה kubernetes.io/ingress.class: gce. למידע נוסף, קראו את המאמר ההתנהגות של בקר Ingress ב-GKE.

    • ‫GKE יוצר Google Cloud שירות לקצה העורפי לכל backend.service. כל אחד מהשירותים לקצה העורפי תואם לשירות Kubernetes, וכל שירות לקצה העורפי צריך להפנות לGoogle Cloud בדיקת תקינות. בדיקת התקינות הזו שונה מבדיקת liveness או readiness של Kubernetes, כי היא מיושמת מחוץ לאשכול. מידע נוסף על בדיקות תקינות

    • כשלקוח שולח בקשה למאזן העומסים עם נתיב כתובת ה-URL‏ /, ‏GKE מעביר את הבקשה לשירות hello-world-1 ביציאה 60000. כשלקוח שולח בקשה למאזן העומסים באמצעות נתיב כתובת ה-URL‏ /v2, ‏GKE מעביר את הבקשה לשירות hello-world-2 ביציאה 80. מידע נוסף על המאפיינים path ו-pathType זמין במאמר נתיבי כתובות URL.

    • כדי לשמור כתובת IP חיצונית סטטית גלובלית, צריך לכלול הערת kubernetes.io/ingress.global-static-ip-name באובייקט Ingress, כמו שמוצג כאן:

     apiVersion: networking.k8s.io/v1
     kind: Ingress
     metadata:
       name: my-ingress
       annotations:
         kubernetes.io/ingress.global-static-ip-name: my-static-address
     ```
    
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f my-ingress.yaml
    

בדיקת מאזן העומסים החיצוני של האפליקציות (ALB)

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

  1. מציגים את ה-Ingress:

    kubectl get ingress my-ingress --output yaml
    

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

    status:
      loadBalancer:
        ingress:
        - ip: 203.0.113.1
    
  2. בודקים את הנתיב /:

    curl LOAD_BALANCER_IP_ADDRESS/
    

    מחליפים את LOAD_BALANCER_IP_ADDRESS בכתובת ה-IP החיצונית של מאזן העומסים.

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

    Hello, world!
    Version: 1.0.0
    Hostname: ...
    

    אם הפלט כולל שגיאת 404, המתינו כמה דקות.

  3. בודקים את הנתיב /v2:

    curl load-balancer-ip/v2
    

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

    Hello, world!
    Version: 2.0.0
    Hostname: ...
    

איך פועל Ingress לאיזון עומסים חיצוני

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

נתיבים של כתובות URL

התו הכללי היחיד לחיפוש שנתמך בשדה path של Ingress הוא התו *. התו * חייב להופיע אחרי לוכסן (/) ולהיות התו האחרון בתבנית. לדוגמה, /*, /foo/* ו-/foo/bar/* הן תבניות תקינות, אבל *, /foo/bar* ו-/foo/*/bar לא תקינות.

תבנית ספציפית יותר מקבלת עדיפות על פני תבנית פחות ספציפית. אם יש לכם גם /foo/* וגם /foo/bar/*, אז /foo/bar/bat נלקח כדי להתאים ל-/foo/bar/*. מידע נוסף על מגבלות הנתיבים והתאמת התבניות זמין במסמכי התיעוד של מפות ה-URL.

באשכולות GKE שפועלים בגרסאות שקודמות ל-1.21.3-gke.1600, הערך היחיד שנתמך בשדה pathType הוא ImplementationSpecific. באשכולות שפועלים בגרסה 1.21.3-gke.1600 ואילך, הערכים Prefix ו-Exact נתמכים גם בשביל pathType.

קבוצות של נקודות קצה ברשת (NEG)

אם האשכול תומך באיזון עומסים מקורי בקונטיינר, מומלץ להשתמש בקבוצות של נקודות קצה ברשת (NEG). כשיוצרים את ה-Ingress, ‏GKE יוצר מאזן עומסים של אפליקציות בפרויקט, וקבוצות NEG נוצרות בכל אזור שבו האשכול פועל. נקודות הקצה ב-NEG ונקודות הקצה של השירות מסונכרנות. באשכולות GKE מגרסה 1.17 ואילך, איזון עומסים שמקורם בקונטיינר מוגדר כברירת מחדל, ולא נדרש הסבר מפורש של שירות cloud.google.com/neg: '{"ingress": true}', בתנאים מסוימים. באשכולות שבהם קבוצות NEG הן לא ברירת המחדל, עדיין מומלץ מאוד להשתמש באיזון עומסים מקורי בקונטיינר, אבל צריך להפעיל אותו באופן מפורש לכל שירות בנפרד. צריך להחיל את ההערה על Services באופן הבא:

kind: Service
...
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
...

כשמוסיפים את ההערה הזו, נוצר BackendService חדש לשירות הקיים. כתוצאה מכך, יכול להיות שתהיה הפסקה זמנית בשירות.

VPC משותף

אם אשכול GKE שבו אתם פורסים את משאבי ה-Ingress נמצא בפרויקט שירות, ואתם רוצים שמישור הבקרה של GKE ינהל את משאבי חומת האש בפרויקט המארח, אתם צריכים לתת לחשבון השירות של GKE בפרויקט השירות את הרשאות ה-IAM המתאימות בפרויקט המארח, בהתאם להוראות במאמר ניהול משאבי חומת אש לאשכולות עם VPC משותף. כך בקר ה-Ingress יכול ליצור כללים של חומת אש שמאפשרים תעבורת נתונים נכנסת (ingress) ותעבורת נתונים לבדיקות תקינות של Google Cloud .

הדוגמה הבאה היא אירוע שעשוי להופיע ביומני המשאבים של Ingress. השגיאה הזו מתרחשת כשבקר ה-Ingress לא יכול ליצור כלל חומת אש כדי לאפשר תעבורת נתונים נכנסת (ingress) לבדיקות תקינות של Google Cloud , אם ההרשאות לא מוגדרות בצורה נכונה.

Firewall change required by security admin: `gcloud compute firewall-rules update <RULE_NAME> --description "GCE L7 firewall rule" --allow tcp:<PORT> --source-ranges 130.211.0.0/22,35.191.0.0/16 --target-tags <TARGET_TAG> --project <HOST_PROJECT>

אם אתם מעדיפים להקצות באופן ידני כללי חומת אש מהפרויקט המארח, אתם יכולים להשתיק את האירועים של firewallXPNError על ידי הוספת ההערה networking.gke.io/suppress-firewall-xpn-error: "true" למשאב ה-Ingress.

סיכום של הערות Ingress חיצוניות

אתם יכולים להשתמש בהערות הבאות כדי להגדיר את ההתנהגות של משאבי Ingress החיצוניים ואת האובייקטים המשויכים של שירות Kubernetes.

הערות Ingress

הערה תיאור
kubernetes.io/ingress.allow-http מציינת אם לאפשר תנועת HTTP בין הלקוח לבין מאזן העומסים מסוג HTTP(S). הערכים האפשריים הם "true" ו-"false". ברירת המחדל היא "true". השבתת HTTP
ingress.gcp.kubernetes.io/pre-shared-cert משתמשים בהערה הזו כדי לצרף משאבי אישורים למשאבי Ingress ב-GKE. מידע נוסף זמין במאמר שימוש בכמה אישורי SSL עם מאזני עומסים חיצוניים של אפליקציות.
kubernetes.io/ingress.global-static-ip-name משתמשים בהערה הזו כדי לציין שמאזן העומסים צריך להשתמש בכתובת IP חיצונית סטטית שיצרתם קודם. מידע נוסף זמין במאמר כתובות IP סטטיות למאזני עומסים מסוג HTTP(S).
networking.gke.io/v1beta1.FrontendConfig משתמשים בהערה הזו כדי להתאים אישית את ההגדרות של מאזן העומסים בצד הלקוח. מידע נוסף זמין במאמר הגדרת Ingress.
networking.gke.io/suppress-firewall-xpn-error במאזני עומסים מסוג Ingress, אם Kubernetes לא יכול לשנות את כללי חומת האש בגלל הרשאות לא מספיקות, נוצר אירוע firewallXPNError כל כמה דקות. ב-GLBC 1.4 ואילך, אפשר להשתיק את האירוע firewallXPNError על ידי הוספת ההערה networking.gke.io/suppress-firewall-xpn-error: "true" למשאב ה-Ingress. כדי לבטל את ההשתקה, אפשר להסיר את ההערה הזו. הערכים האפשריים הם true ו-false. ערך ברירת המחדל הוא false.
הערה תיאור
cloud.google.com/app-protocols משתמשים בהערה הזו כדי להגדיר את פרוטוקול התקשורת בין מאזן העומסים לבין האפליקציה. הפרוטוקולים האפשריים הם HTTP,‏ HTTPS ו-HTTP2.
cloud.google.com/backend-config משתמשים בהערה הזו כדי להגדיר את שירות הקצה העורפי שמשויך לשירות. מידע נוסף זמין במאמר הגדרת Ingress.
cloud.google.com/neg משתמשים בהערה הזו כדי לציין שמאזן העומסים צריך להשתמש בקבוצות של נקודות קצה ברשת. שימוש באיזון עומסים שמקורם בקונטיינר

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