אפשרות לחיבורים ישירים ל-Autopilot Pods באמצעות hostPort

בדף הזה מוסבר איך לחשוף יציאה אקראית ב-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.

בקשה להעברה אקראית

  1. שומרים את קובץ המניפסט הבא בשם 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 יציאות.

  2. החלת המניפסט:

    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.