Estou executando um cluster Kubernetes em uma nuvem pública (Azure / AWS / Google Cloud) e tenho alguns serviços não HTTP que gostaria de expor para os usuários.
Para serviços HTTP, normalmente eu usaria um recurso do Ingress para expor esse serviço publicamente através de uma entrada DNS endereçável.
Para serviços não HTTP, baseados em TCP (por exemplo, um banco de dados como o PostgreSQL), como devo expô-los ao consumo público?
Eu considerei usar NodePort
serviços, mas isso exige que os nós estejam acessíveis publicamente (contando com kube-proxy
a rota para o nó apropriado). Eu preferiria evitar isso, se possível.
LoadBalancer
os serviços parecem outra opção, embora eu não queira criar um balanceador de carga em nuvem dedicado para cada serviço TCP que quero expor.
Estou ciente de que o controlador NGINX Ingress suporta a exposição de serviços TCP e UDP , mas isso parece exigir uma definição estática dos serviços que você deseja expor. Para o meu caso de uso, esses serviços estão sendo criados e destruídos dinamicamente, portanto, não é possível definir esses mapeamentos de serviço antecipadamente em uma estática ConfigMap
.
fonte
Bem, isso depende de como você espera que o usuário final resolva esses serviços? Como você apontou, com um Ingress, é possível usar hospedagem virtual para rotear todas as solicitações para o mesmo controlador do Ingress e, em seguida, usar o
Host:
cabeçalho para despachar no cluster.Com um serviço TCP, como o PostgreSQL, não existe esse cabeçalho. Portanto, você precisaria necessariamente ter um mecanismo baseado em IP ou atribuir a cada um uma porta dedicada no seu IP da Internet
Se seus clientes estiverem cientes do IPv6, atribuir a cada Serviço um endereço IP dedicado é absolutamente razoável, considerando o espaço IP enorme que o IPv6 oferece. Mas, caso contrário, você tem dois botões para ativar: o IP e a porta.
A partir daí, como você roteará essas conexões dentro do cluster para o Serviço certo dependerá de como você resolveu o primeiro problema
fonte
NodePort
s exigem a abertura pública das portas nos nós, o que não é ideal do ponto de vista da segurança. O LoadBalancer por serviço é caro. Supondo que eu possa rotear corretamente para o host, qual serviço Kubernetes devo usar para torná-los publicamente conectáveis, principalmente quando estes estão sendo ativados e desativados dinamicamente?