O que é eBPF?

Mulher usando um tablet digital para entrar em um data center

Autores

Chrystal R. China

Staff Writer, Automation & ITOps

IBM Think

Michael Goodwin

Staff Editor, Automation & ITOps

IBM Think

O que é eBPF?

O eBPF é uma tecnologia de programação orientada a eventos que permite aos desenvolvedores escrever programas eficientes, seguros e não intrusivos executados diretamente no espaço do kernel do sistema operacional Linux (SO), efetivamente "estendendo" o kernel do sistema operacional.

O kernel de um sistema operacional é uma entidade extremamente e intencionalmente estável. Ele é compatível com todo o sistema operacional; portanto, por padrão, pode ser complicado e trabalhoso alterar ou modificar. Os eBPFs lidam com esse desafio de extensibilidade, permitindo que os desenvolvedores executem programas em áreas restritas em contextos privilegiados, como um kernel de sistema operacional.

A stack do sistema operacional pode ser dividida em três camadas lógicas: a camada de hardware, a camada do kernel e a camada do usuário. A camada do kernel é o núcleo de um sistema operacional. Ela fica entre a camada física, que abriga todos os componentes físicos de hardware, memória e armazenamento de um sistema operacional, e a camada de usuário, que abriga os navegadores da web e as aplicações em um sistema operacional.

Os aplicativos e navegadores no espaço do usuário devem se comunicar com os componentes da camada física para concluir suas respectivas tarefas, mas cada componente da camada física tem protocolos de comunicação e requisitos de compatibilidade específicos. É aqui que a camada do kernel (ou espaço do kernel) entra em cena. Ele interpreta chamadas do sistema e permite que as aplicações se comuniquem de forma eficaz com os componentes físicos da rede.

As ferramentas eBPF ajudam os desenvolvedores a expandir mais facilmente as funcionalidades do software existente em tempo de execução sem modificar o código-fonte do kernel, carregar módulos do kernel (partes de código carregáveis que podem estender as funções do kernel) ou interromper o espaço do kernel.

As tecnologias eBPF representam uma evolução do Berkeley Packet Filter (BPF) original, que proporcionou uma maneira simples de selecionar e analisar pacotes de rede em um programa no espaço do usuário. Porém, além da filtragem de pacotes, os programas BPF não tinham a flexibilidade necessária para lidar com tarefas mais complexas dentro do kernel.

Reconhecendo a necessidade de uma tecnologia mais versátil, a comunidade Linux desenvolveu o eBPF, baseada nas funcionalidades de back-end do BPF, mas ampliou sua capacidade de programação no kernel. As funcionalidades avançadas dos programas eBPF (e sua abordagem de área de testes) permitem que os desenvolvedores implementem processos aprimorados de filtragem de pacotes, melhorem a observabilidade do espaço do kernel e os recursos de monitoramento, conduzam análises de desempenho de ponta e apliquem políticas de segurança em nível de kernel em data centers no local e em ambientes nativos da nuvem.

O que é EBPF

Componentes de programas eBPF

Os principais componentes de um programa eBPF são:

Bytecode eBPF

Os programas eBPF são inicialmente escritos em um subconjunto C restrito e depois compilados em bytecode eBPF usando ferramentas como LLVM, que serve como arquitetura back-end do eBPF para linguagens de programação front-end (Clang, por exemplo). O bytecode é essencialmente um conjunto de instruções que aderem à arquitetura do conjunto de instruções eBPF e evitam erros de tempo de execução.

Interpretador eBPF/compilador JIT

A tecnologia do kernel Linux pode converter bytecode eBPF em ações executáveis, mas os compiladores just-in-time (JIT) oferecem desempenho superior. Os compiladores JIT podem converter bytecode em código de máquina nativo para plataformas de hardware específicas, conforme necessário.

Carregador de espaço do usuário

Os carregadores de espaço de usuário são programas no espaço de usuário que carregam o bytecode eBPF no kernel, anexando-o aos ganchos apropriados e gerenciando quaisquer mapas eBPF associados. Exemplos de carregadores de espaço de usuário incluem ferramentas como BPF Compiler Collection (BCC) e bpftrace.

Mapas eBPF

Os mapas eBPF são estruturas de dados com pares de valores-chave e acesso de leitura e escrita que oferecem espaço de armazenamento compartilhado e facilitam a interação entre programas de kernel eBPF e aplicações de espaço de usuário. Criado e gerenciado por meio de chamadas de sistema, os mapas eBPF também podem ser usados para manter o estado entre diferentes iterações dos programas eBPF.

Verificador ePPF

O verificador—um componente crítico dos sistemas eBPF—verifica o bytecode antes de ser carregado no kernel para garantir que o programa não contenha operações prejudiciais, como loops infinitos, instruções ilegais ou acesso à memória fora dos limites. Também ajuda a garantir que todos os caminhos de dados do programa terminem com êxito.

Ganchos ePPF

Ganchos são pontos no código do núcleo onde os programas eBPF podem ser anexados. Quando o kernel atinge um gancho, ele executa o programa eBPF anexado.

Diferentes tipos de ganchos, como tracepoints, kprobes, uprobes e filas de recebimento de pacotes de rede, dão aos programas eBPF amplo acesso a dados e permitem que eles concluam várias operações. Os tracepoints, por exemplo, permitem que programas inspecionem e coletem dados sobre o kernel ou outros processos, enquanto os ganchos de controle de tráfego podem ser usados para inspecionar e modificar pacotes de rede. E kprobes e uprobes facilitam o rastreamento dinâmico no nível do kernel e no nível do usuário.

Caminhos de dados expressos (XDPs)

XDPs são caminhos de dados de alto desempenho que aceleram o processamento de pacotes no nível da motivação e facilitam a transferência entre camadas de comunicação. Eles permitem que os sistemas eBPF tomem decisões de roteamento de dados antes mesmo que os pacotes de dados cheguem ao kernel.

A integração dos XDPs com o kernel Linux (em meados da década de 2010) acabou permitindo que desenvolvedores implementar funções de balanceamento de carga baseadas em eBPF, capazes de gerenciar tráfego de dados até mesmo nos data center mais movimentados.

Funções auxiliares

Como os eBPFs não podem gerar funções arbitrárias e devem manter a compatibilidade com todas as versões possíveis do kernel, às vezes os conjuntos de instruções eBPF básicos não têm nuances suficientes para executar operações avançadas. As funções auxiliares preenchem essa lacuna.

Funções auxiliares — conjuntos de funções de kernel predefinidas baseadas emAPI que os eBPFs podem chamar de dentro do sistema — fornecem uma maneira para os programas eBPF concluírem operações mais complexas (como obter a hora e data atuais ou gerar números aleatórios) que não são diretamente compatíveis com o conjunto de instruções.

Projeto 3D de bolas rolando em uma pista

As últimas notícias e insights sobre IA 


Descubra insights selecionados por especialistas e notícias sobre IA, nuvem e outros assuntos no boletim informativo semanal Think. 

Como funciona o eBPF?

Geralmente, os eBPFs operam como máquinas virtuais (VMs) dentro do kernel do Linux, trabalhando em uma arquitetura de conjunto de instruções de baixo nível e executando o bytecode do eBPF. No entanto, o complexo processo de execução de um programa eBPF tende a seguir algumas etapas principais.

Primeiro, os desenvolvedores escrevem o programa eBPF e compilam o bytecode. A finalidade do programa ditará o tipo apropriado de código. Por exemplo, se uma equipe quiser monitorar o uso da CPU, escreverá um código contendo funções para capturar métricas de uso.

Depois que o compilador eBPF converte o código C de alto nível em bytecode de nível inferior, um carregador de espaço do usuário gera uma chamada de sistema BPF para carregar o programa no kernel. O carregador também é responsável por lidar com erros e configurar qualquer mapa de eBPF de que o programa precisar.

Com o bytecode e os mapas do programa prontos, o eBPF executará um processo de verificação para confirmar que o programa é seguro para execução no kernel. Se for considerado inseguro, a chamada do sistema para carregar o programa falhará e o programa carregador receberá uma mensagem de erro. Se o programa passar na verificação, poderá ser executado.

Usando um intérprete ou um compilador JIT, o eBPF converterá o bytecode em código de máquina praticável. No entanto, o eBPF é uma tecnologia baseada em eventos, portanto, é executada em resposta a pontos de gancho ou eventos específicos dentro do kernel (chamadas de sistema, eventos de rede, iniciação de processo, ociosidade da CPU, por exemplo). Quando ocorre um evento, o eBPF executa o programa bytecode correspondente, permitindo que os desenvolvedores inspecionem e manipulem vários componentes do sistema.

Quando o programa eBPF estiver em execução, os desenvolvedores poderão interagir com ele a partir do espaço do usuário usando mapas eBPF. Por exemplo, a aplicação pode verificar periodicamente um mapa para coletar dados do programa eBPF, ou pode atualizar um mapa para alterar o comportamento do programa.

Descarregar o programa é a etapa final da maioria dos processos de execução do eBPF. Quando o eBPF fez seu trabalho, o carregador pode usar a chamada do sistema BPF novamente para descarregá-lo do kernel, quando então o eBPF encerra a execução e libera seus recursos associados. O processo de descarregamento também pode incluir iterações sobre quaisquer mapas eBPF de que a equipe não precise mais liberar elementos individuais úteis e, em seguida, excluir o próprio mapa (usando a chamada de sistema “delete”).

IBM Power

Modernize e automatize com IBM Power

Joe Cropper, IBM Master Inventor, STSM, IBM Power Hybrid Cloud Platform, apresenta uma demonstração de como o IBM Power pode ajudar a modernizar suas aplicações.

eBPF versus BPF

O Berkeley Packet Filter (BPF) foi originalmente desenvolvido como um mecanismo para filtragem de pacotes em sistemas baseados em Unix, permitindo que o código em nível de usuário defina filtros que possam capturar e processar com eficiência pacotes de rede dentro do kernel. Portanto, essa abordagem minimizou o poder de processamento necessário para transferir dados desnecessários para o espaço do usuário e pode agilizar e otimizar a rede de computadores.

O BPF usa um agente de kernel para processar pacotes no ponto de entrada da stack de rede. Depois que um programa BPF é desenvolvido, ele é carregado no espaço do kernel por um agente do kernel BPF, que verifica sua precisão antes de anexá-lo ao soquete relevante. Consequentemente, no espaço do usuário, apenas os pacotes que correspondem ao filtro do programa BPF podem receber dados de um determinado soquete. Essa funcionalidade de proteção limita o acesso de um programa às áreas de memória permitidas e evita possíveis falhas do kernel.

O eBPF surgiu pela primeira vez em 2014, quando representou uma evolução significativa do conceito original do BPF. Além dos casos de uso de rede originais, as aplicações eBPF foram ampliadas para incluir chamadas de sistema e outras funções, e é por isso que os desenvolvedores muitas vezes se referem a ele como o "Filtro de Berkeley Packet totalmente estendido".

Uma das principais áreas onde o eBPF se destaca é o monitoramento de desempenho da rede. Ela permite que as equipes de TI realizem análises e solução de problemas em tempo real, fornecendo insights granulares sobre o comportamento da rede, métricas de desempenho e gargalos. O eBPF desempenha um papel fundamental na segurança da rede, monitorando e filtrando chamadas do sistema e atividades de rede, aplicando políticas de segurança de rede e detectando anomalias do sistema.

O eBPF também oferece aos desenvolvedores uma ferramenta valiosa para rastrear e criar perfis de aplicação de kernel e de espaço do usuário e executar ações personalizadas e transformação de dados à medida que os dados atravessam o kernel, aumentando ainda mais sua versatilidade e utilidade. Devido a esses amplos recursos (que vão muito além da filtragem de pacotes), o eBPF agora é reconhecido como um termo autônomo, em vez de um acrônimo para Berkeley Packet Filter estendido.

Os avanços na tecnologia eBPF levaram os desenvolvedores de software a expandir suas aplicações para todos os sistemas operacionais, permitindo que plataformas não baseadas em Linux aproveitem os recursos sofisticados de rastreamento, rede e monitoramento do eBPF.1

Na verdade, a Fundação eBPF — uma extensão da Linux Foundation cujos membros incluem Google, Meta, Netflix, Microsoft, Intel e Isovalent, entre outros — investiu fortemente na expansão da compatibilidade de sistemas operacionais para programas eBPF, com a finalidade final de ampliar a utilidade da programação eBPF.2

Embora o BPF tenha estabelecido as bases para uma filtragem eficiente de pacotes, o eBPF inegavelmente expandiu seu escopo. Os eBPFs modernos fornecem uma ferramenta abrangente para observabilidade, desempenho e segurança otimizados em sistemas Linux. Sua capacidade de executar programas dinâmicos definidos pelo usuário dentro do kernel cria novas possibilidades para monitoramento e gerenciamento do sistema, tornando o eBPF uma ferramenta indispensável para desenvolvedores de software e programadores de computador.

Casos de uso e benefícios do eBPF

As tecnologias eBPF já se tornaram uma pedra angular dos sistemas Linux modernos, permitindo o controle refinado do kernel do Linux e capacitando as empresas a construir programas mais inovadores dentro do ecossistema do Linux.

O eBPF facilitou os avanços em:

Rede e filtragem de rede

O eBPF permite que os desenvolvedores instalem funcionalidades de processamento de pacotes mais rápidos e personalizados, processos de balanceamento de carga, scripts de criação de perfil de aplicação e práticas de monitoramento de rede. Plataformas de código aberto, como o Cilium, implementam o eBPF para fornecer redes seguras, Escalável e observáveis para clusters e cargas de trabalhodo Kubernetes, bem como outros microsserviço conteinerizados.

O eBPF também ajuda as equipes de TI a impor regras simples e complexas no início do caminho de eventos para roteamento de tráfego mais eficaz, filtragem de conteúdo e prevenção de perdas. Usando a lógica de encaminhamento de pacotes no nível do kernel, os eBPFs podem minimizar a latência, otimizar os processos de roteamento e permitir uma resposta geral mais rápida da rede.

Observabilidade

À medida que os aplicativos são divididos em microsserviços, a observabilidade no espaço do usuário pode se tornar desafiadora. Os eBPFs oferecem às ferramentas de monitoramento um ponto de vista do espaço do kernel para que a observabilidade permaneça intacta de ponta a ponta.

Os eBPFs permitem que os desenvolvedores instrumentem o kernel e as aplicações de espaço do usuário para coletar dados e métricas de desempenho detalhados sem afetar significativamente o desempenho do sistema. Esses recursos ajudam as organizações a se manterem à frente, permitindo o monitoramento em tempo real e a observabilidade de cada componente de rede (e suas dependências).

Monitoramento em tempo real

Os eBPFs podem monitorar chamadas do sistema, tráfego de rede e comportamento do sistema nos níveis do kernel e do soquete para detectar e responder a possíveis ameaças à segurança em tempo real. A Falco (uma ferramenta de segurança em tempo de execução nativa da nuvem), por exemplo, usa o eBPF para implementar auditoria de segurança em tempo de execução e resposta a incidentes, aprimorando a segurança geral do sistema.

Ajuste de desempenho

Muitas ferramentas de eBPF podem rastrear chamadas do sistema, monitorar o uso da CPU e rastrear o uso de recursos (E/S de disco, por exemplo). Essas funcionalidades podem ajudar os desenvolvedores a investigar com mais facilidade os gargalos no desempenho do sistema, implementar protocolos de depuração e identificar oportunidades de otimização.

Políticas de segurança

Os eBPFs podem instalar e aplicar políticas de segurança em nível de kernel (filtros de tráfego de rede, firewalls e restrições de comportamento, por exemplo) e verificações de segurança para evitar que agentes mal-intencionados e usuários não autorizados acessem a rede.

eBPF em arquiteturas de microsserviços

Em uma arquitetura de microsserviços, a visibilidade das cargas de trabalho de produção dentro do contêiner é vital. No entanto, as ferramentas tradicionais de observabilidade podem ter dificuldades para acompanhar o ritmo dos microsserviços conteinerizados.

Os contêineres são efêmeros por design; eles são criados quando necessários e destruídos assim que cumpriram seu propósito. Cada contêiner atua como um host individual e, em um ambiente de produção, o grande volume de métricas que eles criam pode facilmente sobrecarregar as ferramentas padrão de monitoramento de aplicativos, redes e monitoramento de infraestrutura. Máquinas virtuais podem se comportar de forma semelhante, mas a natureza de ciclagem rápida dos contêineres pode complicar a captura de telemetria.

Além disso, os contêineres costumam ser implementar em grande número em ambientes de nuvem, tornando a visibilidade ainda mais desafiadora.

O eBPF, que é executado no nível do kernel de um host ou contêiner, permite que os desenvolvedores coletem telemetria de entidades de dados de curta duração. Ele ajuda a integrar a visibilidade da rede, da aplicação e da infraestrutura em um serviço unificado baseado em eBPF. Com o eBPF, os desenvolvedores podem capturar dados sobre processos, uso de memória, atividade de rede e acesso a arquivos no nível do contêiner, mesmo que os contêineres não estejam implementados na nuvem.

eBPF e Kubernetes

Da mesma forma, em ambientes conteinerizados baseados em Kubernetes, o eBPF usa uma única interface e conjunto de ferramentas para coletar dados de clusters díspares, para que as equipes de TI não precisem implementar agentes de espaço de usuário individuais para concluir tarefas de coleta de dados em toda a rede. As ferramentas de eBPF podem ser executadas em nós do plano de controle (para monitoramento de servidor de API, por exemplo) e monitorar nós de trabalho para gerar insights, correlacionando pontos de dados e insights de ambos os tipos de nós para uma observabilidade de cluster ajustada.

Soluções relacionadas
IBM Red Hat OpenShift

O Red Hat OpenShift on IBM Cloud é uma plataforma de contêineres OpenShift (OCP) totalmente gerenciada.

Explore o Red Hat OpenShift
Soluções de armazenamento virtual para virtualização de servidores e desktop

Virtualização de armazenamento segura, confiável e eficiente para ambientes VMware com o IBM® Spectrum Virtualize.

Explore as soluções de armazenamento
Soluções de infraestrutura em nuvem

Encontre a solução ideal de infraestrutura em nuvem para as necessidades do seu negócio e expanda os recursos conforme a demanda.

Explore as soluções em nuvem
Dê o próximo passo

O Red Hat OpenShift on IBM Cloud é uma plataforma OpenShift Container Platform (OCP) totalmente gerenciada.

Explore o IBM Red Hat OpenShift Crie sua conta gratuita na IBM Cloud