A engenharia de plataforma está se tornando um conceito atraente para as empresas, à medida que elas dedicam quantidades cada vez maiores de recursos ao desenvolvimento de aplicativos nativos da nuvem. Não importa se você está usando suas próprias instâncias do Kubernetes em seus data centers ou trabalhando com ambientes gerenciados em nuvens públicas, você precisará entender como elas estão operando, aproveitando uma nova geração de observabilidade e ferramentas de segurança.

Ferramentas de orquestração de contêineres como o Kubernetes são difíceis de gerenciar usando ferramentas tradicionais. À medida que instanciam novos contentores com base na utilização de recursos ou em resposta a eventos, o seu comportamento não é previsível. Se você estiver usando uma ferramenta de monitoramento baseada em agente, os agentes precisarão se registrar nas ferramentas de monitoramento quando os contêineres forem inicializados e cancelar o registro quando os contêineres pararem. O processo acrescenta complexidade às ferramentas e é difícil usar os dados resultantes para obter uma análise completa da causa raiz ou para rastrear uma atividade anômala.

Existem conceitos nativos da nuvem que ajudam, como a observabilidade, mas está ficando claro que precisamos de uma maneira de sair do ambiente de orquestração e, ao mesmo tempo, monitorar suas operações de computação e rede. Com contêineres hospedados por hipervisores modernos ou por daemons de contêiner de baixo nível, precisamos de uma forma de monitoramento de sistemas de nível inferior.

Vendo de dentro do kernel Linux

No passado, isso envolveria trabalhar com código em nível de kernel, adicionar módulos de kernel próprios ou de terceiros e recompilar o kernel do Linux cada vez que uma nova ferramenta ou atualização aparecesse. Se você já compilou o Linux do zero ou escreveu um módulo do kernel, sabe que não é uma tarefa fácil – e muitas vezes é extremamente demorada. Se estiver usando uma imagem pronta para execução de um provedor de nuvem, é improvável que você tenha as permissões ou o acesso necessários.

Felizmente, temos uma opção que evita toda essa complexidade, dando-nos acesso controlado às operações do kernel, na forma de eBPF, filtros de pacotes Berkeley estendidos. Com o eBPF podemos injetar código no kernel Linux (e Windows), usando um verificador para garantir a segurança. Hooks no kernel geram eventos que acionam programas eBPF, permitindo acesso à rede e outras operações de baixo nível.

Essa abordagem permite que ferramentas de monitoramento obtenham dados sobre as operações do ambiente hospedado do Kubernetes, rastreando as principais operações e permitindo que aplicativos externos como Prometheus, Cilium e Retina registrem os dados, vinculando-os a contêineres individuais e aos aplicativos orquestrados pelo Kubernetes. . Com suporte ao eBPF no kernel Linux, você pode usá-lo para monitorar não apenas instâncias físicas em seu próprio hardware, mas também hosts de máquinas virtuais em um serviço de nuvem.

Apresentando o Inspetor

A subsidiária da Microsoft, Kinvolk, é mais conhecida por sua distribuição Flatcar Linux, mas está rapidamente se tornando um dos centros de excelência de código aberto da Microsoft. Enquanto o Deis Labs se concentra no desenvolvimento nativo da nuvem, o Kinvolk está mais alinhado com a engenharia e operações da plataforma, fornecendo ferramentas como a UI Headlamp Kubernetes. Nos últimos cinco anos, Kinvolk tem trabalhado em um conjunto de ferramentas de monitoramento e captura de eBPF, agrupadas como um conjunto de “gadgets” de kernel com gerenciamento de espaço de usuário e serviços de exibição.

Nomeado em homenagem ao detetive francês parcialmente robô, o projeto Inspektor Gadget oferece um conjunto crescente de gadgets, bem como uma estrutura para desenvolver o seu próprio. A combinação de gadgets varia de ferramentas que auditam suas configurações do Kubernetes até outras que capturam informações de desempenho sobre seu cluster, seja para criação de perfil ou para análise em tempo real. O conjunto mais útil permite rastrear uma série de métricas importantes, incluindo operações de rede de baixo nível. Seu problema pode não ser DNS, mas o Inspektor Gadget pode ajudá-lo a provar que não é.

Embora ferramentas como Falco e Retina sejam destinadas a observações de longo prazo de uma infraestrutura Kubernetes, uma instalação autônoma do Inspektor Gadget é mais útil para investigações e explorações ad hoc. Isso não é uma coisa ruim. Os engenheiros de plataforma precisam de ferramentas que possam ser usadas rapidamente para diagnosticar problemas específicos, sem precisar investir tempo na instalação e configuração de uma solução completa de observabilidade.

Com o Inspektor Gadget, você pode obter as informações necessárias para mostrar o que está errado e por quê, e então explorar possíveis causas, tudo na linha de comando do Kubernetes. Os dados que você recebe, embora de baixo nível, estão associados a namespaces em seu cluster Kubernetes, permitindo isolar rapidamente pods e contêineres específicos.

Você pode usar o Inspektor Gadget sozinho ou por meio de uma ferramenta como o Microsoft Defender for Containers, que recentemente adicionou um componente de sensor que usa ferramentas do Inspektor Gadget para procurar ameaças como fugas de contêineres. Esses são alguns dos compromissos mais arriscados para o Kubernetes, pois permitem que códigos maliciosos quebrem o isolamento do contêiner e acessem o sistema operacional host. A Microsoft está usando o Inspektor Gadget para substituir as ferramentas do Defender for Containers que anteriormente eram alimentadas pelas sondas eBPF da Sysdig.

Executando o Inspektor Gadget em seu cluster

Começar a usar o Inspektor Gadget é bastante fácil. O kit de ferramentas instala um plug-in kubectl e um daemonset em seu cluster Kubernetes. Você pode usar a ferramenta de instalação krew para instalar as ferramentas kubectl ou instalá-las manualmente baixando um binário ou compilando o código-fonte e adicionando o executável resultante ao seu caminho.

Depois de instalar a ferramenta de linha de comando do gadget, você pode implantar o daemonset usando seu comando de implantação, criando um pod para seus gadgets e aplicando os controles de segurança apropriados. Você pode implantar o daemonset em todo o cluster ou em um nó ou nós específicos. Ele pode então ser configurado para iniciar junto com novos contêineres. Para desinstalar, basta usar o comando undeploy.

Você não precisa instalar o Inspektor Gadget no Kubernetes. Ele pode ser instalado como um aplicativo Linux em um servidor host, permitindo rastrear contêineres de fora do Kubernetes. Embora esta abordagem não seja adequada para Kubernetes hospedados na nuvem, ela pode ser útil para monitorar instalações experimentais e clusters locais.

Uma vez instalado, você pode usar os gadgets do Inspektor Gadget para instalar o código eBPF no kernel do sistema operacional host, anexando os gadgets a funções específicas do kernel. O código eBPF é executado quando syscalls específicos são feitos, permitindo que o gadget rastreie a operação.

Os resultados do rastreamento são gravados em buffers do kernel e, em seguida, lidos pelo código do gadget do espaço do usuário, exibindo dados transmitidos por meio da CLI do Kubernetes. Em segundo plano, um gerenciador rastreador monitora os vários gadgets em uso, com um mapa dos contêineres e namespaces aos quais estão associados, para que os dados sejam associados diretamente a um contêiner específico. Os resultados são filtrados por contêiner e por evento, proporcionando uma maneira de mergulhar rapidamente nos eventos que deseja monitorar.

O Inspektor Gadget fornece um gadget Prometheus que fornece métricas para uma instância do Prometheus, permitindo que elas sejam visualizadas com ferramentas como Grafana ou analisadas por outras ferramentas de gerenciamento do Kubernetes. O suporte para Prometheus permite que você execute gadgets em segundo plano, especialmente se você estiver usando rastreadores de rede ou ferramentas de criação de perfil para obter uma imagem do desempenho geral de um aplicativo e de um cluster, bem como da rede subjacente.

Estendendo os gadgets

De forma útil, o Inspektor Gadget pode funcionar com outros programas eBPF, adicionando informações adicionais a consultas básicas. Você pode escrever uma investigação eBPF simples para procurar um evento específico e, em seguida, chamar o Inspektor Gadget para adicionar detalhes do namespace de montagem atual ao log de eventos. Dessa forma, você pode adicionar código rapidamente para procurar novas vulnerabilidades críticas, permitindo passar esses dados para seu aplicativo de monitoramento por meio da CLI do Inspektor Gadget.

Ferramentas como o Inspektor Gadget são importantes para lidar com a natureza imprevisível dos aplicativos nativos da nuvem. Ao usar o eBPF, podemos nos aprofundar nas complexas malhas de rede e entender exatamente o que está acontecendo quando os contêineres se comunicam entre si, permitindo-nos construir a infraestrutura certa para nosso código. Há muito o que gostar aqui, tanto na forma como o Inspektor Gadget se integra com ferramentas familiares do Kubernetes quanto na forma como ele pode ser estendido com seus próprios gadgets para resolver seus próprios problemas.

À medida que o Kubernetes amadurece, é importante ter maneiras de ver o que acontece nos bastidores. Sem esses dados, não podemos ter certeza de que estamos entregando as arquiteturas de nível empresarial que são essenciais para dar suporte ao nosso código e aos nossos usuários. O eBPF e o Inspektor Gadget são uma forma importante de entregar essa maturidade, juntamente com ferramentas de observabilidade que nos permitem interpretar e analisar os dados e fornecer uma plataforma gerenciável nativa da nuvem.