יצירת מאזן עומסים פנימי ברשתות VPC

בדף הזה מוסבר איך ליצור מאזן עומסים פנימי מסוג העברת נתונים ב-Google Kubernetes Engine ‏ (GKE) ברשתות VPC.

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

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

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

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

יצירת מאזן עומסים פנימי עם Private Service Connect

בתור בעלים של שירות מנוהל, אתם יכולים להשתמש בנקודות חיבור לשירות כדי להפוך את השירותים שלכם לזמינים לצרכני שירותים ברשתות VPC אחרות באמצעות Private Service Connect. אפשר ליצור, לנהל ולמחוק קבצים מצורפים לשירות באמצעות ServiceAttachmentמשאב בהתאמה אישית. הבקר של GKE Private Service Connect עוקב אחרי משאב ServiceAttachment ויוצר, מעדכן או מוחק באופן אוטומטי משאב ServiceAttachment תואם ב-Compute Engine.

דרישות ומגבלות

  • חלות מגבלות על Private Service Connect.
  • אפשר ליצור קובץ מצורף לשירות בגרסאות GKE‏ 1.21.4-gke.300 ואילך.
  • התוסף HttpLoadBalancing צריך להיות מופעל באשכול. במערכות חדשות של GKE, התוסף HttpLoadBalancing מופעל כברירת מחדל.
  • אי אפשר להשתמש באותה רשת משנה בכמה הגדרות של קובצי שירות.
  • צריך ליצור שירות GKE שמשתמש במאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי.
  • אי אפשר לציין רשת משנה בפרויקט אחר (VPC משותף) בגרסאות GKE קודמות לגרסה 1.22.4-gke.100. ב-VPC משותף, צריך לוודא שמתקיימות כל הדרישות ל-VPC משותף.
  • אחרי שיוצרים קובץ מצורף לשירות, אי אפשר לעדכן את מאזן העומסים הפנימי. כדי לשנות את ההגדרות של מאזן העומסים, צריך למחוק את קובץ השירות המצורף וליצור אותו מחדש.

יצירת ServiceAttachment

  1. יוצרים רשת משנה.

    צריך ליצור רשת משנה חדשה לכל ServiceAttachment.

    gcloud compute networks subnets create SUBNET_NAME \
        --project PROJECT_ID \
        --network NETWORK_NAME \
        --region REGION \
        --range SUBNET_RANGE \
        --purpose PRIVATE_SERVICE_CONNECT
    

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

    • SUBNET_NAME: השם של תת-הרשת החדשה. בגרסאות GKE‏ 1.22.4-gke.100 ואילך, אפשר לציין רשת משנה בפרויקט אחר באמצעות כתובת ה-URL של המשאב המוגדר במלואו בשדה הזה. אפשר לקבל את כתובת ה-URL המלאה של המשאב באמצעות הפקודה gcloud compute networks subnets describe.
    • PROJECT_ID: המזהה של הפרויקט ב- Cloud de Confiance.
    • NETWORK_NAME: השם של רשת ה-VPC של תת-הרשת.
    • REGION: האזור של רשת המשנה החדשה. חובה להשתמש באותו אזור כמו השירות שאתם יוצרים.
    • SUBNET_RANGE: טווח כתובות ה-IP לשימוש בתת-הרשת.
  2. פריסת עומס עבודה.

    קובץ המניפסט הבא מתאר פריסה שמריצה קובץ אימג' בקונטיינר של אפליקציית אינטרנט לדוגמה. שומרים את קובץ המניפסט בשם my-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: psc-ilb
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: psc-ilb
      template:
        metadata:
          labels:
            app: psc-ilb
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1
            ports:
              - name: http
                containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
              initialDelaySeconds: 5
              timeoutSeconds: 1
    
  3. מחילים את המניפסט על האשכול:

    kubectl apply -f my-deployment.yaml
    
  4. יוצרים שירות. במניפסט הבא מתואר שירות שיוצר מאזן עומסים פנימי להעברת סיגנל ללא שינוי ביציאת TCP‏ 8080. שומרים את קובץ המניפסט בשם my-service.yaml:

     apiVersion: v1
     kind: Service
     metadata:
       name: SERVICE_NAME
       annotations:
         networking.gke.io/load-balancer-type: "Internal"
     spec:
       type: LoadBalancer
       selector:
         app: psc-ilb
       ports:
       - port: 80
         targetPort: 8080
         protocol: TCP
    

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

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

    kubectl apply -f my-service.yaml
    
  6. יצירת ServiceAttachment.

    במניפסט הבא מתואר ServiceAttachment שחושף את השירות שיצרתם לצרכני השירות. שומרים את קובץ המניפסט בשם my-psc.yaml:

    apiVersion: networking.gke.io/v1
    kind: ServiceAttachment
    metadata:
     name: SERVICE_ATTACHMENT_NAME
     namespace: default
    spec:
     connectionPreference: ACCEPT_AUTOMATIC
     natSubnets:
     - SUBNET_NAME
     proxyProtocol: false
     reconcileConnections: false  # set to true to enable connection reconciliation
     resourceRef:
       kind: Service
       name: SERVICE_NAME
    

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

    • SERVICE_ATTACHMENT_NAME: השם של קובץ השירות החדש.
    • SUBNET_NAME: השם של תת-הרשת החדשה. בגרסאות GKE‏ 1.22.4-gke.100 ואילך, אפשר לציין רשת משנה בפרויקט אחר באמצעות כתובת ה-URL של המשאב המוגדר במלואו בשדה הזה. אפשר לקבל את כתובת ה-URL המלאה של המשאב באמצעות הפקודה gcloud compute networks subnets describe. במקרה של הגדרת VPC משותף, משתמשים בפורמט הבא: projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME.

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

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

    kubectl apply -f my-psc.yaml
    
  8. מוודאים שבקר Private Service Connect יצר את קובץ השירות המצורף:

    gcloud compute service-attachments list
    

    הפלט מציג קובץ מצורף לשירות עם שם שנוצר אוטומטית:

    NAME        REGION       PRODUCER_FORWARDING_RULE          CONNECTION_PREFERENCE
    k8s1-sa-... REGION_NAME  a3fea439c870148bdba5e59c9ea9451a  ACCEPT_AUTOMATIC
    

הצגת ServiceAttachment

אפשר לראות את הפרטים של ServiceAttachment באמצעות הפקודה הבאה:

kubectl describe serviceattachment SERVICE_ATTACHMENT_NAME

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

Name:        <sa-name>
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         ServiceAttachment
Metadata:
  ...
Status:
  Forwarding Rule URL:      https://www.googleapis.com/compute/beta/projects/<project>/regions/<region>/forwardingRules/<fr-name>
  Last Modified Timestamp:  2021-07-08T01:32:39Z
  Service Attachment URL:   https://www.googleapis.com/compute/beta/projects/<projects>/regions/<region>/serviceAttachments/<gce-service-attachment-name>
Events:                     <none>

צריכת ServiceAttachment

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

  1. מקבלים את כתובת ה-URL של ServiceAttachment:

    kubectl get serviceattachment SERVICE_ATTACHMENT_NAME -o=jsonpath="{.status.serviceAttachmentURL}"
    

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

      serviceAttachmentURL: https://www.googleapis.com/compute/alpha/projects/<project>/region/<region>/serviceAttachments/k8s1-...my-sa
    
  2. יוצרים נקודת קצה מסוג Private Service Connect באמצעות כתובת ה-URL של ServiceAttachment.

  3. מוודאים שאפשר להתחבר לשירות שפרסתם בפרויקט היצרן באמצעות פקודה curl ממכונה וירטואלית בפרויקט הצרכן:

    curl PSC_IP_ADDRESS
    

    מחליפים את PSC_IP_ADDRESS בכתובת ה-IP של כלל ההעברה בפרויקט של הצרכן.

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

    {
      "cluster_name":"cluster",
      "host_header":"10.128.15.200",
      "node_name":"gke-psc-default-pool-be9b6e0e-dvxg.c.gke_project.internal",
      "pod_name":"foo-7bf648dcfd-l5jf8",
      "pod_name_emoji":"👚",
      "project_id":"gke_project",
      "timestamp":"2021-06-29T21:32:03",
      "zone":"ZONE_NAME"
    }
    

עדכון של ServiceAttachment

כדי לעדכן ServiceAttachment:

  1. עורכים את קובץ המניפסט ServiceAttachment ב-my-psc.yaml:

    apiVersion: networking.gke.io/v1
    kind: ServiceAttachment
    metadata:
      name: my-sa
      namespace: default
    spec:
      connectionPreference: ACCEPT_AUTOMATIC
      natSubnets:
      - my-nat-subnet
      proxyProtocol: false
      resourceRef:
        kind: Service
        name: ilb-service
    
  2. מחילים את המניפסט על האשכול:

    kubectl apply -f my-psc.yaml
    

מחיקת ServiceAttachment

אי אפשר למחוק מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי שמחובר ל-Service Attachment. צריך למחוק את קובץ השירות ואת GKE Service בנפרד.

  1. מוחקים את קובץ השירות המצורף:

    kubectl delete serviceattachment SERVICE_ATTACHMENT_NAME --wait=false
    

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

  2. מחיקת השירות:

    kubectl delete svc SERVICE_NAME
    
  3. מוחקים את תת-הרשת:

    gcloud compute networks subnets delete SUBNET_NAME
    

ServiceAttachment שדות

השדה ServiceAttachment כולל את השדות הבאים:

  • connectionPreference: העדפת החיבור שקובעת איך הלקוחות מתחברים לשירות. אפשר להשתמש באישור אוטומטי של פרויקטים באמצעות ACCEPT_AUTOMATIC או באישור מפורש של פרויקטים באמצעות ACCEPT_MANUAL. מידע נוסף מופיע במאמר פרסום שירותים באמצעות Private Service Connect.
  • natSubnets: רשימה של שמות משאבים של רשתות משנה לשימוש בצירוף השירות.
  • proxyProtocol: אם הערך מוגדר כ-true, כתובת ה-IP של צרכן המקור ומזהה החיבור של Private Service Connect זמינים בבקשות. השדה הזה הוא אופציונלי, ואם לא מציינים ערך, ברירת המחדל היא false.
  • reconcileConnections (תצוגה מקדימה): אם הערך מוגדר כ-true, שינויים ברשימות של צרכני השירות שמקבלים או דוחים את החיבור יגרמו לסיום אוטומטי של חיבורים קיימים לא מורשים. אם ההגדרה היא false, השינויים ישפיעו רק על חיבורים חדשים. השדה הזה הוא אופציונלי וערך ברירת המחדל שלו הוא false. השדה הזה נתמך מגרסה 1.36.0-gke.2459000 של GKE ואילך.
  • consumerAllowList: רשימת הפרויקטים של הצרכנים שמורשים להתחבר אל consumerAllowList.ServiceAttachment אפשר להשתמש בשדה הזה רק אם הערך של connectionPreference הוא ACCEPT_MANUAL. מידע נוסף על השדה הזה זמין במאמר פרסום שירותים באמצעות Private Service Connect.
    • project: מזהה הפרויקט או מספר הפרויקט של פרויקט הצרכן.
    • connectionLimit: מגבלת החיבורים לפרויקט הצרכן. השדה הזה הוא אופציונלי.
    • forceSendFields: שמות השדות שיישלחו לבקשות ה-API. השדה הזה הוא אופציונלי.
    • nullFields: שמות השדות שרוצים לכלול בבקשות ל-API עם ערך null. השדה הזה הוא אופציונלי.
  • consumerRejectList: רשימת המזהים או המספרים של פרויקטים של צרכנים שאסור להם להתחבר אל ServiceAttachment. אפשר להשתמש בשדה הזה רק אם הערך של connectionPreference הוא ACCEPT_MANUAL. מידע נוסף על השדה הזה זמין במאמר פרסום שירותים באמצעות Private Service Connect.
  • resourceRef: הפניה למשאב Kubernetes.

    • kind: סוג משאב Kubernetes. חובה להשתמש ב-Service.
    • name: השם של משאב Kubernetes שצריך להיות באותו מרחב שמות כמו מאזן העומסים הפנימי להעברת סיגנל ללא שינוי.

פתרון בעיות

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

kubectl get events -n NAMESPACE

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

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

אם מנסים למחוק מאזן עומסים פנימי מסוג passthrough Network Load Balancer שנמצא בשימוש על ידי שירות מצורף, מופיעה הודעת שגיאה דומה לזו שבהמשך. כדי למחוק את מאזן העומסים הפנימי מסוג Network Load Balancer, צריך קודם למחוק את ServiceAttachment.

Error syncing load balancer: failed to ensure load balancer: googleapi:
Error 400: The forwarding_rule resource '<fwd-rule-URL>' is already being used
by '<svc-attachment-URL>', resourceInUseByAnotherResource.

שגיאה בהפעלת גישה גלובלית

יכול להיות שתיתקלו בשגיאה כשתפעילו גישה גלובלית למאזן עומסים פנימי מסוג Network Load Balancer שמשתמש ב-Private Service Connect service attachment.

תסמין:

כשמפעילים גישה גלובלית על ידי עדכון מניפסט השירות של GKE והגדרת ההערה networking.gke.io/internal-load-balancer-allow-global-access: "true", העדכון נכשל כשמחילים את המניפסט. כשמריצים את הפקודה kubectl get events, מופיעה הודעת השגיאה הבאה:

Error syncing load balancer: failed to ensure load balancer: googleapi: Error 400: The forwarding_rule resource '...' is already being used by '...', resourceInUseByAnotherResource

הסיבה:

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

פתרון עקיף:

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

  1. מעדכנים את מניפסט השירות של GKE: מעדכנים את מניפסט השירות של GKE כדי לכלול את ההערה networking.gke.io/internal-load-balancer-allow-global-access: "true".

  2. הפעלה ידנית של גישה גלובלית בכלל ההעברה: פועלים לפי השלבים במאמר הפעלה של גישה גלובלית כדי לעדכן את כלל ההעברה של מאזן העומסים באמצעותCloud de Confiance המסוף, Google Cloud CLI או Compute Engine API.

השדה ReconcileConnections לא מסונכרן

אם הפעלתם ידנית את השדה ReconcileConnections במשאב ServiceAttachment של Compute Engine, אבל השמטתם את השדה ממניפסט Kubernetes, ברירת המחדל של השדה היא false. במקרה כזה, בקר ה-GKE לא מחליף את הערך של השדה.

תסמין:

למשאב Kubernetes ServiceAttachment יש את ההערה networking.gke.io/unsynced-field: ReconcileConnections. כשמריצים את הפקודה kubectl get events, מוצג אירוע אזהרה שדומה לזה:

Field "ReconcileConnections" is not specified in the ServiceAttachment CR but has a value in GCE. The controller will not overwrite this field until it is explicitly set in the CR.

פתרון עקיף:

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

  • מעדכנים את המשאב ServiceAttachment של GKE: מעדכנים את המניפסט של GKE ServiceAttachment כדי לכלול את reconcileConnections: true (או false אם רוצים להשבית אותו).
  • מעדכנים את משאב ServiceAttachment של Compute Engine: מגדירים ידנית את השדה reconcileConnections לערך false.

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