בדף הזה מוסבר איך לחשוף יציאה אקראית ב-Pod שפועל באשכול Autopilot של Google Kubernetes Engine (GKE).
חשיפת פורט ב-Pod מאפשרת ל-Pod לקבל חיבורים נכנסים ישירות, בלי איזון עומסים. GKE בוחר יציאה אקראית לפתיחה מתוך טווח שאתם מציינים במפרט ה-Pod. החשיפה האקראית של יציאות שימושית כשעומס העבודה דורש חיבורים נכנסים ישירים, אבל לא מסתמך על מספר יציאה קבוע. דוגמה לעומס עבודה מהסוג הזה היא משאב GameServer של Agones עם מדיניות היציאות Dynamic שמוגדרת כברירת מחדל.
כשמבקשים יציאה אקראית, GKE מחליף את הערך בשדה hostPort במפרט של הקונטיינר ביציאה ש-GKE בחר בשבילכם.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- מוודאים שיש לכם אשכול GKE Autopilot שפועלת בו גרסה 1.24.7-gke.1200 ואילך או 1.25.3-gke.1100 ואילך.
מגבלות
אפשר להקצות hostPort אקראי רק ל-Pods סטטיים או ל-Pods שמנוהלים על ידי בקר בהתאמה אישית, כמו Agones. הפונקציונליות הזו לא נתמכת בבקרי Kubernetes מנוהלים כמו Deployments.
בקשה להעברה אקראית
שומרים את קובץ המניפסט הבא בשם
host-port-pod.yaml:apiVersion: v1 kind: Pod metadata: name: game-pod annotations: autopilot.gke.io/host-port-assignment: '{"min":MIN_PORT,"max":MAX_PORT}' spec: containers: - name: local-chat image: ubuntu ports: - containerPort: 80 hostPort: HOST_PORT1 protocol: tcp - name: game-server image: ubuntu ports: - containerPort: 80 hostPort: HOST_PORT2 protocol: udpמחליפים את מה שכתוב בשדות הבאים:
-
MIN_PORT: מספר היציאה המינימלי בטווח שממנו GKE בוחר יציאה אקראית. -
MAX_PORT: מספר היציאה המקסימלי בטווח שממנו GKE בוחר יציאה אקראית. -
HOST_PORT1, HOST_PORT2: כל מספר יציאה תקין. כשמתוזמן פוד, GKE מעדכן את השדה הזה עם היציאה שהוקצתה באופן אקראי. אם יש לכם כמה מאגרי תגים, צריך להשתמש במספרי יציאה שונים לכל מאגר תגים.
טווח היציאות (ההפרש בין
MAX_PORTל-MIN_PORT) צריך להיות לפחות 1,000 יציאות.-
החלת המניפסט:
kubectl apply -f host-port-pod.yaml
כשמחילים את המניפסט, GKE בוחר יציאה אקראית מהטווח ומקצה אותה לקונטיינר. אם GKE מקצה את אותו ערך של יציאה לשני פודים, GKE ממקם את הפודים באופן אוטומטי בצמתים נפרדים כדי למנוע התנגשות ביציאות.
בדיקת היציאה שהוקצתה
כדי למצוא את מספר היציאה ש-GKE הקצה לקונטיינרים, בודקים את ה-Pod:
kubectl get pod game-pod --output=yaml
הפלט אמור להיראות כך:
apiVersion: v1
kind: Pod
metadata:
annotations:
autopilot.gke.io/host-port-assignment: '{"min":MIN_PORT,"max":MAX_PORT,"portsAssigned":{"HOST_PORT1":7300,"HOST_PORT2":7450}}'
name: game-pod
namespace: default
spec:
containers:
- name: local-chat
image: ubuntu
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 7300
protocol: TCP
- name: game-server
image: ubuntu
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 7450
protocol: UDP
בפלט הזה:
-
metadata.annotations.autopilot.gke.io/host-port-assignment: הקצאות היציאות, שבהן מוצג הערך המקורי שלhostPortשהגדרתם לכל קונטיינר והערך המעודכן שלhostPortשהוקצה על ידי GKE. השדה הזה שימושי אם ביקשתם כמה יציאות במפרט של ה-Pod. -
spec.containers.ports.hostPort: היציאה הפתוחה ש-GKE הקצה לכל קונטיינר.
המאמרים הבאים
מעקב אחרי התמיכה ב-Agones ב-Autopilot ב-GitHub.