Permita ligações diretas a pods do Autopilot através de hostPort


Esta página mostra como expor uma porta aleatória num pod em execução num cluster do Google Kubernetes Engine (GKE) Autopilot.

A exposição de uma porta num pod permite que o pod aceite ligações recebidas diretamente, sem um equilibrador de carga. O GKE escolhe uma porta aleatória para abrir a partir de um intervalo que especifica na especificação do pod. Este tipo de exposição de portas aleatórias é útil quando a sua carga de trabalho requer ligações de entrada diretas, mas não depende de um número de porta persistente. Um exemplo deste tipo de carga de trabalho é um recurso GameServer do Agones com a política de portas Dynamic predefinida.

Quando pede uma porta aleatória, o GKE substitui o valor no campo hostPort na especificação do contentor pela porta que o GKE selecionou para si.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.
  • Certifique-se de que tem um cluster do GKE Autopilot com a versão 1.24.7-gke.1200 e posteriores ou 1.25.3-gke.1100 e posteriores.

Limitações

Só pode atribuir hostPorts aleatórios para pods estáticos ou para pods geridos por um controlador personalizado, como o Agones. Esta funcionalidade não é suportada em controladores geridos do Kubernetes, como implementações.

Peça uma porta aleatória

  1. Guarde o seguinte manifesto 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
    

    Substitua o seguinte:

    • MIN_PORT: o número da porta mínimo para o intervalo a partir do qual o GKE escolhe uma porta aleatória.
    • MAX_PORT: o número de porta máximo para o intervalo a partir do qual o GKE escolhe uma porta aleatória.
    • HOST_PORT1, HOST_PORT2: qualquer número de porta válido. Quando o pod é agendado, o GKE atualiza este campo com a porta atribuída aleatoriamente. Se tiver vários contentores, use números de porta diferentes para cada contentor.

    O intervalo de portas (a diferença entre MAX_PORT e MIN_PORT) tem de ter, pelo menos, 1000 portas.

  2. Aplique o manifesto:

    kubectl apply -f host-port-pod.yaml
    

Quando aplica o manifesto, o GKE seleciona uma porta aleatória do seu intervalo e atribui a porta ao seu contentor. Se o GKE atribuir o mesmo valor de porta a dois pods, o GKE coloca automaticamente os pods em nós separados para evitar conflitos de portas.

Verifique a porta atribuída

Para encontrar o número da porta que o GKE atribuiu aos seus contentores, inspecione o pod:

kubectl get pod game-pod --output=yaml

O resultado é semelhante ao seguinte:

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

Neste resultado:

  • metadata.annotations.autopilot.gke.io/host-port-assignment: as atribuições de portas, que mostram o valor original de hostPort que definiu para cada contentor e o valor atualizado de hostPort que o GKE atribuiu. Este campo é útil se tiver pedido várias portas na especificação do Pod.
  • spec.containers.ports.hostPort: a porta aberta que o GKE atribuiu a cada contentor.

O que se segue?

Acompanhe o suporte do Agones no Autopilot no GitHub.