Os pods do GKE perderam o acesso à VPN após a 1.14: duas formas de corrigir a origem
Após a 1.14 os pods chegam à VPN com os seus próprios endereços, por isso os pares descartam as respostas. Escolha o contrato de origem e depois defina nonMasqueradeCIDRs em conformidade.
Chega uma atualização e os sistemas do outro lado do túnel começam a rejeitar o tráfego dos pods que funcionava na semana anterior. O túnel está ativo, as regras da firewall estão intactas e ninguém editou a política do par. O que mudou é invisível nos registos do cluster: o endereço de origem que esses sistemas veem agora. Essa lacuna explica uma falha que parece uma queda de rede e se comporta como um problema de permissões.
Existem duas respostas válidas e levam a sítios diferentes. Escolha o contrato de origem antes de editar um ConfigMap.
A regra predefinida que deixou de ser instalada
As versões anteriores do GKE instalavam uma regra de masquerade que substituía as origens dos pods pelo endereço do nó sempre que o destino ficava fora de 10.0.0.0/8. Um gateway VPN dentro desse intervalo via o endereço do pod, enquanto tudo o que estava mais longe parecia vir do nó. Os pares construíram listas de permitidos e rotas de retorno em torno dos endereços dos nós porque era isso que observavam.
As versões seguintes deixaram de instalar essa regra predefinida. O tráfego dos pods chega agora ao gateway com endereços de pod, seja qual for o destino. Um par que só encaminha endereços de nó descarta as respostas e nenhum dos lados escreve uma entrada de registo útil. O pedido pode até ter sucesso no extremo remoto, e é isso que torna a falha confusa de seguir.
Nada está avariado no sentido de um componente morto. Os dois lados simplesmente não concordam sobre qual origem é legítima.
Escolha a origem que o par deve ver
Manter os endereços de pod é o contrato mais preciso. O lado remoto vê a carga de trabalho que produziu o tráfego, os registos mantêm-se honestos e a política por pod torna-se possível. O preço é que o par tem de transportar o prefixo dos pods.
Manter os endereços de nó é o contrato mais barato. Volte a ativar o masquerade para esse destino e o par continua a ver um endereço em que já confia.
Uma pergunta decide entre os dois: o que faz o par com a origem? Se registar, aplicar política por origem ou impuser um encaminhamento de retorno estreito, os endereços de pod justificam a configuração extra. Se só precisar de enviar respostas, o masquerade custa menos e não pede nada ao outro lado. Qualquer das escolhas é defensável desde que as duas equipas a escrevam.
Uma terceira opção costuma ser um erro: aplicar masquerade a tudo e perder a capacidade de atribuir o tráfego. Evite-a, a menos que um par não consiga mesmo encaminhar nada além de endereços de nó.
Aponte nonMasqueradeCIDRs para os intervalos reais
O GKE executa o ip-masq-agent em kube-system, e o respetivo ConfigMap lista os destinos que saltam o masquerade. Para preservar as origens dos pods em direção ao túnel, o intervalo dos pods, a sub-rede dos nós e o prefixo local pertencem todos a essa lista.
Substitua os valores de exemplo por intervalos do seu próprio cluster. Não torne a lista mais ampla do que o requisito dita, porque cada entrada extra altera o que outro destino vê. As três entradas abaixo representam a rede dos pods, a sub-rede dos nós e o prefixo atrás do túnel:
nonMasqueradeCIDRs:
- 10.12.0.0/14
- 10.100.0.0/16
- 172.16.0.0/12
masqLinkLocal: false
resyncInterval: 60sUma entrada 0.0.0.0/0 desativa o masquerade para todos os destinos, o que altera a forma como cargas de trabalho não relacionadas aparecem aos serviços externos e raramente é intencional. O agente relê a sua configuração em resyncInterval, pelo que normalmente não é necessário reiniciar. Verifique se o pod do agente está em execução e depois abra o ficheiro montado dentro dele. É a leitura desse ficheiro que prova que a alteração chegou.
O caminho de retorno é a outra metade
O masquerade altera a origem do pedido e nada mais. Qualquer que seja a origem que o par receba, continua a precisar de uma rota de volta para ela, e o cluster continua a precisar de uma rota em direção ao par.
Uma captura no gateway VPN separa rapidamente as duas falhas. Pacotes que chegam com endereços de pod e nunca recebem resposta significam que o par não tem rota para o prefixo dos pods. Uma resposta que aparece no gateway mas nunca chega ao cluster significa que falta a rota local. Escreva o contrato no ticket de qualquer forma: que origem vê o par e para que prefixo encaminha a resposta.
Verifique novamente após cada atualização
O comportamento predefinido do masquerade já mudou uma vez, e a substituição de um pool de nós pode repor a rede do cluster. Trate o contrato de origem como algo a verificar e não como algo a assumir.
Após uma atualização, envie um pedido de um pod para um serviço local e leia a origem que o par registra. Essa única observação apanha uma regressão que uma página de estado do túnel relataria alegremente como saudável. Repeti-la custa um minuto e poupa uma noite à pessoa seguinte.