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

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

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

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

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

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

דרישות

  • במדריך הזה נעשה שימוש ב-spec.loadBalancerClass כדי ליצור מאזן עומסי רשת אזורי חיצוני להעברת סיגנל ללא שינוי שמבוסס על שירות לקצה העורפי עם קצוות עורפיים של GCE_VM_IP NEG. כדי לבצע את ההדרכה הזו, צריך GKE בגרסה ‎1.33.1-gke.1779000 ואילך, כי spec.loadBalancerClass דורש GKE בגרסה ‎1.33.1-gke.1779000 ואילך. בנוסף, גרסה ‎1.33.1-gke.1779000 ואילך חורגת מדרישות הגרסה המינימליות של GKE עבור קצה עורפי של NEG או התכונה של איזון עומסים משוקלל.

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

  • כדי להפעיל את Cloud Logging בשביל שירות חיצוני של LoadBalancer, אשכול GKE צריך להיות בגרסה 1.36.0-gke.2459000 ואילך.

בחירת אשכול

אפשר ליצור אשכול חדש או לבחור אשכול קיים שעומד בדרישות.

יצירת אשכול חדש

Autopilot

כדי ליצור אשכול חדש של Autopilot:

gcloud container clusters create-auto CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

מחליפים את מה שכתוב בשדות הבאים:

  • ‫CLUSTER_NAME: השם של האשכול החדש.
  • ‫RELEASE_CHANNEL: השם של ערוץ ההפצה של GKE לאשכול.
  • ‫VERSION: גרסת GKE של האשכול.
  • ‫COMPUTE_LOCATION: האזור של Compute Engine שבו נמצא האשכול.

כדי להשבית את היצירה האוטומטית של כללי חומת אש של VPC עבור שירותי LoadBalancer, צריך לכלול את הדגל --disable-l4-lb-firewall-reconciliation. מידע נוסף זמין במאמר כללים של חומת אש בניהול המשתמשים בשירותי איזון עומסים של GKE.

רגילה

כדי ליצור אשכול חדש מסוג Standard:

gcloud container clusters create CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

מחליפים את מה שכתוב בשדות הבאים:

  • ‫CLUSTER_NAME: השם של האשכול החדש.
  • ‫RELEASE_CHANNEL: השם של ערוץ ההפצה של GKE לאשכול.
  • ‫VERSION: גרסת GKE של האשכול.
  • ‫COMPUTE_LOCATION: האזור של Compute Engine שבו נמצא האשכול.

כדי להשבית את היצירה האוטומטית של כללי חומת אש של VPC עבור שירותי LoadBalancer, צריך לכלול את הדגל --disable-l4-lb-firewall-reconciliation. מידע נוסף זמין במאמר כללים של חומת אש בניהול המשתמשים בשירותי איזון עומסים של GKE.

שדרוג של אשכול קיים

משתמשים ב-CLI של gcloud כדי לעדכן אשכול קיים:

gcloud container clusters upgrade CLUSTER_NAME \
    --cluster-version=VERSION \
    --master \
    --location=COMPUTE_LOCATION

מחליפים את מה שכתוב בשדות הבאים:

כדי להשבית את היצירה האוטומטית של כללי חומת אש של VPC עבור שירותי LoadBalancer, צריך לכלול את הדגל --disable-l4-lb-firewall-reconciliation. מידע נוסף זמין במאמר כללים של חומת אש בניהול המשתמשים בשירותי איזון עומסים של GKE.

פריסת עומס עבודה לדוגמה

פורסים את עומס העבודה לדוגמה הבא, שמספק את ה-Pods של השרתים בשביל שירות LoadBalancer חיצוני.

  1. שומרים את דוגמת הפריסה הבאה כ-store-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store
    spec:
      replicas: 20
      selector:
        matchLabels:
          app: store
      template:
        metadata:
          labels:
            app: store
        spec:
          containers:
          - image: registry.k8s.io/echoserver:1.10
            imagePullPolicy: Always
            name: echoserver
            ports:
              - name: http
                containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
    
  2. החלת המניפסט על האשכול:

    kubectl apply -f store-deployment.yaml
    
  3. מוודאים שיש 20 פודים של שרתים לפריסה:

    kubectl get pods
    

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

    NAME                     READY   STATUS    RESTARTS   AGE
    store-cdb9bb4d6-s25vw      1/1     Running   0          10s
    store-cdb9bb4d6-vck6s      1/1     Running   0          10s
    ....
    

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

  1. כדי לחשוף את עומס העבודה לדוגמה, יוצרים שירות LoadBalancer חיצוני.

    1. שומרים את מניפסט השירות הבא בשם store-v1-lb-svc.yaml:

      apiVersion: v1
      kind: Service
      metadata:
        name: store-v1-lb-svc
      spec:
        type: LoadBalancer
        loadBalancerClass: networking.gke.io/l4-regional-external
        selector:
          app: store
        ports:
        - name: tcp-port
          protocol: TCP
          port: 8080
          targetPort: 8080
      
    2. החלת המניפסט על האשכול:

      kubectl apply -f store-v1-lb-svc.yaml
      

    חשוב לשים לב לנקודות הבאות לגבי קובץ המניפסט לדוגמה:

    • אם האשכול שלכם מריץ GKE מגרסה ‎1.33.1-gke.1779000 עד 1.36, אתם צריכים להגדיר את השדה spec.loadBalancerClass לערך networking.gke.io/l4-regional-external בזמן שהמניפסט מוחל לראשונה על האשכול. השדה הזה מורה ל-GKE ליצור מאזן עומסי רשת אזורי חיצוני להעברת סיגנל ללא שינוי שמבוסס על שירות לקצה העורפי. ב-GKE 1.37 ואילך, ההגדרה הזו היא התנהגות ברירת המחדל והשדה לא נדרש. חובה להשתמש במאזני עומסים אזוריים חיצוניים של רשתות להעברת סיגנל ללא שינוי שמבוססים על שירותים לקצה העורפי כדי לתמוך בתכונות כמו IPv6 ואיזון עומסים משוקלל.

    • ב-GKE נעשה שימוש ב-GCE_VM_IP NEG backends או ב-unmanaged instance group backends, בהתאם לגרסת האשכול. בקטגוריות עם גרסה 1.32.2-gke.1652000, מאזן עומסים אזורי חיצוני להעברת סיגנל ללא שינוי שמבוסס על שירות קצה עורפי משתמש ב-GCE_VM_IP NEGs. בגרסאות קודמות, מאזן עומסי רשת חיצוני אזורי להעברת סיגנל ללא שינוי שמבוסס על שירות קצה עורפי משתמש בקבוצות של מופעים לא מנוהלים.

    • השדה spec.loadBalancerClass הוא קבוע וצריך להגדיר אותו כשיוצרים את השירות. אי אפשר להוסיף את השדה הזה או לשנות אותו במניפסט של שירות LoadBalancer קיים, כי הוא לא ניתן לשינוי. כל ניסיון לעשות זאת יגרום לשגיאה, והעדכון של השירות ייכשל.

הפעלת איזון עומסים משוקלל

כדי לחלק את החיבורים החדשים באופן יחסי לצמתים על סמך מספר ה-Pods שמוכנים להצגה, נמצאים בהמתנה ולא מסיימים את הפעולה בכל צומת, צריך להפעיל איזון עומסים משוקלל על ידי הוספת ההערה networking.gke.io/weighted-load-balancing: "pods-per-node" למניפסט של השירות.

  1. מוסיפים את ההערה networking.gke.io/weighted-load-balancing: "pods-per-node" למניפסט השירות store-v1-lb-svc.yaml, ומוודאים שמגדירים גם את הערך externalTrafficPolicy: Local כך שייראה כך:

    apiVersion: v1
    kind: Service
    metadata:
      name: store-v1-lb-svc
      annotations:
        networking.gke.io/weighted-load-balancing: "pods-per-node"
    spec:
      type: LoadBalancer
      loadBalancerClass: networking.gke.io/l4-regional-external
      externalTrafficPolicy: Local
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    
  2. החלת המניפסט על האשכול:

    kubectl apply -f store-v1-lb-svc.yaml
    

שימו לב לנקודות הבאות לגבי הדוגמה הזו של איזון עומסים משוקלל:

  • מניפסט השירות משתמש ב-externalTrafficPolicy: Local. אם לא צריך להפעיל איזון עומסים משוקלל, אפשר גם להשתמש ב-externalTrafficPolicy: Cluster. לפרטים על האופן שבו externalTrafficPolicy מגדיר קיבוץ צמתים, אילו צמתים עוברים את בדיקות התקינות של מאזן העומסים ואיך מעובדים חבילות, אפשר לעיין במאמר מושגים של LoadBalancer Service.

  • אם מפעילים איזון עומסים לפי משקל, GKE לא מונע את השימוש ב-externalTrafficPolicy: Cluster, אבל externalTrafficPolicy: Cluster משבית למעשה את איזון העומסים לפי משקל כי יכול להיות שהמנות ינותבו, אחרי מאזן העומסים, לצומת אחר.

אפשר גם להפעיל איזון עומסים משוקלל בשירות LoadBalancer חיצוני קיים באמצעות kubectl edit svc service-name. הפקודה kubectl edit פותחת את מניפסט השירות של איזון העומסים הקיים בעורך הטקסט שהגדרתם, שם תוכלו לשנות את המניפסט ולשמור את השינויים. כשעורכים שירות LoadBalancer חיצוני קיים, חשוב לשים לב לנקודות הבאות:

  • שירות LoadBalancer החיצוני הקיים חייב להוביל ליצירה של מאזני עומסים אזוריים חיצוניים של רשתות להעברת סיגנל ללא שינוי שמבוססים על שירות קצה עורפי. באשכולות שמופעלות בהם גרסאות GKE קודמות לגרסה 1.37, הדרישה הזו אומרת ששדה spec.loadBalancerClass של שירות LoadBalancer חיצוני קיים חייב להיות מוגדר ל-networking.gke.io/l4-regional-external כשקובץ המניפסט הוחל לראשונה על האשכול.

    הוספת ההערה networking.gke.io/weighted-load-balancing: "pods-per-node" לשירות LoadBalancer חיצוני קיים שמשתמש במאזן עומסים אזורי חיצוני של רשתות להעברת סיגנל ללא שינוי שמבוסס על מאגר כתובות יעד לא משפיעה על השירות.

  • כשמעדכנים את המניפסט הקיים של שירות LoadBalancer חיצוני, צריך להגדיר את הערך externalTrafficPolicy: Local. השימוש ב-externalTrafficPolicy: Cluster משבית למעשה את איזון העומסים המשוקלל, כי יכול להיות שהמנה תנותב, אחרי מאזן העומסים, לצומת אחר.

השבתה של איזון עומסים משוקלל

כדי להפיץ חיבורים חדשים לצמתים בלי קשר למספר ה-Pods של שרתים שנמצאים בכל צומת, צריך להשבית את איזון העומסים המשוקלל על ידי הסרת ההערה networking.gke.io/weighted-load-balancing: "pods-per-node" מקובץ המניפסט של השירות.

הפעלת רישום ביומן לשירותי קצה עורפי

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

כדי להגדיר את Cloud Logging, יוצרים משאב מותאם אישית מסוג L4LBConfig שמציין את הגדרות הרישום ביומן. המשאב L4LBConfig מקושר לשירות Kubernetes במניפסט השירות. אחרי שמחילים את המניפסט, בקר GKE מגדיר את הרישום ביומן עבור שירות הקצה העורפי. אם לא מקשרים משאב L4LBConfig לשירות, בקר התנועה מפסיק לנהל את הגדרות הרישום ביומן ומשאיר את שירות לקצה העורפי במצב האחרון הידוע שלו. מידע נוסף זמין במאמר הסבר על אופן הפעולה של COAST.

אפשר להגדיר את השדות הבאים:

  • ‫enabled: אם הערך מוגדר ל-true, מופעלת רישום ביומן של השירות הזה והיומנים זמינים ב-Cloud Logging. אחרת, הרישום ביומן מושבת בשירות הזה.
  • ‫sampleRate: מציין ערך מ-0 עד 1,000,000 (ברירת מחדל), כאשר 0 פירושו שלא מתבצעת רישום של מנות ו-1,000,000 פירושו שמתבצע רישום של 100% מהמנות. השדה sampleRate הוא אופציונלי, והוא רלוונטי רק אם הערך של השדה enable מוגדר כ-true.
  • ‫optionalMode: קובע אילו שדות אופציונליים של מטא-נתונים נכללים ביומנים שנוצרים עבור מאזן העומסים. השדה מקבל אחד מהערכים הבאים של מחרוזות:
    • ‫EXCLUDE_ALL_OPTIONAL: הגדרת ברירת המחדל אם לא מצוין optionalMode. אם מגדירים את האפשרות הזו, אף שדה אופציונלי לא נכלל ביומנים, ומתקבל פורמט היומן הכי תמציתי.
    • ‫INCLUDE_ALL_OPTIONAL: מאפשר רישום ביומן של כל השדות האופציונליים הזמינים, ומספק את רשומות היומן הכי מפורטות.
    • ‫CUSTOM: מציין רשימה מותאמת אישית של שדות אופציונליים שנכללים ביומנים. במצב CUSTOM, צריך גם להשתמש בפרמטר optionalFields כדי לספק רשימה מופרדת בפסיקים של השדות הרצויים.
  • ‫optionalFields: מחרוזת מופרדת בפסיקים של שמות שדות. הגדרה של שדות המטא-נתונים האופציונליים שרוצים לכלול ביומנים שנוצרו. השדה הזה משמש רק כשהערך של optionalMode הוא CUSTOM. אחרת, המערכת מתעלמת מכל הערכים.

כדי להגדיר את Cloud Logging, צריך ליצור את המשאב L4LBConfig באותו מרחב שמות כמו משאב השירות. במניפסט של L4LBConfig שמופיע בדוגמה הבאה, מופעל Cloud Logging וקצב הדגימה מוגדר ל-50% מהבקשות עבור שירות מאזן עומסים נתון.

  1. שומרים את קובץ המניפסט הבא בשם svc-l4lb-config.yaml:

    apiVersion: networking.gke.io/v1
    kind: L4LBConfig
    metadata:
      name: svc-l4lb-config
      namespace: default
    spec:
      logging:
        enabled: true # must be included
        sampleRate: 500000
        optionalMode: "INCLUDE_ALL_OPTIONAL"
    
  2. מחילים את קובץ המניפסט L4LBConfig על האשכול:

    kubectl apply -f svc-l4lb-config.yaml
    
  3. מוסיפים את ההערה networking.gke.io/l4lb-config למניפסט של השירות store-v1-lb-svc.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: store-v1-lb-svc
      annotations:
        cloud.google.com/l4-rbs: "enabled"
        networking.gke.io/l4lb-config: "svc-l4lb-config"
    spec:
      type: LoadBalancer
      selector:
        app: store
      ports:
        - name: tcp-port
          protocol: TCP
          port: 8080
          targetPort: 8080
    
  4. מחילים את מניפסט השירות על האשכול:

    kubectl apply -f store-v1-lb-svc.yaml
    

אימות של שירות LoadBalancer חיצוני והרכיבים שלו

  1. בודקים שהשירות פועל:

    kubectl get svc store-v1-lb-svc
    

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

    NAME               TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)          AGE
    store-v1-lb-svc   LoadBalancer   10.44.196.160     35.193.28.231   8080:32466/TCP   11m
    

    מערכת GKE הקצתה EXTERNAL_IP למאזן עומסי הרשת האזורי החיצוני להעברת סיגנל ללא שינוי.

  2. בודקים את החיבור למאזן העומסים:

    curl EXTERNAL_IP:PORT
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫EXTERNAL_IP: כתובת ה-IP שהוקצתה למאזן עומסי הרשת האזורי החיצוני להעברת סיגנל ללא שינוי.
    • ‫PORT: מספר היציאה שהוקצה למאזן עומסי הרשת האזורי החיצוני להעברת סיגנל ללא שינוי.

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

    Hostname: store-v1-lb-svc-cdb9bb4d6-hflxd
    
    Pod Information:
      -no pod information available-
    
    Server values:
      server_version=nginx: 1.13.3 - lua: 10008
    
    Request Information:
      client_address=10.128.0.50
      method=GET
      real path=/
      query=
      request_version=1.1
      request_scheme=http
      request_uri=EXTERNAL_IP
    
    Request Headers:
      accept=*/*
      host=EXTERNAL_IP
      user-agent=curl/7.81.0
    
    Request Body:
      -no body in request-
    
    
  3. בודקים את שירות LoadBalancer ואת קבוצת ההערות שלו שמתארות אתGoogle Cloud המשאבים שלו:

    kubectl describe svc store-v1-lb-svc
    

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

    Name:                     store-v1-lb-svc
    Namespace:                default
    Labels:                   <none>
    Annotations:              cloud.google.com/neg-status: {"network_endpoint_groups":{"0":"k8s2-qvveq1d8-default-my-service-ext-5s55db85"},"zones":["us-central1-c"]} #This annotation appears in the output only if the service uses NEG backends.
                              networking.gke.io/weighted-load-balancing: pods-per-node #This annotation appears in the output only if weighted load balancing is enabled.
                              service.kubernetes.io/backend-service: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule-for-hc: k8s2-qvveq1d8-default-my-service-ext-5s55db85-fw
                              service.kubernetes.io/healthcheck: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/tcp-forwarding-rule: a808124abf8ce406ca51ab3d4e7d0b7d
    Selector:                 app=store
    Type:                     LoadBalancer
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.18.102.23
    IPs:                      10.18.102.23
    LoadBalancer Ingress:     35.184.160.229
    Port:                     tcp-port  8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 tcp-port  31864/TCP
    Endpoints:                10.20.1.28:8080,10.20.1.29:8080
    Session Affinity:         None
    External Traffic Policy:  Local
    HealthCheck NodePort:     30394
    
    Events:
      Type    Reason                Age                    From                     Message
      ----    ------                ----                   ----                     -------
      Normal  ADD                   4m55s                  loadbalancer-controller  default/my-service-ext
    

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

    • השדה Events. השדה הזה ריק אם שירות LoadBalancer והמשאבים שלו נוצרו בהצלחה. אם אירעה שגיאה, היא מפורטת כאן.
    • רשימה של Annotations מופעל: GKE מוסיף את רשימת ההערות הבאה לקריאה בלבד למניפסט של השירות. כל הערה שהשם שלה מתחיל ב-service.kubernetes.io/ משמשת לציון השם שלGoogle Cloud משאב שנוצר כחלק ממאזן העומסים או כדי לתמוך בו.

      • ההערה networking.gke.io/weighted-load-balancing: pods-per-node מציינת שבוצע איזון עומסים משוקלל, ומאזן העומסים מפזר את התעבורה אל ה-Pods בקצה העורפי על סמך מספר ה-Pods שפועלים בכל צומת.
      • האנוטציה service.kubernetes.io/backend-service מציינת את השם של שירות לקצה העורפי של מאזן העומסים.
      • האנוטציה service.kubernetes.io/healthcheck מציינת את השם של בדיקת תקינות מאזן העומסים שמשמשת את שירות לקצה העורפי.
      • ההערה service.kubernetes.io/tcp-forwarding-rule או service.kubernetes.io/udp-forwarding-rule מציינת את השם של כלל ההעברה של מאזן העומסים.
      • ההערה service.kubernetes.io/firewall-rule מציינת את השם של כלל חומת האש שנוצר כדי לאפשר תנועה לצמתי האשכול. אפשר להתאים אישית את טווחי המקורות של כלל חומת האש הזה באמצעות spec.loadBalancerSourceRanges[]. פרטים נוספים על כללי חומת האש לשירותי LoadBalancer זמינים במאמר בנושא כללי חומת האש ורשימת כתובות ה-IP המותרות.
      • ההערה service.kubernetes.io/firewall-rule-for-hc מציינת את השם של כלל חומת האש שנדרש לבדיקות התקינות של מאזן העומסים.
      • ההערה cloud.google.com/neg-status מציינת את קבוצות ה-NEG שמאזן העומסים משתמש בהן ואת האזורים שלהן. ההערה הזו מופיעה רק אם מתקיימים שני התנאים הבאים:

        • האשכול הפעיל את גרסת GKE‏ 1.32.2-gke.1652000 ואילך כשקובץ המניפסט הוחל על האשכול.
        • השדה spec.loadBalancerClass שהוגדר לערך networking.gke.io/l4-regional-external היה קיים במניפסט השירות כשהוא הוחל על האשכול.
  4. מוודאים שמשאבי מאזן העומסים וכללי חומת האש נוצרו עבור שירות LoadBalancer חיצוני:

    • כדי לראות את כלל ההעברה, מריצים את הפקודה הבאה:

        gcloud compute forwarding-rules describe FWD_RULE_NAME \
          --region=REGION_NAME
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫FWD_RULE_NAME: השם של כלל ההעברה שסופק על ידי ההערות לקריאה בלבד service.kubernetes.io/tcp-forwarding-rule או service.kubernetes.io/udp-forwarding-rule. כדי לבדוק את ההערות האלה, מריצים את הפקודה kubectl describe svc SERVICE_NAME.
      • ‫REGION_NAME: Google Cloud האזור שבו נמצא האשכול. באשכולות אזוריים, האזור מכיל את האזור שבו האשכול משתמש.
    • כדי לראות את שירות לקצה העורפי, מריצים את הפקודה הבאה:

      gcloud compute backend-services describe BACKEND_SERVICE_NAME \
        --region=REGION_NAME
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫BACKEND_SERVICE_NAME: השם של שירות ה-Backend שמוגדר על ידי ההערה service.kubernetes.io/backend-service לקריאה בלבד. כדי לבדוק את ההערה הזו לקריאה בלבד, מריצים את הפקודה kubectl describe svc SERVICE_NAME.
      • ‫REGION_NAME: Google Cloud האזור שבו נמצא האשכול. באשכולות אזוריים, האזור מכיל את התחום שבו נעשה שימוש באשכול.
    • כדי לראות את בדיקת התקינות של מאזן העומסים, מריצים את הפקודה הבאה:

      gcloud compute health-checks describe HEALTH_CHECK_NAME \
        --region=REGION_NAME
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫HEALTH_CHECK_NAME: השם של בדיקת תקינות מאזן העומסים. השם של בדיקת התקינות מופיע בהערה לקריאה בלבד service.kubernetes.io/healthcheck. כדי לבדוק את ההערה לקריאה בלבד, מריצים את הפקודה kubectl describe svc SERVICE_NAME.
      • ‫REGION_NAME: Google Cloud האזור שבו נמצא האשכול. באשכולות אזוריים, האזור מכיל את התחום שבו נעשה שימוש באשכול.
    • כדי לראות את הכללים של חומת האש, מריצים את הפקודות הבאות:

      gcloud compute firewall-rules describe FIREWALL_RULE_NAME
      
      gcloud compute firewall-rules describe HEALTH_CHECK_FIREWALL_RULE_NAME
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫FIREWALL_RULE_NAME: השם של כלל חומת האש שמאפשר תנועה למאזן העומסים. השם של כלל חומת האש הזה מסופק על ידי ההערה service.kubernetes.io/firewall-rule לקריאה בלבד. כדי לבדוק את ההערה הזו לקריאה בלבד, מריצים את הפקודה kubectl describe svc SERVICE_NAME.
      • ‫HEALTH_CHECK_FIREWALL_RULE_NAME: השם של כלל חומת האש שמאפשר בדיקות תקינות של השרתים העורפיים של מאזן העומסים (הצמתים של האשכול). השם של כלל חומת האש הזה מסופק על ידי ההערה service.kubernetes.io/firewall-rule-for-hc לקריאה בלבד. כדי לבדוק את ההערה הזו לקריאה בלבד, מריצים את kubectl describe svc SERVICE_NAME.
    • כדי לראות את קבוצות ה-NEG של מאזן העומסים, מריצים את הפקודה הבאה:

      gcloud compute network-endpoint-groups describe NEG_NAME \
        --zone=ZONE_NAME
      

      מחליפים את מה שכתוב בשדות הבאים:

      • ‫NEG_NAME: שם ה-NEG של מאזן העומסים. השם של ה-NEG מופיע בהערה לקריאה בלבד cloud.google.com/neg-status. כדי לבדוק את ההערה הזו לקריאה בלבד, מריצים את הפקודה kubectl describe svc SERVICE_NAME. ההערה מכילה נתונים מובנים עם מידע על שמות ה-NEG והאזורים שבהם נעשה שימוש במאזן העומסים. במקרה של אשכולות אזוריים, ההערה הזו מכילה מידע על קבוצת קצה אחת. במקרה של אשכולות אזוריים, ההערה הזו מכילה מידע על NEG בכל אזור שבו האשכול ממוקם.
      • ‫ZONE_NAME: האזור Google Cloud שמכיל את קבוצת ה-NEG.
  5. מוודאים ש-Cloud Logging הופעל בשירות הקצה העורפי:

    kubectl get svc SERVICE_NAME --output yaml
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫SERVICE_NAME: השם של שירות ה-Backend.

    בפלט, מוודאים שהשדה Status.Conditions מכיל את הערכים Type: LoggingConfigManaged ו-Reason: Reconciled.

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

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

kubectl delete service store-v1-lb-svc

מערכת GKE מסירה אוטומטית את כל משאבי מאזן העומסים שהיא יצרה עבור שירות LoadBalancer חיצוני.

העברה ל-GCE_VM_IP NEG backends

שירותי LoadBalancer חיצוניים יוצרים מאזני עומסי רשת אזוריים חיצוניים להעברת סיגנל ללא שינוי שמבוססים על שירותים לקצה העורפי אם הם נוצרים ב-GKE 1.37 ואילך, אם מציינים את הערך networking.gke.io/l4-regional-external בשדה spec.loadBalancerClass או אם כוללים את ההערה cloud.google.com/l4-rbs: "enabled". בהתאם לגרסת GKE של האשכול, GKE משתמשת בGCE_VM_IP קבוצות של נקודות קצה ברשת או בקבוצות לא מנוהלות של מופעי מכונה כשרתי קצה:

  • אם מניפסט השירות הוחל על אשכול שמריץ GKE בגרסה 1.32.2-gke.1652000 ואילך, מאזן עומסי הרשת האזורי החיצוני להעברת סיגנל ללא שינוי שנוצר משתמש בקצה העורפי של GCE_VM_IP קבוצת נקודות קצה (NEG) ברשת.

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

מידע נוסף זמין במאמר קיבוץ צמתים בנושא שירותי LoadBalancer.

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

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

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

  1. אם עדיין לא עשיתם זאת, שדרגו את האשכול לגרסה ‎1.32.2-gke.1652000 של GKE ואילך.

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

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫SERVICE_NAME: השם של שירות LoadBalancer חיצוני קיים.

    • ‫SERVICE_NAMESPACE: מרחב השמות של שירות LoadBalancer חיצוני קיים.

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

  3. אחזור מניפסט השירות של שירות LoadBalancer קיים:

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

    • אם אין לכם את מניפסט השירות המקורי:

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

        kubectl get svc SERVICE_NAME -n SERVICE_NAMESPACE -o yaml
        
      • מעתיקים את קובץ ה-YAML של המניפסט לכלי לעריכת טקסט. מסירים את המאפיין status ואת המאפיינים הבאים metadata:

        • כל ההערות הבאות:
          • ההערה kubectl.kubernetes.io/last-applied-configuration
          • כל ההערות שמתחילות ב-service.kubernetes.io
        • creationTimestamp
        • finalizers
        • resourceVersion
        • uid
    • מוודאים שקובץ המניפסט כולל את השדה spec.loadBalancerClass עם הערך networking.gke.io/l4-regional-external. אם אתם מבצעים העברה ממאזן עומסי רשת אזורי חיצוני להעברת סיגנל ללא שינוי שמבוסס על מאגר יעד, צריך להוסיף את השדה.

    שומרים את קובץ המניפסט ורושמים לעצמכם איפה שמרתם אותו. בהמשך התהליך הזה, הנתיב שבו שמרתם את קובץ המניפסט נקרא MANIFEST_FILE_PATH.

  4. מגדירים משאב של כתובת IPv4 חיצונית סטטית כדי להחזיק את כתובת ה-IPv4 החיצונית שמשמשת את מאזן העומסים הקיים:

    gcloud compute addresses create IP_ADDRESS_NAME --region=CLUSTER_REGION --addresses LB_EXTERNAL_IP
    

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫IP_ADDRESS_NAME: השם של כתובת ה-IP החיצונית הסטטית. השם צריך לעמוד במוסכמות למתן שמות למשאבי Compute Engine.

    • ‫CLUSTER_REGION: האזור שבו נמצא האשכול. במקרה של אשכולות אזוריים, זהו האזור שמכיל את התחום של האשכול.

    • ‫LB_EXTERNAL_IP: כתובת ה-IPv4 החיצונית שבה נעשה שימוש במאזן העומסים הנוכחי, שנקבעה בשלב השני של התהליך הזה.

  5. מוודאים שמשאב כתובת ה-IPv4 החיצונית הסטטית נוצר:

    gcloud compute addresses describe IP_ADDRESS_NAME --region=CLUSTER_REGION
    

    מחליפים את המשתנים כמו שמוסבר בשלב הקודם.

  6. מוחקים את השירות הקיים:

    kubectl delete svc SERVICE_NAME -n SERVICE_NAMESPACE
    
  7. מוסיפים את ההערה הבאה לקובץ המניפסט של שירות MANIFEST_FILE_PATH:

    networking.gke.io/load-balancer-ip-addresses: IP_ADDRESS_NAME
    

    מידע נוסף על ההערה הזו זמין במאמר כתובות IP סטטיות בפרמטרים של שירות LoadBalancer.

  8. מחילים את מניפסט השירות המעודכן על האשכול:

    kubectl apply -f MANIFEST_FILE_PATH
    
  9. (אופציונלי) משחררים את משאב כתובת ה-IPv4 הסטטית.

    gcloud compute addresses delete IP_ADDRESS_NAME --region=CLUSTER_REGION
    

פתרון בעיות

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

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

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

kubectl describe svc store-v1-lb-svc`
Events:
  Type     Reason                   Age      From                     Message
  ----     ------                   ----     ----                     -------
  Warning  UnsupportedConfiguration 4m55s    loadbalancer-controller  Weighted load balancing by pods-per-node has no effect with External Traffic Policy: Cluster.

כדי להפעיל בצורה יעילה איזון עומסים משוקלל, צריך להגדיר את הערך externalTrafficPolicy: Local.

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