בדף הזה מוסבר איך להגדיר מאזן עומסים של אפליקציות חיצוני (ALB) על ידי יצירת אובייקט Kubernetes Ingress.
לפני שקוראים את הדף הזה, חשוב להכיר את המושגים של רשתות GKE.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שבגרסאות קודמות של ה-CLI של gcloud אי אפשר להריץ את הפקודות שבמסמך הזה.
- מוודאים שיש לכם אשכול קיים במצב Autopilot או במצב Standard. כדי ליצור אשכול חדש, אפשר לעיין במאמר בנושא יצירת אשכול Autopilot.
הפעלת התוסף HttpLoadBalancing
התוסף HttpLoadBalancing צריך להיות מופעל באשכול. התוסף הזה מופעל כברירת מחדל. באשכולות Autopilot אי אפשר להשבית את התוסף הזה.
אפשר להפעיל את התוסף HttpLoadBalancing באמצעות מסוף Google Cloud או Google Cloud CLI.
המסוף
נכנסים לדף Google Kubernetes Engine במסוף Google Cloud .
לוחצים על השם של האשכול שרוצים לשנות.
בקטע Networking, בשדה HTTP איזון עומסים, לוחצים על edit Edit HTTP איזון עומסים.
מסמנים את תיבת הסימון הפעלת איזון עומסים של HTTP.
לוחצים על שמירת השינויים.
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:
שומרים את קובץ המניפסט הבא בשם
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"המניפסט הזה מתאר פריסה לדוגמה עם שלוש רפליקות.
החלת המניפסט על האשכול:
kubectl apply -f hello-world-deployment-1.yamlשומרים את המניפסט הבא בתור
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קובץ המניפסט הזה מתאר שירות עם המאפיינים הבאים:
- כל פוד שיש לו גם את התווית
greeting: helloוגם את התוויתversion: oneהוא חבר בשירות. - GKE מעביר בקשות שנשלחות לשירות ביציאת TCP 60000 לאחד מ-Pods החברים ביציאת TCP 50000.
- סוג השירות הוא
NodePort, שנדרש אלא אם משתמשים באיזון עומסים מובנה ב-container. אם משתמשים באיזון עומסים מובנה בקונטיינר, אין הגבלה על סוג השירות, אבל מומלץ להשתמש בשירות מסוגtype ClusterIP, אלא אם אתם צריכים באופן מפורש את NodePort שסופק על ידי שירות NodePort. אין תמיכה בשירותי LoadBalancer כקצה עורפי של Ingress.
- כל פוד שיש לו גם את התווית
החלת המניפסט על האשכול:
kubectl apply -f hello-world-service-1.yamlשומרים את קובץ המניפסט הבא בשם
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"המניפסט הזה מתאר פריסה לדוגמה עם שלוש רפליקות.
החלת המניפסט על האשכול:
kubectl apply -f hello-world-deployment-2.yamlשומרים את המניפסט הבא בתור
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קובץ המניפסט הזה מתאר שירות עם המאפיינים הבאים:
- כל פוד שיש לו גם את התווית
greeting: helloוגם את התוויתversion: twoהוא חבר בשירות. - GKE מעביר בקשות שנשלחות לשירות ביציאת TCP 80 לאחד מה-Pods החברים ביציאת TCP 8080.
- כל פוד שיש לו גם את התווית
החלת המניפסט על האשכול:
kubectl apply -f hello-world-service-2.yaml
יצירת Ingress
יוצרים Ingress שמציין כללים לניתוב בקשות בהתאם לנתיב כתובת ה-URL בבקשה. כשיוצרים את Ingress, בקר Ingress של GKE יוצר ומגדיר מאזן עומסים של אפליקציות (ALB) חיצוני.
שומרים את קובץ המניפסט הבא בשם
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 עם המאפיינים הבאים:
יש שני סוגים של GKE Ingress. כדי לציין מחלקת Ingress, צריך להשתמש בהערה
kubernetes.io/ingress.class. אי אפשר לציין GKE Ingress באמצעותspec.ingressClassName.הסיווג
gceפורס מאזן עומסים חיצוני של אפליקציות.המחלקה
gce-internalפורסת מאזן עומסים פנימי של אפליקציות.כשפורסים משאב Ingress בלי האנוטציות
spec.ingressClassNameו-kubernetes.io/ingress.class, GKE יוצר מאזן עומסים של אפליקציות (ALB) חיצוני. זו אותה התנהגות שמתרחשת אם מציינים את ההערהkubernetes.io/ingress.class: gce. מידע נוסף זמין במאמר בנושא התנהגות של בקר GKE Ingress.GKE יוצר Google Cloud שירות לקצה העורפי לכל
backend.service. כל אחד מהשירותים לקצה העורפי תואם לשירות Kubernetes, וכל שירות לקצה העורפי צריך להפנות אל Google Cloud בדיקת תקינות. בדיקת התקינות הזו שונה מבדיקת תקינות או מוכנות של 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 ```מחילים את המניפסט על האשכול:
kubectl apply -f my-ingress.yaml
בדיקת מאזן עומסים חיצוני של אפליקציות (ALB)
ממתינים כחמש דקות עד להגדרת מאזן העומסים, ואז בודקים את מאזן העומסים של אפליקציות החיצוני:
צפייה ב-Ingress:
kubectl get ingress my-ingress --output yamlבפלט מוצגת כתובת ה-IP של מאזן העומסים של אפליקציות החיצוני:
status: loadBalancer: ingress: - ip: 203.0.113.1בודקים את הנתיב
/:curl LOAD_BALANCER_IP_ADDRESS/מחליפים את
LOAD_BALANCER_IP_ADDRESSבכתובת ה-IP החיצונית של מאזן העומסים.הפלט אמור להיראות כך:
Hello, world! Version: 1.0.0 Hostname: ...אם הפלט כולל שגיאת 404, צריך להמתין כמה דקות.
בודקים את הנתיב
/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.
קבוצות של נקודות קצה ברשת
אם האשכול תומך באיזון עומסים מובנה ב-Container, מומלץ להשתמש בקבוצות של נקודות קצה ברשת (NEGs). כשיוצרים את ה-Ingress, GKE יוצר מאזן עומסים של אפליקציות בפרויקט, וקבוצות NEG נוצרות בכל אזור שבו האשכול פועל. נקודות הקצה ב-NEG ונקודות הקצה של השירות נשמרות בסנכרון. באשכולות GKE מגרסה 1.17 ואילך, איזון עומסים שמקורם בקונטיינר הוא ברירת המחדל, ובתנאים מסוימים לא נדרש הסבר מפורש של שירות cloud.google.com/neg: '{"ingress": true}'.
במקרים שבהם NEGs לא מוגדרים כברירת מחדל, עדיין מומלץ מאוד להשתמש באיזון עומסים מובנה ב-container, אבל צריך להפעיל אותו באופן מפורש לכל שירות בנפרד. צריך להחיל את ההערה על שירותים באופן הבא:
kind: Service
...
annotations:
cloud.google.com/neg: '{"ingress": true}'
...
כשמוסיפים את ההערה הזו, נוצר BackendService חדש עבור ה-Service הקיים. התוצאה יכולה להיות הפסקה זמנית בשירות.
VPC משותף
אם אשכול GKE שבו אתם פורסים את משאבי ה-Ingress נמצא בפרויקט שירות, ואתם רוצים שמישור הבקרה של GKE ינהל את משאבי חומת האש בפרויקט המארח, צריך להעניק לחשבון השירות של GKE בפרויקט השירות את הרשאות ה-IAM המתאימות בפרויקט המארח, בהתאם להוראות שבמאמר ניהול משאבי חומת אש באשכולות עם VPC משותף. כך בקר ה-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 | ההערה הזו משמשת לצירוף משאבי אישורים למשאבי GKE Ingress. מידע נוסף זמין במאמר בנושא שימוש בכמה אישורי 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. |
הערות שירות שקשורות ל-Ingress
| הערה | תיאור |
|---|---|
| cloud.google.com/app-protocols | משתמשים בהערה הזו כדי להגדיר את הפרוטוקול לתקשורת בין מאזן העומסים לבין האפליקציה. הפרוטוקולים האפשריים הם HTTP, HTTPS ו-HTTP2. |
| cloud.google.com/backend-config | משתמשים בהערה הזו כדי להגדיר את שירות הקצה העורפי שמשויך לשירות. מידע נוסף זמין במאמר בנושא הגדרת Ingress. |
| cloud.google.com/neg | משתמשים בהערה הזו כדי לציין שמאזן העומסים צריך להשתמש בקבוצות של נקודות קצה ברשת. איך משתמשים באיזון עומסים שמקורם בקונטיינר |
המאמרים הבאים
סקירה כללית על Ingress למאזני עומסים של אפליקציות (ALB) חיצוניים ב-GKE
מבצעים את המדריך הגדרת מאזן עומסים חיצוני של אפליקציות (ALB) באמצעות Ingress.
במאמר בנושא שירותים ב-GKE תוכלו לקרוא סקירה כללית על מושגים.