9 pontos por lemonmint 2025-04-10 | 1 comentários | Compartilhar no WhatsApp
  • 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:
    1. Um dispositivo interno tenta se conectar a um servidor externo
    2. O dispositivo NAT converte o IP/porta de origem em um IP/porta público (SNAT)
    3. 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:
    1. Comunicação do Pod para fora do cluster: converte o IP interno do Pod para o IP público do nó
    2. 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 if contribuiu 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:
    1. Comunicação do Pod para fora do cluster: converte o IP privado do Pod para o IP público do nó (SNAT)
    2. 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

 
ethanhur 2025-04-14

Obrigado por compartilhar essa ótima experiência!