Atualmente, estou trabalhando em um pequeno projeto de hobby que tornarei código aberto quando estiver pronto. Este serviço está sendo executado no Google Container Engine. Eu escolhi o GCE para evitar problemas de configuração, os custos são acessíveis e para aprender coisas novas.
Meus pods estão funcionando bem e eu criei um serviço com o tipo LoadBalancer
para expor o serviço nas portas 80 e 443. Isso funciona perfeitamente.
No entanto, descobri que para cada LoadBalancer
serviço, um novo balanceador de carga do Google Compute Engine é criado. Esse balanceador de carga é muito caro e superestimado para um projeto de hobby em uma única instância.
Para reduzir os custos, estou procurando uma maneira de expor as portas sem o balanceador de carga.
O que eu tentei até agora:
Implante um
NodePort
serviço. Infelizmente, não é permitido expor uma porta abaixo de 30000.Implante um ingresso, mas isso também cria um balanceador de carga.
Tentou desativar
HttpLoadBalancing
( https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#HttpLoadBalancing ), mas ainda cria um balanceador de carga.
Existe uma maneira de expor as portas 80 e 443 para uma única instância no Google Container Engine sem um balanceador de carga?
fonte
externalIp
Além da excelente e funcional solução do ConnorJC: A mesma solução também é descrita nesta pergunta: Kubernetes - posso evitar o uso do GCE Load Balancer para reduzir custos?
O "internalIp" refere-se ao IP interno da instância de computação (também conhecida como do nó) (como visto no Google Cloud Platform -> Google Compute Engine -> Instâncias de VM)
Este comentário dá uma dica de por que o IP interno e não o IP externo deve ser configurado.
Além disso, depois de configurar o serviço para as portas 80 e 443, tive que criar uma regra de firewall que permitisse tráfego para o nó da instância:
Após essa configuração, eu poderia acessar meu serviço através de http (s): // externalIp
fonte
Se você tiver apenas exatamente um pod, poderá usar
hostNetwork: true
isso para:Observe que, ao fazer isso, seu pod herdará o resolvedor DNS do host e não o Kubernetes '. Isso significa que você não pode mais resolver os serviços de cluster pelo nome DNS. Por exemplo, no exemplo acima, você não pode acessar o
static
serviço em http: // estático . Você ainda pode acessar serviços pelo IP do cluster, que são injetados por variáveis de ambiente .Essa solução é melhor do que usar o IP externo do serviço, pois ignora o kube-proxy e você receberá o IP de origem correto.
fonte
Para sintetizar as respostas do @ConnorJC @ derMikey exatamente no que funcionou para mim:
Dado um conjunto de clusters em execução na instância do Compute Engine :
Eu fiz o serviço:
e, em seguida, abriu o firewall para todos os ips no projeto:
e
my-app
era acessível através do IP público da instância34.56.7.001
do GCE (não do ip do cluster)fonte
Prefiro não usar os balanceadores de carga na nuvem, até que seja necessário, devido ao custo e ao bloqueio do fornecedor.
Em vez disso, eu uso isso: https://kubernetes.github.io/ingress-nginx/deploy/
É um pod que executa um balanceador de carga para você. Essa página possui notas de instalação específicas do GKE.
fonte