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
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
eMIN_PORT
) tem de ter, pelo menos, 1000 portas.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 dehostPort
que definiu para cada contentor e o valor atualizado dehostPort
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.