Consenti connessioni dirette ai pod Autopilot tramite hostPort


Questa pagina mostra come esporre una porta casuale in un pod in esecuzione in un cluster Autopilot di Google Kubernetes Engine (GKE).

L'esposizione di una porta in un pod consente al pod di accettare direttamente le connessioni in entrata, senza un bilanciatore del carico. GKE sceglie una porta casuale da aprire da un intervallo da te specificato nella specifica del pod. Questo tipo di esposizione alle porte casuali è utile quando il carico di lavoro richiede connessioni in entrata dirette, ma non si basa su un numero di porta permanente. Un esempio di questo tipo di carico di lavoro è una risorsa Agones GameServer con il criterio della porta Dynamic predefinito.

Quando richiedi una porta casuale, GKE esegue l'override del valore nel campo hostPort nella specifica del container sulla porta che GKE ha selezionato per te.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo gcloud components update.
  • Assicurati di avere un cluster GKE Autopilot che esegue la versione 1.24.7-gke.1200 e successive o 1.25.3-gke.1100 e successive.

Limitazioni

Puoi assegnare hostPort casuali solo per pod statici o per pod gestiti da un controller personalizzato, come Agones. Questa funzionalità non è supportata sui controller gestiti di Kubernetes come i deployment.

Richiedi una porta casuale

  1. Salva il seguente manifest con il nome 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
    

    Sostituisci quanto segue:

    • MIN_PORT: il numero minimo di porte per l'intervallo da cui GKE sceglie una porta casuale.
    • MAX_PORT: il numero massimo di porte per l'intervallo da cui GKE sceglie una porta casuale.
    • HOST_PORT1, HOST_PORT2: qualsiasi numero di porta valido. Quando il pod viene pianificato, GKE aggiorna questo campo con la porta assegnata in modo casuale. Se hai più container, utilizza numeri di porta diversi per ogni container.

    L'intervallo di porte (la differenza tra MAX_PORT e MIN_PORT) deve essere di almeno 1000 porte.

  2. Applica il manifest:

    kubectl apply -f host-port-pod.yaml
    

Quando applichi il manifest, GKE seleziona una porta casuale dal tuo intervallo e assegna la porta al container. Se GKE assegna lo stesso valore di porta a due pod, GKE posiziona automaticamente i pod su nodi separati per evitare conflitti tra porte.

Controlla la porta assegnata

Per trovare il numero di porta che GKE ha assegnato ai tuoi container, controlla il pod:

kubectl get pod game-pod --output=yaml

L'output è simile al seguente:

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 questo output:

  • metadata.annotations.autopilot.gke.io/host-port-assignment: le assegnazioni delle porte, che mostrano il valore originale di hostPort che hai impostato per ogni container e il valore aggiornato per hostPort assegnato da GKE. Questo campo è utile se hai richiesto più porte nella specifica del pod.
  • spec.containers.ports.hostPort: la porta aperta che GKE ha assegnato a ogni container.

Passaggi successivi

Traccia il supporto di Agones in Autopilot su GitHub.