Permite conexiones directas a los Pods de Autopilot con hostPort


En esta página, se muestra cómo exponer un puerto aleatorio en un Pod que se ejecuta en un clúster de Google Kubernetes Engine (GKE) Autopilot.

Exponer un puerto en un Pod permite que el Pod acepte conexiones entrantes directamente, sin un balanceador de cargas. GKE elige un puerto aleatorio para abrir desde un rango que especificas en la especificación del Pod. Este tipo de exposición de puertos aleatorios es útil cuando tu carga de trabajo requiere conexiones entrantes directas, pero no depende de un número de puerto persistente. Un ejemplo de este tipo de carga de trabajo es un recurso Agones GameServer con la política de puerto Dynamic predeterminada.

Cuando solicitas un puerto aleatorio, GKE anula el valor en el campo hostPort de la especificación del contenedor al puerto que GKE seleccionó para ti.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Kubernetes Engine de Google.
  • Habilitar la API de Kubernetes Engine de Google
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.
  • Asegúrate de tener un clúster de Autopilot de GKE que ejecute la versión 1.24.7-gke.1200 y versiones posteriores, o 1.25.3-gke.1100 y versiones posteriores.

Limitaciones

Solo puedes asignar hostPorts aleatorios a los Pods estáticos o a los Pods administrados por un controlador personalizado, como Agones. Esta funcionalidad no es compatible con los controladores administrados de Kubernetes, como los Deployments.

Solicita un puerto aleatorio

  1. Guarda el siguiente manifiesto como 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
    

    Reemplaza lo siguiente:

    • MIN_PORT: Es el número de puerto mínimo para el rango desde el que GKE elige un puerto aleatorio.
    • MAX_PORT: El número de puerto máximo para el rango desde el que GKE elige un puerto aleatorio.
    • HOST_PORT1, HOST_PORT2: cualquier número de puerto válido. Cuando se programa el Pod, GKE actualiza este campo con el puerto asignado de forma aleatoria. Si tienes varios contenedores, usa números de puerto diferentes para cada contenedor.

    El rango de puertos (la diferencia entre MAX_PORT y MIN_PORT) debe ser de al menos 1,000 puertos.

  2. Aplica el manifiesto

    kubectl apply -f host-port-pod.yaml
    

Cuando aplicas el manifiesto, GKE selecciona un puerto aleatorio de tu rango y asigna el puerto al contenedor. Si GKE asigna el mismo valor de puerto a dos Pods, GKE coloca de forma automática los Pods en nodos independientes para evitar conflictos de puertos.

Verifica el puerto asignado

Para encontrar el número de puerto que GKE asignó a tus contenedores, inspecciona el Pod:

kubectl get pod game-pod --output=yaml

El resultado es similar a este:

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

En este resultado, se ilustra lo siguiente:

  • metadata.annotations.autopilot.gke.io/host-port-assignment: las asignaciones de puertos, que muestran el valor original de hostPort que estableciste para cada contenedor y el valor actualizado para hostPort que asignó GKE. Este campo es útil si solicitaste varios puertos en tu especificación de Pod.
  • spec.containers.ports.hostPort: el puerto abierto que GKE asignó a cada contenedor.

¿Qué sigue?

Realiza un seguimiento de la compatibilidad de Agones en Autopilot en GitHub.