מאזני עומסים חיצוניים (ELB) חושפים שירותים לגישה מחוץ לארגון, מתוך מאגר של כתובות IP שהוקצו לארגון ממאגר גדול יותר של כתובות IP חיצוניות למכונות.
כתובות ה-VIP של ELB לא מתנגשות בין ארגונים, והן ייחודיות לכל הארגונים. לכן, צריך להשתמש בשירותי ELB רק בשביל שירותים שלקוחות מחוץ לארגון צריכים לגשת אליהם.
עומסי עבודה שפועלים בתוך הארגון יכולים לגשת לשירותי ELB, כל עוד מאפשרים לעומסי העבודה לצאת מהארגון. דפוס התנועה הזה מחייב תנועה יוצאת מהארגון לפני החזרה לשירות הפנימי.
יש הוראות נפרדות להגדרת מאזני עומסים אלסטיים (ELB) לאשכולות משותפים ורגילים.
יצירת מאזן עומסים חיצוני לאשכולות משותפים
אפשר ליצור מאזני עומסים גלובליים או אזוריים. ההיקף של מאזני עומסים גלובליים (ELB) משתרע על פני כל GDC. ההיקף של מאזני עומסים אזוריים מוגבל לאזור שצוין בזמן היצירה. מידע נוסף זמין במאמר מאזני עומסים גלובליים ואזוריים.
לפני שמתחילים
כדי להגדיר שירותי ELB, צריך:
- להיות הבעלים של הפרויקט שבו מגדירים את מאזן העומסים. מידע נוסף זמין במאמר יצירת פרויקט.
- מדיניות כניסה מותאמת אישית של
ProjectNetworkPolicy(PNP) שמאפשרת תנועה לשירות ה-ELB הזה. מידע נוסף זמין במאמר הגדרת PNP כדי לאפשר תנועה ל-ELB. יש לכם את התפקידים הנדרשים לניהול זהויות והרשאות גישה:
- אדמין של מדיניות הרשת של הפרויקט: יש לו גישה לניהול מדיניות הרשת של הפרויקט במרחב השמות של הפרויקט. מבקשים ממנהל החשבון הארגוני ב-IAM להקצות לכם את התפקיד 'אדמין של NetworkPolicy בפרויקט' (
project-networkpolicy-admin). - אדמין של מאזן עומסים: בקשו ממנהל חשבון ארגוני ה-IAM שלכם להקצות לכם את התפקיד 'אדמין של מאזן עומסים' (
load-balancer-admin). - אדמין של מאזן עומסים גלובלי: למאזני עומסים גלובליים, בקשו ממנהל החשבון הארגוני ב-IAM להקצות לכם את התפקיד "אדמין של מאזן עומסים גלובלי" (
global-load-balancer-admin). למידע נוסף, קראו את התיאורים של התפקידים המוגדרים מראש.
- אדמין של מדיניות הרשת של הפרויקט: יש לו גישה לניהול מדיניות הרשת של הפרויקט במרחב השמות של הפרויקט. מבקשים ממנהל החשבון הארגוני ב-IAM להקצות לכם את התפקיד 'אדמין של NetworkPolicy בפרויקט' (
הגדרת PNP כדי לאפשר תנועה ל-ELB
כדי ששירותי ELB יפעלו, צריך להגדיר ולהחיל מדיניות כניסה מותאמת אישית משלכם, שתאפשר תנועה לעומסי העבודה של שירות ה-ELB הזה.ProjectNetworkPolicy
מדיניות הרשת ב-Kubernetes שולטת בגישה לעומסי העבודה, ולא במאזן העומסים עצמו.
מאזני העומסים חושפים את עומסי העבודה לרשת של הלקוח, ולכן צריך להגדיר מדיניות רשת מפורשת כדי לאפשר תנועה חיצונית ליציאה של עומס העבודה, כמו 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:
- משתמשים ב-gdcloud CLI כדי ליצור מאזני עומסים גלובליים או אזוריים.
- משתמשים ב-Networking Kubernetes Resource Model (KRM) API כדי ליצור מאזני עומסים גלובליים או אזוריים.
- שימוש בשירות Kubernetes ישירות באשכול Kubernetes. השיטה הזו זמינה רק ל-ELB אזוריים.
אתם יכולים לטרגט עומסי עבודה של Pod או של VM באמצעות KRM API ו-gdcloud CLI. כשמשתמשים בשירות Kubernetes ישירות באשכול Kubernetes, אפשר לטרגט רק עומסי עבודה באשכול שבו נוצר האובייקט Service.
יצירת ELB אזורי
יוצרים ELB אזורי באמצעות gdcloud CLI, KRM API או שירות Kubernetes באשכול Kubernetes:
gdcloud
יצירת ELB שמטרגט עומסי עבודה של פודים או של מכונות וירטואליות באמצעות gdcloud CLI.
ה-ELB הזה מטרגט את כל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט Backend.
כדי ליצור ELB באמצעות ה-CLI של gdcloud:
יוצרים משאב
Backendכדי להגדיר את נקודת הקצה ל-ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --zone=ZONE \ --cluster-name=CLUSTER_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_NAME: השם שבחרתם למשאב העורפי, למשלmy-backend. -
LABELS: בורר שמגדיר באילו נקודות קצה בין Pods לבין מכונות וירטואליות להשתמש במשאב העורפי הזה. לדוגמה,app=web. -
PROJECT_NAME: שם הפרויקט. -
ZONE: האזור שבו משתמשים להפעלה הזו. כדי להגדיר מראש את דגל האזור לכל הפקודות שדורשות אותו, מריצים את הפקודה:gdcloud config set core/zone 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: השם שנבחר לשירות לקצה העורפי. -
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 כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל את הזיקה לסשן במאזני עומסים, יוצרים מדיניות של שירות לקצה העורפי באמצעות הפקודה
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תואמים לאותו שירות לקצה העורפי, ולפחות באחת מהמדיניות האלה מופעלת זיקה לסשן, הזיקה לסשן מופעלת במשאבBackendServiceהזה.
-
יוצרים משאב
ForwardingRuleחיצוני שמגדיר את ה-VIP שבו השירות זמין: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: השדה הזה הוא אופציונלי. אם לא מציינים CIDR, המערכת שומרת באופן אוטומטי CIDR שלIPv4/32ממאגר ה-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 שמטרגט עומסי עבודה של Pod או של VM באמצעות KRM API.
ה-ELB הזה מטרגט את כל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט Backend.
כדי ליצור ELB אזורי באמצעות 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 לעומסי עבודה של Pod.
-
אופציונלי: שימוש בזיקה לסשן (session affinity) ב-ELB כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל את הזיקה לסשן במאזני עומסים, צריך ליצור משאב
BackendServicePolicy. המשאב הזה מגדיר את הגדרות הזיקה לסשן (session affinity) ומחיל את המשאב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תואמים לאותו שירות לקצה העורפי, ולפחות באחת מהמדיניות האלה מופעלת זיקה לסשן, הזיקה לסשן מופעלת במשאבBackendServiceהזה.
-
יוצרים משאב
ForwardingRuleחיצוני שמגדיר את ה-VIP שבו השירות זמין.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הוא אופציונלי. אם לא מציינים טווח, המערכת מקצה באופן אוטומטי טווח CIDR שלIPv4/32ממאגר כתובות ה-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
כדי ליצור מאזני עומסים חיצוניים ב-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: מרחב השמות של הפרויקט שמכיל את עומסי העבודה בקצה העורפי.
בשדה
portמגדירים את יציאת הקצה הקדמי שחושפים בכתובת ה-VIP. בשדהtargetPortמגדירים את היציאה של הקצה העורפי שאליה רוצים להעביר את התנועה בעומסי העבודה של הקצה העורפי. מאזן העומסים תומך בתרגום כתובת רשת (NAT). היציאות של החזית והקצה העורפי יכולות להיות שונות.-
בשדה
selectorשל ההגדרהService, מציינים פודים או מכונות וירטואליות כעומסי העבודה בקצה העורפי.הבורר מגדיר אילו עומסי עבודה ייחשבו כעומסי עבודה לקצה העורפי של השירות הזה, על סמך התאמה בין התוויות שאתם מציינים לבין התוויות של עומסי העבודה. ה-
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: מרחב השמות של הפרויקט שמכיל את עומסי העבודה בקצה העורפי. -
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 גלובלי
יוצרים ELB גלובלי באמצעות ה-gdcloud CLI או ה-API של KRM.
gdcloud
יצירת ELB שמטרגט עומסי עבודה של פודים או של מכונות וירטואליות באמצעות gdcloud CLI.
ה-ELB הזה מטרגט את כל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט Backend. המשאב המותאם אישית Backend חייב להיות מוגדר לאזור.
כדי ליצור ELB באמצעות ה-CLI של gdcloud:
יוצרים משאב
Backendכדי להגדיר את נקודת הקצה ל-ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --cluster-name=CLUSTER_NAME \ --zone=ZONEמחליפים את מה שכתוב בשדות הבאים:
-
BACKEND_NAME: השם שבחרתם למשאב העורפי, למשלmy-backend. -
LABELS: בורר שמגדיר באילו נקודות קצה בין Pods לבין מכונות וירטואליות להשתמש במשאב העורפי הזה. לדוגמה,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: השם שנבחר לשירות לקצה העורפי. -
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 כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל את הזיקה לסשן במאזני עומסים, יוצרים מדיניות של שירות לקצה העורפי באמצעות הפקודה
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תואמים לאותו שירות לקצה העורפי, ולפחות באחת מהמדיניות האלה מופעלת זיקה לסשן, הזיקה לסשן מופעלת במשאבBackendServiceהזה.
-
יוצרים משאב
ForwardingRuleחיצוני שמגדיר את ה-VIP שבו השירות זמין: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: השדה הזה הוא אופציונלי. אם לא מציינים טווח, המערכת מקצה באופן אוטומטי טווח CIDR שלIPv4/32ממאגר כתובות ה-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 שמטרגט עומסי עבודה של Pod או של VM באמצעות KRM API. ה-ELB הזה מטרגט את כל עומסי העבודה בפרויקט שתואמים לתווית שהוגדרה באובייקט של ה-backend. כדי ליצור ELB אזורי באמצעות 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.
מכיוון שמדובר ב-ELB גלובלי, צריך ליצור את בדיקת התקינות ב-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 לעומסי עבודה של pod.
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 כדי להבטיח שבקשות מאותו לקוח ינותבו באופן עקבי לאותו קצה עורפי. כדי להפעיל את הזיקה לסשן במאזני עומסים, צריך ליצור משאב
BackendServicePolicy. המשאב הזה מגדיר את הגדרות הזיקה לסשן (session affinity) ומחיל את המשאב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תואמים לאותו שירות לקצה העורפי, ולפחות באחת מהמדיניות האלה מופעלת זיקה לסשן, הזיקה לסשן מופעלת במשאבBackendServiceהזה.
-
יוצרים משאב
ForwardingRuleחיצוני שמגדיר את ה-VIP שבו השירות זמין.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הוא אופציונלי. אם לא מציינים טווח, המערכת מקצה באופן אוטומטי טווח CIDR שלIPv4/32ממאגר כתובות ה-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 ברמת האשכול באזור. אי אפשר להשתמש ב-ELB גלובלי באשכולות רגילים. מידע נוסף זמין במאמר מאזני עומסים גלובליים ואזוריים.
לפני שמתחילים
כדי להגדיר שירותי ELB, צריך:
- להיות הבעלים של הפרויקט שבו מגדירים את מאזן העומסים. מידע נוסף זמין במאמר יצירת פרויקט.
- מדיניות כניסה מותאמת אישית של
ProjectNetworkPolicy(PNP) שמאפשרת תנועה לשירות ה-ELB הזה. מידע נוסף זמין במאמר הגדרת PNP כדי לאפשר תנועה ל-ELB באשכולות רגילים. יש לכם את התפקידים הנדרשים לניהול זהויות והרשאות גישה:
- אדמין של מדיניות הרשת של הפרויקט: יש לו גישה לניהול מדיניות הרשת של הפרויקט במרחב השמות של הפרויקט. בקשו ממנהל חשבון ארגוני ב-IAM להקצות לכם את התפקיד "אדמין של מדיניות הרשת של הפרויקט" (
project-networkpolicy-admin). - אדמין של מאזן עומסים: בקשו ממנהל חשבון ארגוני ה-IAM שלכם להקצות לכם את התפקיד 'אדמין של מאזן עומסים' (
load-balancer-admin).
- אדמין של מדיניות הרשת של הפרויקט: יש לו גישה לניהול מדיניות הרשת של הפרויקט במרחב השמות של הפרויקט. בקשו ממנהל חשבון ארגוני ב-IAM להקצות לכם את התפקיד "אדמין של מדיניות הרשת של הפרויקט" (
הגדרת PNP כדי לאפשר תנועה ל-ELB באשכולות רגילים
כדי ששירותי ELB יפעלו, צריך להגדיר ולהחיל מדיניות כניסה מותאמת אישית משלכם, שתאפשר תנועה לעומסי העבודה של שירות ה-ELB הזה.ProjectNetworkPolicy
מדיניות הרשת ב-Kubernetes שולטת בגישה לעומסי העבודה, ולא במאזן העומסים עצמו.
מאזני העומסים חושפים את עומסי העבודה לרשת של הלקוח, ולכן צריך להגדיר מדיניות רשת מפורשת כדי לאפשר תנועה חיצונית ליציאה של עומס העבודה, כמו 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:
labelSelector:
workloads:
matchLabels:
app: my-client
ports:
- protocol: TCP
port: 8080
יצירת ELB אזורי לאשכולות רגילים
כדי ליצור מאזני עומסים חיצוניים ב-GDC, יוצרים Service של Kubernetes מסוג 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: מרחב השמות באשכול הרגיל שמכיל את עומסי העבודה בקצה העורפי. -
PORT: היציאה שנחשפת על ידי שירות Kubernetes עצמו. שירותים אחרים או לקוחות חיצוניים בתוך האשכול יתחברו ליציאה הזו בכתובת ה-IP של השירות. -
TARGET_PORT: היציאה בתוך הקונטיינר של ה-pod שבה האפליקציה פועלת ומאזינה לחיבורים נכנסים. היציאה יכולה להיות יציאה מספרית או יציאה עם שם שמוגדר במפרט של מאגר ה-Pod.
בשדה
portמגדירים את יציאת הקצה הקדמי שחושפים בכתובת ה-VIP. בשדהtargetPortמגדירים את היציאה של הקצה העורפי שאליה רוצים להעביר את התנועה בעומסי העבודה של הקצה העורפי. מאזן העומסים תומך בתרגום כתובת רשת (NAT). היציאות של החזית והקצה העורפי יכולות להיות שונות.-
בשדה
selectorשל ההגדרהService, מציינים צמדי מפתח/ערך שתואמים לעומסי העבודה בקצה העורפי. באשכולות רגילים, רק pod-ים נתמכים כעומסי עבודה.בורר שאתם מגדירים, על סמך התאמה בין התוויות שאתם מציינים לבין התוויות של עומסי העבודה. ה-
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:השם של קובץ ההגדרה שלServiceלשירות ELB. -
KUBECONFIG_PATH: הנתיב לקובץ kubeconfig של האשכול הרגיל.
כדי לקבל את כתובות ה-IP של שירות ה-ELB, אפשר להציג את סטטוס השירות:
kubectl -n ELB_SERVICE_NAMESPACE get svc ELB_SERVICE_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
ELB_SERVICE_NAMESPACE: מרחב השמות שמכיל את עומסי העבודה בקצה העורפי. -
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 של השירות שאפשר לגשת אליו מחוץ לארגון.-
בחירת VM כקצה עורפי למאזן עומסים
כדי לקשר מכונה וירטואלית למאזן העומסים:
מוודאים שלמכונה הווירטואלית יש תווית שתואמת לבורר התוויות שמשמש בהגדרת מאזן העומסים.
לדוגמה, אם למכונה הווירטואלית אין תווית מתאימה, אפשר להוסיף למכונה הווירטואלית את התווית שצוינה מהאובייקט לקצה העורפי של האזור המתאים:
kubectl --kubeconfig MANAGEMENT_API_SERVER label virtualmachine VM_NAME -n PROJECT_NAMELABELמחליפים את מה שכתוב בשדות הבאים:
-
LABEL: תווית שתואמת ל-LabelSelectorבהגדרות של מאזן העומסים, כמוapp=server. -
VM_NAME: השם של המכונה הווירטואלית שמקושרת. -
PROJECT_NAME: שם הפרויקט.
-
מוודאים שהשרת מאזין לאותה יציאה שצוינה באובייקט
HealthCheck.