מאזני עומסים חיצוניים (ELB) חושפים שירותים לגישה מחוץ לארגון ממאגר של כתובות IP שהוקצו לארגון ממאגר גדול יותר של כתובות IP חיצוניות של מופעים.
כתובות IP וירטואליות (VIP) של ELB לא מתנגשות בין ארגונים והן ייחודיות בכל הארגונים. לכן, צריך להשתמש בשירותי ELB רק לשירותים שלקוחות מחוץ לארגון צריכים לגשת אליהם.
עומסי עבודה שפועלים בתוך הארגון יכולים לגשת לשירותי ELB כל עוד מאפשרים לעומסי העבודה לצאת מהארגון. דפוס התנועה הזה דורש למעשה תנועה יוצאת מהארגון לפני החזרה לשירות הפנימי.
יש הוראות שונות להגדרת ELB עבור אשכולות משותפים ורגילים.
יצירת מאזן עומסים חיצוני לאשכולות משותפים
אפשר ליצור מאזני עומסים גלובליים או אזוריים. ההיקף של מאזני עומסים גלובליים (ELB) משתרע על פני יקום GDC. ההיקף של מאזני עומסים אזוריים מוגבל לאזור שצוין בזמן היצירה. מידע נוסף זמין במאמר מאזני עומסים גלובליים ואזוריים.
לפני שמתחילים
כדי להגדיר שירותי ELB, צריך:
- הבעלים של הפרויקט שבו מגדירים את מאזן העומסים. מידע נוסף מופיע במאמר יצירת פרויקט.
- יש לכם מדיניות כניסה מותאמת אישית של
ProjectNetworkPolicy(PNP) כדי לאפשר תעבורה לשירות ELB הזה. מידע נוסף זמין במאמר הגדרת PNP כדי לאפשר תנועה ל-ELB. יש לכם את התפקידים הנדרשים לניהול זהויות והרשאות גישה:
- אדמין NetworkPolicy של פרויקט: יש לו גישה לניהול מדיניות הרשת של הפרויקט במרחב השמות של הפרויקט. צריך לבקש מאדמין IAM של הארגון להקצות לכם את התפקיד 'אדמין NetworkPolicy בפרויקט' (
project-networkpolicy-admin). - אדמין מאזן עומסים: צריך לבקש מאדמין IAM בארגון להקצות לכם את התפקיד אדמין מאזן עומסים (
load-balancer-admin). - אדמין של מאזן עומסים גלובלי: כדי להשתמש במאזני עומסים גלובליים, צריך לבקש מאדמין IAM בארגון להקצות לכם את התפקיד 'אדמין של מאזן עומסים גלובלי' (
global-load-balancer-admin). מידע נוסף זמין במאמר בנושא תיאורים של תפקידים מוגדרים מראש.
- אדמין NetworkPolicy של פרויקט: יש לו גישה לניהול מדיניות הרשת של הפרויקט במרחב השמות של הפרויקט. צריך לבקש מאדמין IAM של הארגון להקצות לכם את התפקיד 'אדמין NetworkPolicy בפרויקט' (
הגדרת PNP כדי לאפשר תעבורת נתונים ל-ELB
כדי ששירותי ELB יפעלו, צריך להגדיר ולהחיל מדיניות כניסה מותאמת אישית משלכם ProjectNetworkPolicy כדי לאפשר תעבורה לעומסי העבודה של שירות ה-ELB הזה.
מדיניות הרשת שולטת בגישה לעומסי העבודה, ולא במאזן העומסים עצמו.
מאזני עומסים מסוג ELB חושפים עומסי עבודה לרשת הלקוחות, ולכן נדרשת מדיניות רשת מפורשת כדי לאפשר תעבורה חיצונית ליציאת עומס העבודה, כמו 8080.
מציינים את כתובת ה-CIDR החיצונית כדי לאפשר תנועה לעומסי העבודה של ה-ELB הזה:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
namespace: PROJECT
name: allow-inbound-traffic-from-external
spec:
policyType: Ingress
subject:
subjectType: UserWorkload
ingress:
- from:
- ipBlock:
cidr: CIDR
ports:
- protocol: TCP
port: PORT
EOF
מחליפים את מה שכתוב בשדות הבאים:
-
MANAGEMENT_API_SERVER: נתיב kubeconfig של שרת Management API. אם עדיין לא יצרתם קובץ kubeconfig לשרת ה-API באזור היעד, תוכלו לקרוא פרטים נוספים במאמר בנושא כניסה. -
PROJECT: השם של פרויקט GDC. -
CIDR: ה-CIDR החיצוני שצריך לגשת ל-ELB ממנו. המדיניות הזו נדרשת כי מאזן העומסים החיצוני משתמש ב-Direct Server Return (DSR), ששומר על כתובת ה-IP החיצונית של המקור ומדלג על מאזן העומסים בנתיב החזרה. מידע נוסף זמין במאמר בנושא יצירת כלל חומת אש גלובלי לתעבורה חיצונית לארגון. -
PORT: היציאה של הקצה העורפי בתרמילים שמאחורי מאזן העומסים. הערך הזה מופיע בשדה.spec.ports[].targetPortשל המניפסט עבור משאבService. השדה הזה הוא אופציונלי.
יוצרים ELB בשלוש שיטות שונות ב-GDC:
- משתמשים ב-CLI של gcloud כדי ליצור איזון עומסים גלובלי או אזורי.
- אפשר להשתמש ב-Networking Kubernetes Resource Model (KRM) API כדי ליצור איזון עומסים גלובלי או אזורי.
- שימוש בשירות Kubernetes ישירות באשכול Kubernetes. השיטה הזו זמינה רק ל-ELB אזוריים.
אתם יכולים לטרגט עומסי עבודה של פוד או מכונה וירטואלית באמצעות KRM API ו-gdcloud CLI. כשמשתמשים בשירות Kubernetes ישירות באשכול Kubernetes, אפשר לטרגט עומסי עבודה רק באשכול שבו נוצר אובייקט Service.
יצירת ELB אזורי
יוצרים איזון עומסים אזורי באמצעות gdcloud CLI, KRM API או Kubernetes Service באשכול Kubernetes:
gdcloud
יוצרים ELB שמטרגט עומסי עבודה של פוד או מכונה וירטואלית באמצעות CLI של gcloud.
ה-ELB הזה מכוון לכל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט Backend.
כדי ליצור ELB באמצעות gdcloud CLI, מבצעים את השלבים הבאים:
יוצרים משאב
Backendכדי להגדיר את נקודת הקצה של ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --zone=ZONE \ --cluster-name=CLUSTER_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_NAME: השם שבחרתם למשאב העורפי, למשלmy-backend. -
LABELS: סלקטור שמגדיר באילו נקודות קצה בין פודים ומכונות וירטואליות להשתמש בשביל משאב ה-Backend הזה. לדוגמה,app=web. -
PROJECT_NAME: שם הפרויקט. -
ZONE: האזור שבו רוצים להשתמש להפעלה הזו. כדי להגדיר מראש את דגל האזור לכל הפקודות שדורשות אותו, מריצים את הפקודה:gdcloud config set core/zone ZONE. הדגל של האזור זמין רק בסביבות מרובות אזורים. השדה הזה הוא אופציונלי. -
CLUSTER_NAME: האשכול שההיקף של הסלקטורים המוגדרים מוגבל אליו. אם לא מציינים את השדה הזה, כל נקודות הקצה עם התווית שצוינה נבחרות. השדה הזה הוא אופציונלי.
-
אפשר לדלג על השלב הזה אם ה-ELB הזה מיועד לעומסי עבודה של Pod. אם מגדירים ELB לעומסי עבודה של מכונות וירטואליות, צריך להגדיר את סוג בדיקת התקינות עבור ה-ELB. לדוגמה, כדי ליצור בדיקת תקינות של TCP, מגדירים אותה כך:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --zone=ZONEמחליפים את מה שכתוב בשדות הבאים:
-
HEALTH_CHECK_NAME: השם שבחרתם למשאב של בדיקת תקינות, למשלmy-health-check. -
CHECK_INTERVAL: משך הזמן בשניות מתחילת בדיקה אחת עד לתחילת הבדיקה הבאה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
HEALTHY_THRESHOLD: מספר הבדיקות הרציפות שצריכות לעבור כדי שנקודת הקצה תיחשב תקינה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. -
TIMEOUT: משך הזמן בשניות שצריך להמתין לפני שמדווח על כשל. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
UNHEALTHY_THRESHOLD: מספר הבדיקות הרציפות שצריכות להיכשל כדי שנקודת הקצה תיחשב כלא תקינה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא2. -
PORT: היציאה שבה מתבצעת בדיקת תקינות. ערך ברירת המחדל הוא80. השדה הזה הוא אופציונלי. -
ZONE: האזור שבו יוצרים את ה-ELB.
-
יוצרים משאב
BackendServiceומוסיפים לו את משאבBackendשנוצר קודם:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT_NAME \ --target-ports=TARGET_PORTS \ --zone=ZONE \ --health-check=HEALTH_CHECK_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_SERVICE_NAME: השם שנבחר לשירות ה-Backend הזה. -
TARGET_PORT: רשימה מופרדת בפסיקים של יציאות יעד שהשירות לקצה העורפי הזה מתרגם, כאשר כל יציאת יעד מציינת את הפרוטוקול, את היציאה בכלל ההעברה ואת היציאה בשרת העורפי. אפשר לציין כמה יציאות יעד. השדה הזה חייב להיות בפורמטprotocol:port:targetport, לדוגמהTCP:80:8080. השדה הזה הוא אופציונלי. -
HEALTH_CHECK_NAME: השם של משאב בדיקת תקינות. השדה הזה הוא אופציונלי. צריך לכלול את השדה הזה רק אם מגדירים ELB לעומסי עבודה של מכונות וירטואליות.
-
מוסיפים את המשאב
BackendServiceלמשאבBackendשיצרתם קודם:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --project=PROJECT_NAME \ --zone=ZONEאופציונלי: משתמשים בזיקה לסשן (session affinity) ב-ELB כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל את ההגדרה 'זיקה לסשן (session affinity)' למאזני עומסים, יוצרים מדיניות של שירות לקצה העורפי באמצעות הפקודה
gdcloud compute load-balancer-policy create:gdcloud compute load-balancer-policy create POLICY_NAME --session-affinity=MODE --selectors=RESOURCE_LABELמחליפים את מה שכתוב בשדות הבאים:
-
POLICY_NAME: השם שבחרתם למדיניות של שירות הקצה העורפי.
MODE: מצב הזיקה לסשן. יש שני מצבים נתמכים:-
NONE: שיוך סשנים מושבת. הבקשות מנותבות לכל מערכת קצה עורפי זמינה. זהו מצב ברירת המחדל. -
CLIENT_IP_DST_PORT_PROTO: בקשות מאותו טופל (כתובת IP של המקור, כתובת IP של היעד, יציאת היעד ופרוטוקול) מנותבות לאותו קצה עורפי.
-
RESOURCE_LABEL: בורר התוויות שבוחר את שירות לקצה העורפי שאליו מוחל משאבBackendServicePolicyבמרחב השמות של הפרויקט. אם כמה משאביBackendServicePolicyתואמים לאותו שירות לקצה העורפי, ולפחות לאחת ממדיניות ההרשאה הזו מופעלת זיקה לסשן (session affinity), אז הזיקה לסשן (session affinity) למשאבBackendServiceהזה מופעלת.
-
יוצרים משאב חיצוני מסוג
ForwardingRuleשמגדיר את כתובת ה-IP הווירטואלית שבה השירות זמין:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --zone=ZONE \ --project=PROJECT_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_SERVICE_NAME: השם של שירות הקצה העורפי. -
FORWARDING_RULE_EXTERNAL_NAME: השם שבחרתם לכלל ההעברה. -
CIDR: השדה הזה הוא אופציונלי. אם לא מציינים כתובת, המערכת שומרת אוטומטית כתובתIPv4/32CIDR ממאגר כתובות ה-IP האזורי. מציינים את השם של משאבSubnetבאותו מרחב שמות כמו כלל ההעברה הזה. משאבSubnetמייצג את המידע על הבקשה וההקצאה של רשת משנה אזורית. מידע נוסף על משאביSubnetזמין במאמר דוגמאות למשאבים בהתאמה אישית. -
PROTOCOL_PORT: הפרוטוקול והיציאה שיוצגו בכלל ההעברה. השדה הזה חייב להיות בפורמטip-protocol=TCP:80. היציאה שנחשפת חייבת להיות זהה ליציאה שהאפליקציה בפועל חושפת בתוך הקונטיינר.
-
כדי לוודא שה-ELB מוגדר, צריך לאשר את התנאי
Readyבכל אחד מהאובייקטים שנוצרו. כדי לקבל את כתובת ה-IP שהוקצתה למאזן העומסים, מתארים את כלל ההעברה:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAMEכדי לאמת את ה-ELB שהוגדר, צריך לוודא שהתנאי
Readyמופיע בכל אחד מהאובייקטים שנוצרו. מאמתים את התנועה באמצעותcurlבקשה לכתובת ה-VIP:כדי לקבל את כתובת ה-VIP שהוקצתה, מתארים את כלל ההעברה:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAMEמאמתים את התנועה באמצעות בקשת
curlאל ה-VIP ביציאה שצוינה בשדהPROTOCOL_PORTבכלל ההעברה:curl http://FORWARDING_RULE_VIP:PORTמחליפים את מה שכתוב בשדות הבאים:
-
FORWARDING_RULE_VIP: כתובת ה-VIP של כלל ההעברה. -
PORT: מספר היציאה בשדהPROTOCOL_PORTבכלל ההעברה.
-
API
יוצרים ELB שמטרגט עומסי עבודה של פוד או מכונה וירטואלית באמצעות KRM API.
ה-ELB הזה מכוון לכל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט Backend.
כדי ליצור איזון עומסים אזורי באמצעות KRM API, פועלים לפי השלבים הבאים:
יוצרים משאב
Backendכדי להגדיר את נקודות הקצה של ELB. יוצרים משאביBackendלכל אזור שבו ממוקמים עומסי העבודה:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT_NAME name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: server EOFמחליפים את מה שכתוב בשדות הבאים:
-
MANAGEMENT_API_SERVER: נתיב kubeconfig של שרת Management API אזורי. מידע נוסף זמין במאמר מעבר להקשר אזורי. -
PROJECT_NAME: שם הפרויקט. -
BACKEND_NAME: השם של משאבBackend. -
CLUSTER_NAME: זהו שדה אופציונלי. בשדה הזה מציינים את האשכול שאליו מוגבל ההיקף של הסלקטורים שהוגדרו. השדה הזה לא רלוונטי לעומסי עבודה של מכונות וירטואליות. אם משאבBackendלא כולל את השדהclusterName, התוויות שצוינו חלות על כל עומסי העבודה בפרויקט.
-
אפשר לדלג על השלב הזה אם ה-ELB הזה מיועד לעומסי עבודה של Pod. אם מגדירים ELB לעומסי עבודה של מכונות וירטואליות, צריך להגדיר בדיקת תקינות ל-ELB:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT_NAME name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD EOFמחליפים את מה שכתוב בשדות הבאים:
-
HEALTH_CHECK_NAME: השם שבחרתם למשאב של בדיקת תקינות, למשלmy-health-check. -
PORT: היציאה שבה מתבצעת בדיקת תקינות. ערך ברירת המחדל הוא80. -
TIMEOUT: משך הזמן בשניות שצריך להמתין לפני שמדווח על כשל. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
CHECK_INTERVAL: משך הזמן בשניות מתחילת בדיקה אחת עד לתחילת הבדיקה הבאה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
HEALTHY_THRESHOLD: מספר הבדיקות הרציפות שצריכות לעבור כדי שנקודת הקצה תיחשב תקינה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא2. -
UNHEALTHY_THRESHOLD: מספר הבדיקות הרציפות שצריכות להיכשל כדי שנקודת הקצה תיחשב כלא תקינה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא2.
-
יוצרים אובייקט
BackendServiceבאמצעות משאבBackendשנוצר קודם. אם אתם מגדירים ELB לעומסי עבודה של מכונות וירטואליות, צריך לכלול את המשאבHealthCheck.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT_NAME name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME healthCheckName: HEALTH_CHECK_NAME EOFמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_SERVICE_NAME: השם שנבחר למשאבBackendService. -
HEALTH_CHECK_NAME: השם של משאבHealthCheckשיצרתם קודם. אל תכללו את השדה הזה אם אתם מגדירים ELB לעומסי עבודה של pods.
-
אופציונלי: משתמשים בזיקה לסשן (session affinity) ב-ELB כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל זיקה לסשן (session affinity) למאזני עומסים, יוצרים משאב
BackendServicePolicy. המשאב הזה מגדיר את ההגדרות של זיקה לסשן ומחיל את המשאבBackendServicePolicyעל המשאבBackendService. יוצרים את משאבBackendServicePolicyומחילים אותו:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendServicePolicy metadata: namespace: PROJECT_NAME name: POLICY_NAME spec: sessionAffinity: MODE selector: matchLabels: RESOURCE_LABELמחליפים את מה שכתוב בשדות הבאים:
-
POLICY_NAME: השם שבחרתם למדיניות של שירות הקצה העורפי.
MODE: מצב הזיקה לסשן. יש שני מצבים נתמכים:-
NONE: שיוך סשנים מושבת. הבקשות מנותבות לכל מערכת קצה עורפי זמינה. זהו מצב ברירת המחדל. -
CLIENT_IP_DST_PORT_PROTO: בקשות מאותו טופל (כתובת IP של המקור, כתובת IP של היעד, יציאת היעד ופרוטוקול) מנותבות לאותו קצה עורפי.
-
RESOURCE_LABEL: בורר התוויות שבוחר את שירות לקצה העורפי שאליו מוחל משאבBackendServicePolicyבמרחב השמות של הפרויקט. אם כמה משאביBackendServicePolicyתואמים לאותו שירות לקצה העורפי, ולפחות לאחת ממדיניות ההרשאה הזו מופעלת זיקה לסשן (session affinity), אז הזיקה לסשן (session affinity) למשאבBackendServiceהזה מופעלת.
-
יוצרים משאב חיצוני
ForwardingRuleשמגדיר את כתובת ה-IP הווירטואלית שבה השירות זמין.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT_NAME name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: name: CIDR_NAME ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOFמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_SERVICE_NAME: השם של משאבBackendService. -
FORWARDING_RULE_EXTERNAL_NAME: השם שבחרתם למשאבForwardingRuleExternal. -
CIDR_NAME: השדהcidrRefהוא אופציונלי. אם לא מציינים, המערכת שומרת אוטומטיתIPv4/32CIDR ממאגר כתובות ה-IP האזורי. מציינים את השם של משאבSubnetבאותו מרחב שמות כמו כלל ההעברה הזה. משאבSubnetמייצג את הבקשה ואת פרטי ההקצאה של רשת משנה אזורית. מידע נוסף עלSubnetמשאבים זמין במאמר דוגמאות למשאבים מותאמים אישית. -
PORT: משתמשים בשדהportsכדי לציין מערך של יציאות L4 שחבילות מועברות אליהן אל שרתי הקצה העורפי שהוגדרו עם כלל ההעברה הזה. צריך לציין לפחות יציאה אחת. משתמשים בשדהportכדי לציין מספר יציאה. היציאה שחשופה צריכה להיות זהה ליציאה שהאפליקציה בפועל חושפת בתוך הקונטיינר.
PROTOCOL: הפרוטוקול שבו יש להשתמש לכלל ההעברה, כמוTCP. רשומה במערךportsצריכה להיראות כך:ports: - port: 80 protocol: TCP
-
כדי לאמת את ה-ELB שהוגדר, צריך לוודא שהתנאי
Readyמופיע בכל אחד מהאובייקטים שנוצרו. מאמתים את התנועה באמצעותcurlבקשה לכתובת ה-VIP:כדי לקבל את ה-VIP, משתמשים ב-
kubectl get:kubectl get forwardingruleexternal -n PROJECT_NAMEהפלט אמור להיראות כך:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 Trueמאמתים את התנועה באמצעות בקשת
curlאל ה-VIP ביציאה שצוינה בשדהPORTבכלל ההעברה:curl http://FORWARDING_RULE_VIP:PORTמחליפים את
FORWARDING_RULE_VIPבכתובת ה-VIP של כלל העברת השיחות.
Kubernetes Service
אפשר ליצור ELB ב-GDC על ידי יצירת Service Kubernetes מסוג LoadBalancer באשכול Kubernetes.
כדי ליצור שירות ELB:
יוצרים קובץ YAML להגדרה
ServiceמסוגLoadBalancer.אובייקט
Serviceלדוגמה של שירות ELB:apiVersion: v1 kind: Service metadata: name: ELB_SERVICE_NAME namespace: PROJECT_NAME spec: ports: - port: 1235 protocol: TCP targetPort: 1235 selector: k8s-app: my-app type: LoadBalancerמחליפים את מה שכתוב בשדות הבאים:
-
ELB_SERVICE_NAME: השם של שירות ELB. -
PROJECT_NAME: מרחב השמות של הפרויקט שמכיל את עומסי העבודה של ה-Backend.
השדה
portמגדיר את יציאת הקצה הקדמי שמוצגת בכתובת ה-VIP. בשדהtargetPortמגדירים את יציאת הקצה העורפי שאליה רוצים להעביר את התנועה בעומסי העבודה של הקצה העורפי. מאזן העומסים תומך בתרגום כתובות רשת (NAT). יכול להיות שהיציאות של הקצה הקדמי והבק-אנד יהיו שונות.-
בשדה
selectorשל הגדרתService, מציינים תרמילים או מכונות וירטואליות כעומסי העבודה של ה-Backend.הבורר מגדיר אילו עומסי עבודה ייחשבו לעומסי עבודה של קצה העורפי בשירות הזה, על סמך התאמה בין התוויות שציינתם לתוויות של עומסי העבודה. אפשר לבחור ב-
Serviceרק עומסי עבודה בעורף באותו פרויקט ובאותו אשכול שבו מגדירים אתService.מידע נוסף על בחירת שירות זמין בכתובת https://kubernetes.io/docs/concepts/services-networking/service/.
שומרים את קובץ ההגדרה
Serviceבאותו פרויקט שבו נמצאים עומסי העבודה של הקצה העורפי.מחילים את קובץ ההגדרה
Serviceעל האשכול:kubectl apply -f ELB_FILEמחליפים את
ELB_FILEבשם שלServiceקובץ ההגדרה של שירות ELB.כשיוצרים ELB, השירות מקבל שתי כתובות IP. אחת מהן היא כתובת IP פנימית שאפשר לגשת אליה רק מתוך אותו אשכול. השני הוא כתובת ה-IP החיצונית, שאפשר לגשת אליה מתוך הארגון ומחוצה לו. אפשר לקבל את כתובות ה-IP של שירות ELB על ידי הצגת סטטוס השירות:
kubectl -n PROJECT_NAME get svc ELB_SERVICE_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_NAME: מרחב השמות של הפרויקט שמכיל את עומסי העבודה של ה-Backend. -
ELB_SERVICE_NAME: השם של שירות ELB.
הפלט שמתקבל צריך להיות דומה לדוגמה הבאה:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE elb-service LoadBalancer 10.0.0.1 20.12.1.11 1235:31931/TCP 22h
EXTERNAL-IPהיא כתובת ה-IP של השירות שאפשר לגשת אליו מחוץ לארגון.אם לא מתקבל פלט, צריך לוודא שיצרתם את שירות ה-ELB בהצלחה.
-
יצירת ELB גלובלי
יוצרים איזון עומסים גלובלי באמצעות gdcloud CLI או KRM API.
gdcloud
יוצרים ELB שמטרגט עומסי עבודה של פוד או מכונה וירטואלית באמצעות CLI של gcloud.
ה-ELB הזה מכוון לכל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט Backend. המשאב המותאם אישית Backend צריך להיות בהיקף של אזור.
כדי ליצור ELB באמצעות gdcloud CLI, מבצעים את השלבים הבאים:
יוצרים משאב
Backendכדי להגדיר את נקודת הקצה של ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --cluster-name=CLUSTER_NAME \ --zone=ZONEמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_NAME: השם שבחרתם למשאב העורפי, למשלmy-backend. -
LABELS: סלקטור שמגדיר באילו נקודות קצה בין פודים ומכונות וירטואליות להשתמש בשביל משאב ה-Backend הזה. לדוגמה,app=web. -
PROJECT_NAME: שם הפרויקט. -
CLUSTER_NAME: הקלאסטר שההיקף של הסלקטורים המוגדרים מוגבל אליו. אם לא מציינים את השדה הזה, כל נקודות הקצה עם התווית שצוינה נבחרות. השדה הזה הוא אופציונלי. -
ZONE: האזור שבו רוצים להשתמש להפעלה הזו. כדי להגדיר מראש את דגל האזור לכל הפקודות שדורשות אותו, מריצים את הפקודה:gdcloud config set core/zone ZONE. הדגל של התחום זמין רק בסביבות מרובות תחומים. השדה הזה הוא אופציונלי.
-
אפשר לדלג על השלב הזה אם ה-ELB הזה מיועד לעומסי עבודה של Pod. אם מגדירים ELB לעומסי עבודה של מכונות וירטואליות, צריך להגדיר בדיקת תקינות ל-ELB:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --globalמחליפים את מה שכתוב בשדות הבאים:
-
HEALTH_CHECK_NAME: השם שבחרתם למשאב של בדיקת תקינות, למשלmy-health-check. -
CHECK_INTERVAL: משך הזמן בשניות מתחילת בדיקה אחת עד לתחילת הבדיקה הבאה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
HEALTHY_THRESHOLD: משך הזמן להמתנה לפני שמדווח על כשל. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. -
TIMEOUT: משך הזמן בשניות שצריך להמתין לפני שמדווח על כשל. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
UNHEALTHY_THRESHOLD: מספר הבדיקות הרציפות שצריכות להיכשל כדי שנקודת הקצה תיחשב כלא תקינה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא2. -
PORT: היציאה שבה מתבצעת בדיקת תקינות. ערך ברירת המחדל הוא80. השדה הזה הוא אופציונלי.
-
יוצרים משאב
BackendServiceומוסיפים לו את משאבBackendשנוצר קודם:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT_NAME \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --globalמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_SERVICE_NAME: השם שנבחר לשירות ה-Backend הזה. -
TARGET_PORTS: רשימה מופרדת בפסיקים של יציאות יעד שהשירות לקצה העורפי הזה מתרגם, כאשר כל יציאת יעד מציינת את הפרוטוקול, את היציאה בכלל ההעברה ואת היציאה בשרת העורפי. אפשר לציין כמה יציאות יעד. השדה הזה חייב להיות בפורמטprotocol:port:targetport, לדוגמהTCP:80:8080. השדה הזה הוא אופציונלי. -
HEALTH_CHECK_NAME: השם של משאב בדיקת תקינות. השדה הזה הוא אופציונלי. צריך לכלול את השדה הזה רק אם מגדירים ELB לעומסי עבודה של מכונות וירטואליות.
-
מוסיפים את המשאב
BackendServiceלמשאבBackendשיצרתם קודם:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone BACKEND_ZONE \ --project=PROJECT_NAME \ --globalאופציונלי: משתמשים בזיקה לסשן (session affinity) ב-ELB כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל את ההגדרה 'זיקה לסשן (session affinity)' למאזני עומסים, יוצרים מדיניות של שירות לקצה העורפי באמצעות הפקודה
gdcloud compute load-balancer-policy create:gdcloud compute load-balancer-policy create POLICY_NAME --session-affinity=MODE --selectors=RESOURCE_LABELמחליפים את מה שכתוב בשדות הבאים:
-
POLICY_NAME: השם שבחרתם למדיניות של שירות הקצה העורפי.
MODE: מצב הזיקה לסשן. יש שני מצבים נתמכים:-
NONE: שיוך סשנים מושבת. הבקשות מנותבות לכל מערכת קצה עורפי זמינה. זהו מצב ברירת המחדל. -
CLIENT_IP_DST_PORT_PROTO: בקשות מאותו טופל (כתובת IP של המקור, כתובת IP של היעד, יציאת היעד ופרוטוקול) מנותבות לאותו קצה עורפי.
-
RESOURCE_LABEL: בורר התוויות שבוחר את שירות לקצה העורפי שאליו מוחל משאבBackendServicePolicyבמרחב השמות של הפרויקט. אם כמה משאביBackendServicePolicyתואמים לאותו שירות לקצה העורפי, ולפחות לאחת ממדיניות ההרשאה הזו מופעלת זיקה לסשן (session affinity), אז הזיקה לסשן (session affinity) למשאבBackendServiceהזה מופעלת.
-
יוצרים משאב חיצוני מסוג
ForwardingRuleשמגדיר את כתובת ה-IP הווירטואלית שבה השירות זמין:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT_NAME \ --globalמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_SERVICE_NAME: השם של שירות הקצה העורפי. -
FORWARDING_RULE_EXTERNAL_NAME: השם שבחרתם לכלל ההעברה. -
CIDR: השדה הזה הוא אופציונלי. אם לא מציינים כתובת IP, מערכתIPv4/32CIDR נשמרת באופן אוטומטי ממאגר כתובות ה-IP הגלובלי. מציינים את השם של משאבSubnetבאותו מרחב שמות כמו כלל ההעברה הזה. משאבSubnetמייצג את הבקשה ואת פרטי ההקצאה של רשת משנה גלובלית. מידע נוסף על משאביSubnetזמין במאמר דוגמאות למשאבים מותאמים אישית. -
PROTOCOL_PORT: הפרוטוקול והיציאה שיוצגו בכלל ההעברה. השדה הזה חייב להיות בפורמטip-protocol=TCP:80. היציאה שנחשפת חייבת להיות זהה ליציאה שהאפליקציה בפועל חושפת בתוך הקונטיינר.
-
כדי לוודא שה-ELB מוגדר, צריך לאשר את התנאי
Readyבכל אחד מהאובייקטים שנוצרו. כדי לקבל את כתובת ה-IP שהוקצתה למאזן העומסים, מתארים את כלל ההעברה:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAMEכדי לאמת את ה-ELB שהוגדר, צריך לוודא שהתנאי
Readyמופיע בכל אחד מהאובייקטים שנוצרו. מאמתים את התנועה באמצעותcurlבקשה לכתובת ה-VIP:כדי לקבל את כתובת ה-VIP שהוקצתה, מתארים את כלל ההעברה:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME --globalמאמתים את התנועה באמצעות בקשת
curlאל ה-VIP ביציאה שצוינה בשדהPROTOCOL_PORTבכלל ההעברה:curl http://FORWARDING_RULE_VIP:PORTמחליפים את מה שכתוב בשדות הבאים:
-
FORWARDING_RULE_VIP: כתובת ה-VIP של כלל ההעברה. -
PORT: מספר היציאה מהשדהPROTOCOL_PORTבכלל ההעברה.
-
API
יוצרים ELB שמטרגט עומסי עבודה של פוד או מכונה וירטואלית באמצעות KRM API. ה-ELB הזה מכוון לכל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט Backend. כדי ליצור איזון עומסים אזורי באמצעות KRM API, פועלים לפי השלבים הבאים:
יוצרים משאב
Backendכדי להגדיר את נקודות הקצה של ELB. יוצרים משאביBackendלכל אזור שבו ממוקמים עומסי העבודה:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT_NAME name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: server EOFמחליפים את מה שכתוב בשדות הבאים:
-
MANAGEMENT_API_SERVER: נתיב kubeconfig של שרת Management API הגלובלי. מידע נוסף מופיע במאמר בנושא מעבר להקשר הגלובלי. -
PROJECT_NAME: שם הפרויקט. -
BACKEND_NAME: השם של משאבBackend. -
CLUSTER_NAME: זהו שדה אופציונלי. בשדה הזה מציינים את האשכול שאליו מוגבל ההיקף של הסלקטורים שהוגדרו. השדה הזה לא רלוונטי לעומסי עבודה של מכונות וירטואליות. אם משאבBackendלא כולל את השדהclusterName, התוויות שצוינו חלות על כל עומסי העבודה בפרויקט.
-
אפשר לדלג על השלב הזה אם ה-ELB הזה מיועד לעומסי עבודה של Pod. אם מגדירים ELB לעומסי עבודה של מכונות וירטואליות, צריך להגדיר בדיקת תקינות ל-ELB:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT_NAME name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD EOFמחליפים את מה שכתוב בשדות הבאים:
-
HEALTH_CHECK_NAME: השם שבחרתם למשאב של בדיקת תקינות, למשלmy-health-check. -
PORT: היציאה שבה מתבצעת בדיקת תקינות. ערך ברירת המחדל הוא80. -
TIMEOUT: משך הזמן בשניות שצריך להמתין לפני שמדווח על כשל. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
CHECK_INTERVAL: משך הזמן בשניות מתחילת בדיקה אחת עד לתחילת הבדיקה הבאה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא5. לא מומלץ להגדיר זמן קצוב לתפוגה ארוך יותר מ-checkInterval. -
HEALTHY_THRESHOLD: מספר הבדיקות הרציפות שצריכות לעבור כדי שנקודת הקצה תיחשב תקינה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא2. -
UNHEALTHY_THRESHOLD: מספר הבדיקות הרציפות שצריכות להיכשל כדי שנקודת הקצה תיחשב כלא תקינה. אם לא מציינים ערך או אם הערך הוא 0, ברירת המחדל היא2.
מכיוון שזהו איזון עומסים גלובלי, צריך ליצור את בדיקת התקינות ב-API הגלובלי.
-
יוצרים אובייקט
BackendServiceבאמצעות משאבBackendשנוצר קודם. אם אתם מגדירים ELB לעומסי עבודה של מכונות וירטואליות, צריך לכלול את המשאבHealthCheck.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT_NAME name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOFמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_SERVICE_NAME: השם שנבחר למשאבBackendService. -
HEALTH_CHECK_NAME: השם של משאבHealthCheckשיצרתם קודם. אל תכללו את השדה הזה אם אתם מגדירים ELB לעומסי עבודה של פודים.
ZONE: האזור שבו נוצר משאבBackend. אפשר לציין כמה קצה עורפי בשדהbackendRefs. לדוגמה:- name: my-be zone: Zone-A - name: my-be zone: Zone-Bהשדה
targetPortsהוא אופציונלי. במשאב הזה מפורטות יציאות שהמשאבBackendServiceהזה מתרגם. אם אתם משתמשים באובייקט הזה, צריך לספק ערכים למאפיינים הבאים:-
PORT: היציאה שנחשפת על ידי השירות. -
PROTOCOL: פרוטוקול שכבה 4 שהתנועה צריכה להתאים לו. יש תמיכה רק ב-TCP וב-UDP.
TARGET_PORT: היציאה שאליה מתורגם הערךPORT, למשל8080. אי אפשר לחזור על הערך שלTARGET_PORTבאותו אובייקט. דוגמה ל-targetPorts:targetPorts: - port: 80 protocol: TCP targetPort: 8080
-
-
אופציונלי: משתמשים בזיקה לסשן (session affinity) ב-ELB כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל זיקה לסשן (session affinity) למאזני עומסים, יוצרים משאב
BackendServicePolicy. המשאב הזה מגדיר את ההגדרות של זיקה לסשן ומחיל את המשאבBackendServicePolicyעל המשאבBackendService. יוצרים את משאבBackendServicePolicyומחילים אותו:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendServicePolicy metadata: namespace: PROJECT_NAME name: POLICY_NAME spec: sessionAffinity: MODE selector: matchLabels: RESOURCE_LABELמחליפים את מה שכתוב בשדות הבאים:
-
POLICY_NAME: השם שבחרתם למדיניות של שירות הקצה העורפי.
MODE: מצב הזיקה לסשן. יש שני מצבים נתמכים:-
NONE: שיוך סשנים מושבת. הבקשות מנותבות לכל מערכת קצה עורפי זמינה. זהו מצב ברירת המחדל. -
CLIENT_IP_DST_PORT_PROTO: בקשות מאותו טופל (כתובת IP של המקור, כתובת IP של היעד, יציאת היעד ופרוטוקול) מנותבות לאותו קצה עורפי.
-
RESOURCE_LABEL: בורר התוויות שבוחר את שירות לקצה העורפי שאליו מוחל משאבBackendServicePolicyבמרחב השמות של הפרויקט. אם כמה משאביBackendServicePolicyתואמים לאותו שירות לקצה העורפי, ולפחות לאחת ממדיניות ההרשאה הזו מופעלת זיקה לסשן (session affinity), אז הזיקה לסשן (session affinity) למשאבBackendServiceהזה מופעלת.
-
יוצרים משאב חיצוני
ForwardingRuleשמגדיר את כתובת ה-IP הווירטואלית שבה השירות זמין.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT_NAME name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: name: CIDR_NAME ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOFמחליפים את מה שכתוב בשדות הבאים:
-
FORWARDING_RULE_EXTERNAL_NAME: השם שנבחר למשאבForwardingRuleExternal. -
CIDR_NAME: השדהcidrRefהוא אופציונלי. אם לא מציינים כתובת IP, מערכתIPv4/32CIDR נשמרת באופן אוטומטי ממאגר כתובות ה-IP הגלובלי. מציינים את השם של משאבSubnetבאותו מרחב שמות כמו כלל ההעברה הזה. משאבSubnetמייצג את הבקשה ואת פרטי ההקצאה של רשת משנה גלובלית. מידע נוסף על משאביSubnetזמין במאמר דוגמאות למשאבים מותאמים אישית. -
PORT: משתמשים בשדהportsכדי לציין מערך של יציאות L4 שחבילות מועברות אליהן אל שרתי הקצה העורפי שהוגדרו עם כלל ההעברה הזה. צריך לציין לפחות יציאה אחת. משתמשים בשדהportכדי לציין מספר יציאה. היציאה שחשופה צריכה להיות זהה ליציאה שהאפליקציה בפועל חושפת בתוך הקונטיינר.
PROTOCOL: הפרוטוקול שבו יש להשתמש לכלל ההעברה, כמוTCP. רשומה במערךportsצריכה להיראות כך:ports: - port: 80 protocol: TCP
-
כדי לאמת את ה-ELB שהוגדר, צריך לוודא שהתנאי
Readyמופיע בכל אחד מהאובייקטים שנוצרו. מאמתים את התנועה באמצעותcurlבקשה לכתובת ה-VIP:כדי לקבל את ה-VIP, משתמשים ב-
kubectl get:kubectl get forwardingruleexternal -n PROJECT_NAMEהפלט אמור להיראות כך:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 Trueמאמתים את התנועה באמצעות בקשת
curlאל ה-VIP ביציאה שצוינה בשדהPORTבכלל ההעברה:curl http://FORWARDING_RULE_VIP:PORTמחליפים את
FORWARDING_RULE_VIPבכתובת ה-VIP של כלל העברת השיחות.
יצירת מאזן עומסים חיצוני לאשכולות רגילים
בעל אפליקציה (AO) יכול ליצור שירות Kubernetes מסוג LoadBalancer כדי לחשוף שירותים חיצוניים. השירות הזה יכול לבחור רק את השרתים העורפיים באשכול הרגיל שבו השירות נוצר. היא שקולה ל-ELB בהיקף אזורי של Cluster. אין תמיכה ב-ELB גלובלי עבור אשכולות רגילים. מידע נוסף זמין במאמר מאזני עומסים גלובליים ואזוריים.
לפני שמתחילים
כדי להגדיר שירותי ELB, צריך:
- הבעלים של הפרויקט שבו מגדירים את מאזן העומסים. מידע נוסף מופיע במאמר יצירת פרויקט.
- יש לכם מדיניות כניסה מותאמת אישית של
ProjectNetworkPolicy(PNP) כדי לאפשר תעבורה לשירות ELB הזה. מידע נוסף מופיע במאמר הגדרת PNP כדי לאפשר תנועה אל ELB עבור אשכולות רגילים. יש לכם את התפקידים הנדרשים לניהול זהויות והרשאות גישה:
- אדמין NetworkPolicy בפרויקט: יש לו גישה לניהול מדיניות רשת בפרויקט במרחב השמות של הפרויקט. צריך לבקש מאדמין IAM בארגון להקצות לכם את התפקיד אדמין NetworkPolicy בפרויקט (
project-networkpolicy-admin). - אדמין מאזן עומסים: צריך לבקש מאדמין IAM בארגון להקצות לכם את התפקיד אדמין מאזן עומסים (
load-balancer-admin).
- אדמין NetworkPolicy בפרויקט: יש לו גישה לניהול מדיניות רשת בפרויקט במרחב השמות של הפרויקט. צריך לבקש מאדמין IAM בארגון להקצות לכם את התפקיד אדמין NetworkPolicy בפרויקט (
הגדרת PNP כדי לאפשר תעבורה ל-ELB עבור אשכולות רגילים
כדי ששירותי ELB יפעלו, צריך להגדיר ולהחיל מדיניות כניסה מותאמת אישית משלכם ProjectNetworkPolicy כדי לאפשר תעבורה לעומסי העבודה של שירות ה-ELB הזה.
מדיניות הרשת שולטת בגישה לעומסי העבודה, ולא במאזן העומסים עצמו.
מאזני עומסים מסוג ELB חושפים עומסי עבודה לרשת הלקוחות, ולכן נדרשת מדיניות רשת מפורשת כדי לאפשר תעבורה חיצונית ליציאת עומס העבודה, כמו 8080.
קובץ ה-YAML הבא של מדיניות רשת ברמת הפרויקט מאפשר לתנועה מעומס עבודה בפרויקט אחר לגשת לעומס עבודה בפרויקט הנוכחי דרך ה-ELB.
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
name: allow-ingress-from-client-to-server
namespace: ${VANILLA_CLUSTER_PROJECT}
spec:
policyType: Ingress
subject:
subjectType: UserWorkload
userWorkloadSelector:
labelSelector:
clusters:
matchLabels:
kubernetes.io/metadata.name: my-sc-1
namespaces:
matchLabels:
kubernetes.io/metadata.name: my-app-ns
workloads:
matchLabels:
app: my-internal-app
ingress:
- from:
- projectSelector:
projects:
matchNames:
- "$PROJECT_2"
workloadSelector:
workloads:
matchLabels:
app: my-client
ports:
- protocol: TCP
port: 8080
יצירת ELB אזורי לאשכולות רגילים
אפשר ליצור ELB ב-GDC על ידי יצירת Kubernetes Service מסוג LoadBalancer באשכול Kubernetes רגיל.
כדי ליצור שירות ELB:
יוצרים קובץ YAML להגדרה
ServiceמסוגLoadBalancer.אובייקט
Serviceלדוגמה של שירות ELB:apiVersion: v1 kind: Service metadata: name: ELB_SERVICE_NAME namespace: ELB_SERVICE_NAMESPACE spec: ports: - port: PORT protocol: TCP targetPort: TARGET_PORT selector: k8s-app: my-app # Example selector, replace with your workload's labels type: LoadBalancerמחליפים את מה שכתוב בשדות הבאים:
-
ELB_SERVICE_NAME: השם של שירות ELB. -
ELB_SERVICE_NAMESPACE: מרחב השמות באשכול הסטנדרטי שמכיל את עומסי העבודה של ה-Backend. -
PORT: היציאה שנחשפת על ידי שירות Kubernetes עצמו. שירותים אחרים או לקוחות חיצוניים באותו אשכול יתחברו ליציאה הזו בכתובת ה-IP של השירות. -
TARGET_PORT: היציאה בתוך הקונטיינר של ה-pod שבה האפליקציה פועלת ומאזינה לחיבורים נכנסים. זה יכול להיות יציאה מספרית או יציאה עם שם שמוגדרת במפרט של מאגר ה-Pod.
השדה
portמגדיר את יציאת הקצה הקדמי שמוצגת בכתובת ה-VIP. בשדהtargetPortמגדירים את יציאת הקצה העורפי שאליה רוצים להעביר את התנועה בעומסי העבודה של הקצה העורפי. מאזן העומסים תומך בתרגום כתובות רשת (NAT). יכול להיות שהיציאות של הקצה הקדמי והבק-אנד יהיו שונות.-
בשדה
selectorשל הגדרתService, מציינים צמדי מפתח/ערך כדי להתאים לעומסי העבודה של ה-Backend. במקרים של אשכולות רגילים, רק פודים נתמכים כעומסי עבודה.בורר שאתם מגדירים, על סמך התאמה בין התוויות שאתם מציינים לבין התוויות בעומסי העבודה.
Serviceיכול לבחור רק עומסי עבודה של קצה עורפי באותו פרויקט ובאותו אשכול שבו מוגדרService.מידע נוסף על בחירת שירות זמין בכתובת https://kubernetes.io/docs/concepts/services-networking/service/.
שומרים את המפרט של
Serviceבקובץ YAML. מחליפים את שם הקובץ ב-ELB_FILE בפקודה הבאה.מחילים את קובץ ההגדרה
Serviceעל האשכול:export KUBECONFIG=KUBECONFIG_PATH kubectl apply -f ELB_FILEמחליפים את מה שכתוב בשדות הבאים:
-
ELB_FILE:השם של קובץ ההגדרה של שירות ELBService. -
KUBECONFIG_PATH: הנתיב לקובץ kubeconfig של האשכול הרגיל.
אפשר לקבל את כתובות ה-IP של שירות ELB על ידי הצגת סטטוס השירות:
kubectl -n ELB_SERVICE_NAMESPACE get svc ELB_SERVICE_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
ELB_SERVICE_NAMESPACE: מרחב השמות שמכיל את עומסי העבודה של ה-Backend. -
ELB_SERVICE_NAME: השם של שירות ELB.
הפלט שמתקבל צריך להיות דומה לדוגמה הבאה:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE elb-service LoadBalancer 10.0.0.1 203.0.1.11 1235:31931/TCP 22h
EXTERNAL-IPהיא כתובת ה-IP של השירות שאפשר לגשת אליו מחוץ לארגון.-
בחירת מכונה וירטואלית כקצה עורפי למאזן עומסים
כדי לקשר מכונה וירטואלית למאזן העומסים:
מוודאים שלמכונה הווירטואלית יש תווית שתואמת לבורר התוויות שבו נעשה שימוש בהגדרת מאזן העומסים.
לדוגמה, אם למכונה הווירטואלית אין תווית מתאימה, אפשר להוסיף את התווית שצוינה מאובייקט הקצה העורפי של האזור המתאים למכונה הווירטואלית:
kubectl --kubeconfig MANAGEMENT_API_SERVER label virtualmachine VM_NAME -n PROJECT_NAMELABELמחליפים את מה שכתוב בשדות הבאים:
-
LABEL: תווית שתואמת ל-LabelSelectorבתצורת מאזן העומסים, כמוapp=server. -
VM_NAME: השם של המכונה הווירטואלית שמקשרים. -
PROJECT_NAME: שם הפרויקט.
-
מוודאים שהשרת מאזין לאותו פורט שצוין באובייקט
HealthCheck.