Estou escrevendo um operador Kubernetes para implantar servidores de jogos individuais e dedicados, dentro do mesmo cluster. Qual seria o melhor método para expor esses servidores fora do cluster?
Requisitos
- Os servidores devem ser endereçáveis individualmente fora do cluster. Os servidores de jogos dedicados são isolados uns dos outros e não podem ter balanceamento de carga.
- Suporta protocolos TCP e UDP. Esses são os principais protocolos com os quais os jogos se comunicarão.
- Gerenciável programaticamente. Meu recurso personalizado é um servidor individual. Associar um servidor a algo como uma entrada é perigoso, pois um único recurso de entrada também contém as regras de outros servidores.
- Dimensione para os limites superiores do Kubernetes.
- Nativo do Kubernetes. Isso poderia ser hospedado em qualquer lugar, sem depender de recursos personalizados ou ferramentas fora do meu próprio projeto.
Ideias
Inicialmente pensei em um ingress
. No entanto, os listeners e as regras de entrada não são recursos separados da entrada em si. Modificar essas regras programaticamente por servidor individual pode ser muito perigoso. O mesmo acontece com os ouvintes da nova API do Gateway .
Eu olhei nodeports
, mas como o escopo dos nodeports abrange todo o cluster, o limite teórico por cluster é um único intervalo de portas - muito abaixo 65535
.
O mais próximo que cheguei até agora foi clusterIps
com externalIps
. Pelo que estou lendo, isso parece funcionar de maneira semelhante a um nodePort, mas o escopo é colocado nos externalIps. Isso significa que eu poderia distribuir os servidores em vários Ips externos, escalando muito mais do que nodeports.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app.kubernetes.io/name: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 49152
externalIPs:
- 198.51.100.32
Não tenho certeza se estou interpretando mal a maneira como isso clusterIps
funciona externalIps
.
Às vezes, a melhor solução é simples:
Use o
hostPort
campo na especificação do contêiner de um pod.Assim como
externalIP
, isso significa que você precisa de um Node endereçável publicamente.Isso foi respondido nos fóruns da comunidade Kubernetes pelo principal colaborador do Agones, que é muito semelhante ao meu projeto.