שירותי LoadBalancer בכמה רשתות

התכונה 'ריבוי רשתות' ב-GKE מאפשרת לחבר את עומסי העבודה לכמה רשתות VPC. אפשר לחשוף את ה-Pods האלה עם כמה רשתות ללקוחות פנימיים או חיצוניים באמצעות שירות Kubernetes של type: LoadBalancer. פלטפורמת GKE מקצה מאזן עומסים Google Cloud L4 לשירות ששולח תעבורת נתונים ל-Pods ברשת משנית ספציפית.

במאמר הזה מוסבר איך GKE מטמיע LoadBalancer שירותים ל-Pods בכמה רשתות. המאמר כולל את ההגדרה הנדרשת, היכולות והמגבלות של התכונה.

איך פועלים שירותים של מאזני עומסים ברשתות מרובות

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

התווית networking.gke.io/network בבורר מסננת את נקודות הקצה לפי רשת. כך מאזן העומסים שולח תנועת נתונים רק לממשקי ה-Pod שמחוברים לרשת שצוינה.

שירות Internal LoadBalancer

כדי ליצור מאזן עומסים פנימי, מוסיפים את ההערה networking.gke.io/load-balancer-type: "Internal" למניפסט של Service. בדוגמה הבאה מוצג שירות שיוצר מאזן עומסים פנימי כדי לטרגט פודים ברשת dmz:

apiVersion: v1
kind: Service
metadata:
  name: web-app-internal-lb
  namespace: default
  annotations:
    networking.gke.io/load-balancer-type: "Internal"
spec:
  externalTrafficPolicy: Local
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    networking.gke.io/network: dmz
    app: web-app
  type: LoadBalancer

שירות LoadBalancer חיצוני

כדי ליצור מאזן עומסים חיצוני של רשת שמבוסס על שירות קצה עורפי, מוסיפים את ההערה cloud.google.com/l4-rbs: enabled למניפסט של השירות. בדוגמה הבאה מוצג שירות שיוצר מאזן עומסים חיצוני כדי לטרגט פודים ברשת dmz:

apiVersion: v1
kind: Service
metadata:
  name: web-app-external-lb
  namespace: default
  annotations:
    cloud.google.com/l4-rbs: enabled
spec:
  externalTrafficPolicy: Local
  ports:
  -   port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    networking.gke.io/network: dmz
    app: web-app
  type: LoadBalancer

הגדרת ה-Pod והרשת

ל-Pods צריך להיות ממשק ברשת שהשירות LoadBalancer מכוון אליה. בנוסף, צריך להגדיר ניתוב בתוך ה-Pod כדי שהוא יוכל להגיב נכון לבקשות בממשק הרשת המתאים.

אפשר להגדיר ניתוב של Pod באחת מהדרכים הבאות:

  • הגדרת ממשק ברירת מחדל: משתמשים בהערה networking.gke.io/default-interface ב-Pod כדי להגדיר את ממשק הרשת המשני כנתיב ברירת המחדל.

  • הגדרת ניתוב מבוסס-מדיניות: משתמשים ב-initContainer עם היכולת NET_ADMIN כדי להגדיר כללי ניתוב בתוך ה-Pod.

בדוגמה הבאה מוצג מניפסט Deployment של Pods עם ממשק ברשת dmz. ההערה networking.gke.io/default-interface מגדירה את הממשק dmz (eth1) כנתיב ברירת המחדל.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
      annotations:
        networking.gke.io/default-interface: 'eth1'
        networking.gke.io/interfaces: |-
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName": "eth1","network": "dmz"}
          ]
    spec:
      containers:
      -   name: whereami
        image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1
        ports:
        -   containerPort: 8080

אימות של נקודות קצה בכמה רשתות

ב-GKE נעשה שימוש בבקר ייעודי, multinet-endpointslice-controller.gke.io, כדי לנהל נקודות קצה של שירותים בכמה רשתות. בקר זה יוצר אובייקטים של EndpointSlice עבור שירותים מרובי רשתות. כתובות ה-IP באובייקטים האלה של EndpointSlice שייכות לרשת המשנית שצוינה בכלי לבחירת שירותים.

אם למאזן העומסים אין קצה עורפי תקין, בודקים את EndpointSlice של השירות כדי לוודא שהבקר בחר את כתובות ה-IP הנכונות של ה-Pod. אם ל-EndpointSlice אין נקודות קצה, צריך לוודא שהתוויות של בורר השירות תואמות ל-Pods הפועלים, ושהבורר networking.gke.io/network תואם לרשת של ה-Pods.

מגבלות

ההגבלות הבאות חלות על שירותי LoadBalancer מרובי-רשתות:

  • מאזני עומסים פנימיים דורשים חלוקת משנה של GKE.
  • אין תמיכה במאזני עומסים שמבוססים על מאגר יעד או על קבוצת מופעים.
  • אין תמיכה בשירותים שמשתמשים ב-externalTrafficPolicy: Cluster.
  • אי אפשר לטרגט שירותים ל-Pods של hostNetwork.
  • אין תמיכה ב-IPv6 וברשתות עם פרוטוקול כפול.
  • אי אפשר לשנות את הרשת של שירות קיים.
  • יש תמיכה רק ברשתות Layer 3.

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