בדף הזה מוסבר איך ליצור מאזן עומסי רשת פנימי עם העברה (passthrough) ב-Google Kubernetes Engine (GKE) ברשתות VPC.
לפני שקוראים את הדף הזה, חשוב לוודא שמכירים את המושגים הבאים:
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את המשימות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם כבר התקנתם את ה-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 שמשתמש במאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי.
- שירות GKE חייב להשתמש בפרוטוקול אחד בלבד. אין תמיכה בשירותי GKE עם פרוטוקולים מעורבים.
- בגרסאות GKE שקודמות ל-1.22.4-gke.100, אי אפשר לציין רשת משנה בפרויקט אחר (VPC משותף). ב-VPC משותף, ודאו שאתם עומדים בכל הדרישות של VPC משותף.
- אחרי שיוצרים קובץ מצורף לשירות, אי אפשר לעדכן את מאזן העומסים הפנימי. כדי לשנות את ההגדרות של מאזן העומסים, צריך למחוק את קובץ השירות המצורף וליצור אותו מחדש.
יצירת ServiceAttachment
יוצרים רשת משנה.
צריך ליצור רשת משנה חדשה לכל
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: מזהה הפרויקט ב- Google Cloud. -
NETWORK_NAME: השם של רשת ה-VPC של תת-הרשת. -
REGION: האזור של רשת המשנה החדשה. אתם צריכים להשתמש באותו אזור שבו נמצא השירות שאתם יוצרים. -
SUBNET_RANGE: טווח כתובות ה-IP שבו יש להשתמש ברשת המשנה.
-
פורסים עומס עבודה.
המניפסט הבא מתאר פריסה שמריצה קובץ אימג' של קונטיינר של אפליקציית אינטרנט לדוגמה. שומרים את המניפסט בתור
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מחילים את המניפסט על האשכול:
kubectl apply -f my-deployment.yamlיוצרים שירות. המניפסט הבא מתאר שירות שיוצר מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי ביציאת 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: שם השירות החדש.
-
מחילים את המניפסט על האשכול:
kubectl apply -f my-service.yamlיוצרים
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.
מידע נוסף על שדות המניפסט זמין במאמר בנושא שדות של קובץ מצורף לשירות.
-
מחילים את המניפסט על האשכול:
kubectl apply -f my-psc.yamlמוודאים שהבקר של 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
כדי להשתמש בשירות מפרויקט אחר, פועלים לפי השלבים הבאים:
מציאת כתובת ה-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יוצרים נקודת קצה (endpoint) מסוג Private Service Connect באמצעות כתובת ה-URL של
ServiceAttachment.כדי לוודא שאתם יכולים להתחבר לשירות שפרסתם בפרויקט של הספק, השתמשו בפקודה
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:
עורכים את קובץ המניפסט
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מחילים את המניפסט על האשכול:
kubectl apply -f my-psc.yaml
מחיקת ServiceAttachment
אי אפשר למחוק מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי שמחובר ל-Service Attachment. צריך למחוק את קובץ השירות ואת שירות GKE בנפרד.
מוחקים את קובץ השירות המצורף:
kubectl delete serviceattachment SERVICE_ATTACHMENT_NAME --wait=falseהפקודה הזו מסמנת את קובץ השירות למחיקה, אבל המשאב ממשיך להתקיים. אפשר גם להשמיט את הדגל
--waitכדי לחכות עד שהמחיקה תסתיים.מחיקת השירות:
kubectl delete svc SERVICE_NAMEמוחקים את תת-הרשת:
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. השדה הזה נתמך מגרסה GKE 1.36.0-gke.2459000 ואילך.-
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.
שגיאה במחיקת מאזן עומסי רשת פנימי להעברת סיגנל ללא שינוי
אם מנסים למחוק מאזן עומסי רשת פנימי מסוג passthrough שנמצא בשימוש על ידי שירות מצורף, מופיעה הודעת שגיאה דומה לזו שבהמשך. צריך למחוק את 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.
שגיאה בהפעלת גישה גלובלית
יכול להיות שתיתקלו בשגיאה כשתפעילו גישה גלובלית למאזן עומסי רשת פנימי מסוג passthrough שמשתמש ב-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 וגם לעדכן ידנית את כלל ההעברה:
מעדכנים את מניפסט השירות של GKE: מעדכנים את מניפסט השירות של GKE כדי לכלול את ההערה
networking.gke.io/internal-load-balancer-allow-global-access: "true".הפעלה ידנית של גישה גלובלית בכלל ההעברה: פועלים לפי השלבים במאמר הפעלה של גישה גלובלית כדי לעדכן את כלל ההעברה של מאזן העומסים באמצעותGoogle Cloud המסוף, Google Cloud CLI או Compute Engine API.
השדה ReconcileConnections לא מסונכרן
אם הפעלתם ידנית את השדה ReconcileConnections במשאב ServiceAttachment של Compute Engine, אבל השמטתם את השדה ממניפסט Kubernetes, ברירת המחדל של השדה היא false. במקרה כזה, בקר ה-GKE לא מחליף את הערך של השדה.
הסימפטום:
למשאב ServiceAttachment של Kubernetes יש את ההערה 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.
המאמרים הבאים
- סקירה כללית על רשת GKE
- מידע נוסף על מאזני עומסים ב-Compute Engine
- איך יוצרים אשכולות שמותאמים ל-VPC
- מידע על הגדרת רשתות מורשות
- פתרון בעיות באיזון עומסים ב-GKE