14.08.2022

BumbleBee — инструментарий для упрощения создания и распространения eBPF-программ

Компания Solo.io, развивающая продукты для обеспечения работы облачных систем, микросервисов, изолированных контейнеров и бессерверных вычислений, опубликовала открытый инструментарий BumbleBee, нацеленный на упрощение подготовки, распространения и запуска eBPF-программ, выполняемых в специальной виртуальной машине внутри ядра Linux и позволяющих обрабатывать сетевые операции, контролировать доступ и отслеживать работу систем. Код написан на языке Go и распространяется под лицензией Apache 2.0.

BumbleBee даёт возможность упаковать eBPF-программу в виде образа контейнера в формате OCI (Open Container Initiative), который можно запускать на любых системах без перекомпиляции и использования дополнительных компонентов в пространстве пользователя. Взаимодействие с eBPF-кодом в ядре, в том числе обработку поступающих из eBPF-обработчика данных, берёт на себя BumbleBee, который автоматически экспортирует эти данные в виде метрик, гистограмм или логов, доступ к которым можно получить, например, при помощи утилиты curl. Предлагаемый подход позволяет разработчику сосредоточить внимание на написании кода eBPF и не отвлекаться на организацию взаимодействия с этим кодом из пространства пользователя, сборку и загрузку в ядро.

Для управления eBPF-программами предлагается работающая в стиле Docker утилита «bee», при помощи которой можно сразу загрузить интересующий eBPF-обработчик из внешнего репозитория и запустить на локальной системе. Инструментарий позволяет сгенерировать каркас кода на языке Си для eBPF-обработчиков выбранной тематики (в настоящее время поддерживаются только обработчики сетевых и файловых операций, перехватывающих вызовы сетевого стека и файловых систем). На основе сформированного каркаса разработчик может быстро реализовать интересующую его функциональность.

В отличие от BCC (BPF Compiler Collection) в BumbleBee не выполняется полная пересборка кода обработчика для каждой версии ядра Linux (BCC использует компиляцию на лету при помощи Clang при каждом запуске eBPF-программы). Для решения проблем с переносимостью развиваются инструментарии CO-RE и libbpf, позволяющие собирать код только один раз и использовать специальный универсальный загрузчик, адаптирующий загружаемую программу к текущему ядру и типам BTF (BPF Type Format). BumbleBee является надстройкой над libbpf и предоставляет дополнительные типы для автоматической интерпретации и отображения данных, размещаемых в штатных для eBPF map-структурах RingBuffer и HashMap.

Для сборки итоговой eBPF-программы и сохранения в виде OCI-образа достаточно выполнить команду «bee build файл_с_кодом имя:версия«, а для запуска команду «bee run имя:версия». По умолчанию получаемые от обработчика события будут выводиться в окно терминала, но при необходимости можно получить данные обратившись утилитами curl или wget к привязанному к обработчику сетевому порту.
Обработчики можно распространять через OCI-совместимые репозитории, например, для запуска внешнего обработчика из репозитория ghcr.io (GitHub Container Registry) можно выполнить команду «bee run ghcr.io/solo-io/bumblebee/tcpconnect:$(bee version)«. Для помещения обработчика в репозиторий предлагается команда «bee push», а для привязки версии — «bee tag».

Источник.