בדף הזה מוסבר איך לחשוף יציאה אקראית ב-Pod שפועל באשכול Autopilot של Google Kubernetes Engine (GKE).
חשיפת פורט ב-Pod מאפשרת ל-Pod לקבל חיבורים נכנסים ישירות, בלי איזון עומסים. GKE בוחר יציאה אקראית לפתיחה מתוך טווח שאתם מציינים במפרט ה-Pod. החשיפה האקראית של יציאות שימושית כשעומס העבודה דורש חיבורים נכנסים ישירים, אבל לא מסתמך על מספר יציאה קבוע. דוגמה לעומס עבודה מהסוג הזה היא משאב Agones GameServer עם מדיניות ברירת המחדל של היציאה Dynamic.
כשמבקשים יציאה אקראית, GKE מחליף את הערך בשדה hostPort במפרט של הקונטיינר ביציאה ש-GKE בחר בשבילכם.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק Google Kubernetes Engine API. הפעלת Google Kubernetes Engine API
- כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
- צריך לוודא שיש לכם אשכול GKE Autopilot שפועלת בו גרסה 1.24.7-gke.1200 ואילך או גרסה 1.25.3-gke.1100 ואילך.
מגבלות
אפשר להקצות hostPorts אקראיים רק ל-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 command: ["sleep", "infinity"] ports: - containerPort: 80 hostPort: HOST_PORT1 protocol: TCP - name: game-server image: ubuntu command: ["sleep", "infinity"] 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
command:
- sleep
- infinity
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 7300
protocol: TCP
- name: game-server
image: ubuntu
command:
- sleep
- infinity
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.