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 aleatória da porta é útil quando sua carga de trabalho exige conexões de entrada direta, mas não depende de um número de porta persistente. Um exemplo desse tipo de carga de trabalho é um recurso Agones GameServer com a política de porta Dynamic padrão.

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 para pods estáticos ou pods gerenciados por um controlador personalizado, como o Agones. Essa funcionalidade não é compatível com controladores gerenciados pelo 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 de porta mínima para o intervalo em que o GKE escolhe uma porta aleatória.
    • MAX_PORT: o número máximo da porta para o intervalo em que o GKE escolhe uma porta aleatória.
    • HOST_PORT1, HOST_PORT2: qualquer número de porta válido. Quando o pod é programado, o GKE atualiza esse 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 ser de 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 de 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 que o GKE atribuiu a cada contêiner.

A seguir

Acompanhe o suporte do Agones no Autopilot no GitHub.