Tenho um problema com a configuração do meu balanceador de carga, onde ele sempre redireciona a maior parte do tráfego (como 99%) para um pod. Basicamente a infraestrutura é como mostradaneste diagrama. O objetivo é que a sessão fixa seja habilitada, seja no nginx ou no balanceador de carga do Google, e meu tráfego seja distribuído igualmente para os pods disponíveis.
Resumidamente, tenho 2 RCs e 2 Serviços em meu cluster. 1 pod de nginx servido por trás de um Google Loadbalancer (nginx-lb) e outro balanceador de carga (app-lb) para equilibrar o tráfego para 2 pods de aplicativos. Aqui está o que pensei da configuração:
nginx-lb: Eu configurei o nginx-lb para
sessionAffinity: None
eexternalTrafficPolicy: Local
porque estou pensando que não preciso de uma sessão fixa agora, mas precisopassar pelo IP do usuário. Neste ponto, todo o tráfego de entrada será tratado da mesma forma, mas estamos tentando preservar o IP do usuário configurandoexternalTrafficPolicy: Local
.nginx: O próprio nginx foi habilitadongx_http_realip_modulepara manter o IP do usuário encaminhado, mas não usei ip_hash aqui porque ainda estou pensando que não precisamos de uma sessão fixa aqui ainda. Novamente, assim como o nginx-lb, estou tentando passar todo o tráfego de entrada, mas preservar o IP do usuário. O nginx aqui é principalmente para proxy e manipulador SSL.
app-lb: Em seguida, chega ao app-lb, onde habilitei
sessionAffinity: ClientIP
para sessão fixa eexternalTrafficPolicy: Cluster
parabalanceamento de carga. Acredito que é aqui que ocorre o balanceamento de carga real do ClientIP, pois este é o único serviço que possui/conhece 2 pods por trás dele.
Testei essa configuração com cerca de 50 usuários rodando por um dia, mas ainda redirecionando para um pod, enquanto o outro pod está ocioso com baixo uso de CPU e memória em comparação com o primeiro.
Gostaria de perguntar sobre a configuração, estou acertando o que desejo alcançar? Há alguma configuração que estou faltando? Qualquer contribuição será muito apreciada.
PS. Reescrevo toda a pergunta para adicionar mais fatos do que entendi, mas basicamente ainda relevantes para a pergunta original com formulações diferentes.
Responder1
Isso acontece, porque você está usando sessionAffinity: ClientIP
, essa é a afinidade do serviço e é baseada em ip, então o serviço pega o ip do seu loadbalancer, tente usar sessionAffinity: None
e se quiser usar sticky session use nginx ingress controller
Responder2
Você já tentou testar seus aplicativos com uma quantidade maior de clientes do que seu celular e laptop?
Talvez você possa testá-lo em várias instâncias do mecanismo de computação do Google.
Como você está implementando sessão fixa e balanceamento de carga, ip_hash
você tem 50% de chance de que dois dispositivos sejam atendidos pelo mesmo pod e mesmo se você recarregar a página, ela será sempre atendida pelo mesmo pod até que você altere o IP.
Com o ip-hash, o endereço IP do cliente é usado como uma chave de hashing para determinar qual servidor em um grupo de servidores deve ser selecionado para as solicitações do cliente. Este método garante que as solicitações de um mesmo cliente serão sempre direcionadas para o mesmo servidor, exceto quando este servidor estiver indisponível. http://nginx.org/en/docs/http/load_balancing.html