Direkte Verbindungen zu Autopilot-Pods mit hostPort zulassen


Auf dieser Seite erfahren Sie, wie Sie einen zufälligen Port in einem Pod freigeben, der in einem GKE Autopilot-Cluster (Google Kubernetes Engine) ausgeführt wird.

Wenn ein Port in einem Pod verfügbar gemacht wird, akzeptiert der Pod eingehende Verbindungen direkt ohne Load-Balancer. GKE wählt einen zufälligen Port aus dem Bereich aus, den Sie in der Pod-Spezifikation angeben. Diese Art der zufälligen Portfreigabe ist nützlich, wenn Ihre Arbeitslast direkte eingehende Verbindungen erfordert, aber nicht auf einer nichtflüchtigen Portnummer basiert. Ein Beispiel für diese Art von Arbeitslast ist eine Agones GameServer-Ressource mit der standardmäßigen Portrichtlinie Dynamic.

Wenn Sie einen zufälligen Port anfordern, überschreibt GKE den Wert im Feld hostPort der Containerspezifikation mit dem Port, den GKE für Sie ausgewählt hat.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit gcloud components update ab.
  • Sie benötigen einen GKE Autopilot-Cluster mit Version 1.24.7-gke.1200 und höher oder 1.25.3-gke.1100 und höher.

Beschränkungen

Sie können nur zufällige hostPorts nur für statische Pods oder für Pods zuweisen, die von einem benutzerdefinierten Controller wie Agones verwaltet werden. Diese Funktion wird auf von Kubernetes verwalteten Controllern wie Deployments nicht unterstützt.

Zufälligen Port anfordern

  1. Speichern Sie das folgende Manifest als 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
    

    Dabei gilt:

    • MIN_PORT: die minimale Portnummer für den Bereich, aus dem GKE einen zufälligen Port auswählt.
    • MAX_PORT: die maximale Portnummer für den Bereich, aus dem GKE einen zufälligen Port auswählt.
    • HOST_PORT1, HOST_PORT2: eine beliebige gültige Portnummer. Wenn der Pod geplant ist, aktualisiert GKE dieses Feld mit dem zufällig zugewiesenen Port. Wenn Sie mehrere Container haben, verwenden Sie für jeden Container unterschiedliche Portnummern.

    Der Portbereich (der Unterschied zwischen MAX_PORT und MIN_PORT) muss mindestens 1.000 Ports umfassen.

  2. Wenden Sie das Manifest an:

    kubectl apply -f host-port-pod.yaml
    

Wenn Sie das Manifest anwenden, wählt GKE einen zufälligen Port aus dem Bereich aus und weist den Container Ihrem Port zu. Wenn GKE denselben Pods den gleichen Portwert zuweist, werden die Pods von GKE automatisch auf separaten Knoten platziert, um Portkonflikte zu vermeiden.

Zugewiesenen Port prüfen

Die Portnummer, die GKE Ihren Containern zugewiesen hat, können Sie anhand des Pods ermitteln:

kubectl get pod game-pod --output=yaml

Die Ausgabe sieht in etwa so aus:

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

In dieser Ausgabe gilt:

  • metadata.annotations.autopilot.gke.io/host-port-assignment: die Port-Zuweisungen, wobei der ursprüngliche Wert für hostPort, den Sie für jeden Container festgelegt haben, und der aktualisierte Wert für hostPort, den GKE zugewiesen hat, angezeigt werden. Dieses Feld ist hilfreich, wenn Sie mehrere Ports in Ihrer Pod-Spezifikation angefordert haben.
  • spec.containers.ports.hostPort: der geöffnete Port, den GKE jedem Container zugewiesen hat.

Nächste Schritte

Agones-Unterstützung auf Autopilot auf GitHub verfolgen