Permitir conexões diretas com pods do Autopilot usando hostPort


Nesta página, mostramos como expor uma porta aleatória em um pod em execução em um cluster do Autopilot do Google Kubernetes Engine (GKE).

A exposição de uma porta em um pod permite que ele aceite conexões de entrada diretamente, sem um balanceador de carga. O GKE escolhe uma porta aleatória para abrir em um intervalo na especificação do pod. Esse tipo de exposição de porta aleatória é útil quando a carga de trabalho exige conexões de entrada diretas, mas não depende de um número de porta persistente. Um exemplo desse tipo de carga de trabalho é um recurso GameServer do Agones com a política de porta padrão Dynamic.

Quando você solicita uma porta aleatória, o GKE substitui o valor no campo hostPort na especificação do contêiner para a porta que o GKE selecionou para você.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando gcloud components update.

Limitações

Só é possível atribuir hostPorts aleatórios a pods estáticos ou gerenciados por um controlador personalizado, como o Agones. Essa funcionalidade não está disponível suportado em Controladores gerenciados do Kubernetes como implantações.

Solicitar uma porta aleatória

  1. Salve 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:

    • MIN_PORT: o número mínimo de porta para o intervalo do qual o GKE escolhe uma porta aleatória.
    • MAX_PORT: o número máximo de porta para o intervalo 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 você tiver vários contêineres, use números de porta diferentes para cada um deles.

    O intervalo de portas (a diferença entre MAX_PORT e MIN_PORT) precisa ter pelo menos 1.000 portas.

  2. Aplique o manifesto:

    kubectl apply -f host-port-pod.yaml
    

Quando você aplica o manifesto, o GKE seleciona uma porta aleatória do seu intervalo e a atribui ao contêiner. Se o GKE atribuir o mesmo valor de porta a dois pods, ele colocará os pods automaticamente em nós separados para evitar conflito de portas.

Verificar a porta atribuída

Para encontrar o número da porta que o GKE atribuiu aos contêineres, inspecione o pod:

kubectl get pod game-pod --output=yaml

O resultado será assim:

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

Nesta saída:

  • metadata.annotations.autopilot.gke.io/host-port-assignment: as atribuições de porta, mostrando o valor original de hostPort que você definiu para cada contêiner e o valor atualizado do hostPort que o GKE atribuiu. Esse campo é útil se você solicitou várias portas na especificação do pod.
  • spec.containers.ports.hostPort: a porta aberta em que o GKE atribuiu a cada contêiner.

A seguir

Acompanhe o suporte do Agones no Autopilot no GitHub.