Caso de melhoria da estabilidade de rede no Cilium: resultados impressionantes com uma pequena alteração de código
(gosuda.org)- Apresentação de um caso de PR em que uma pequena alteração de código (a adição de apenas uma instrução
if) contribuiu significativamente para a estabilidade do sistema - Impacto e importância do PR "bpf:nat: Restore ORG NAT entry if it's not found"
Princípio básico do NAT (Network Address Translation)
- NAT é uma tecnologia que permite que vários dispositivos compartilhem um único IP público
- Torna possível a comunicação entre dispositivos internos (IP privado:porta) e a internet externa
- A tabela NAT armazena informações de mapeamento entre o endereço original e o endereço traduzido
- Processo:
- Um dispositivo interno tenta se conectar a um servidor externo
- O dispositivo NAT converte o IP/porta de origem em um IP/porta público (SNAT)
- A resposta do servidor externo é convertida novamente para o dispositivo interno (DNAT)
Uso de NAT no Kubernetes
- Dois principais casos em que o NAT é usado de forma importante no Kubernetes:
- Comunicação do Pod para fora do cluster: converte o IP interno do Pod para o IP público do nó
- Comunicação de fora para o Pod via NodePort: roteia solicitações externas para um Pod específico
Como o Cilium implementa NAT
- Em geral, no Linux, o NAT é tratado com conntrack e iptables
- O Cilium usa a tecnologia eBPF para contornar a pilha de rede tradicional do Linux
- O Cilium gerencia diretamente a tabela NAT usando um mapa hash LRU (
BPF_MAP_TYPE_LRU_HASH)
Causa do problema
- Problema de lookup: para processar pacotes bidirecionais (saída/entrada), os mesmos dados são armazenados duas vezes (RevSNAT)
- Limitação do LRU: devido a recursos limitados, itens menos usados podem ser removidos
- **Perda de conexão # Um caso em que uma pequena alteração de código no Cilium trouxe uma grande melhoria na estabilidade da rede
Introdução: o grande impacto de uma pequena mudança de código
- Um caso em que a adição de apenas um bloco
ifcontribuiu enormemente para a estabilidade do sistema - O PR em questão: "bpf:nat: Restore ORG NAT entry if it's not found"
- Explicado para que até quem não é especialista em redes consiga entender
Princípio básico do NAT (Network Address Translation)
- NAT é uma tecnologia que permite que vários dispositivos compartilhem um único IP público
- Funciona mapeando uma combinação de IP privado:porta interna para um IP público:porta externo
- Processo de funcionamento:
- Um dispositivo interno tenta acessar um servidor externo
- O dispositivo NAT converte a comunicação interna em comunicação externa (SNAT)
- Quando a resposta retorna, ela é convertida novamente para a comunicação interna original (DNAT)
- As informações de conversão são registradas na tabela NAT
Uso de NAT no Kubernetes
- O Kubernetes tem uma estrutura de rede complexa e usa NAT em vários pontos
- Principais casos de uso de NAT:
- Comunicação do Pod para fora do cluster: converte o IP privado do Pod para o IP público do nó (SNAT)
- Comunicação de fora para o Pod via NodePort: executa DNAT e SNAT ao mesmo tempo para encaminhar o tráfego externo ao Pod adequado
A abordagem especial do Cilium
- Em sistemas Linux comuns, o NAT é gerenciado com o subsistema conntrack e iptables
- O Cilium usa a tecnologia eBPF para contornar a pilha de rede tradicional do Linux
- Para o processamento de SNAT, gerencia diretamente a tabela SNAT no formato de mapa hash LRU (
BPF_MAP_TYPE_LRU_HASH)
Causa e sintomas do problema
-
Problema de consulta (Lookup):
- É necessário consultar a tabela hash para validar o processamento de NAT
- Para uma consulta rápida, os mesmos dados são inseridos duas vezes na tabela como RevSNAT, invertendo os valores de src e dst
-
Problema de LRU (Least Recently Used):
- Devido à limitação de recursos, os dados podem ser removidos pela lógica de LRU
-
Problemas combinados:
- Os mesmos dados são registrados duas vezes para uma única conexão TCP
- Se qualquer uma das duas entradas for removida pelo LRU, toda a conexão pode ser interrompida
Solução simples, mas eficaz
- Ideia central: quando um pacote de uma direção é observado, a entrada da direção oposta também é atualizada junto
- Com essa abordagem simples:
- As entradas bidirecionais são atualizadas, ficando menos propensas à remoção prioritária pelo LRU
- Reduz a possibilidade de ocorrer o cenário em que apenas uma entrada é apagada e toda a comunicação é interrompida
- Os testes de benchmark mostraram uma grande melhora na estabilidade da rede
Conclusão e lições
- Este caso mostra que, mesmo em sistemas complexos, uma ideia simples pode gerar uma grande mudança
- O problema foi resolvido com base em conhecimento fundamental de ciência da computação (como o NAT funciona)
- Outra forma de evitar o problema: aumentar o tamanho da tabela NAT
- Reconhecimento pela análise minuciosa do problema com dados objetivos e pela paixão do desenvolvedor que contribuiu
Valor da abordagem técnica
- A importância de entender e resolver a causa raiz do problema
- A lição de que uma simples alteração de código pode melhorar bastante a estabilidade de todo o sistema
- A importância de compreender os princípios básicos mesmo em sistemas complexos
1 comentários
Obrigado por compartilhar essa ótima experiência!