Google представил Cilium, сетевую систему для Linux-контейнеров, основанную на BPF

2016-11-03

Компания Google представила проект Cilium, в рамках которого подготовлена система для обеспечения сетевого взаимодействия и применения политик безопасности для изолированных контейнеров, основанная на применении загружаемых в ядро Linux программ eBPF, генерируемых на лету. Проект создан в результате эксперимента по применению для контейнерной изоляции новых технологий ядра Linux, таких как BPF (Berkeley Packet Filter) и XDP (eXpress Data Path). Исходные тексты компонентов, работающих на уровне пользователя, написаны на языке Go и распространяются под лицензией Apache 2.0. Загружаемые в ядро Linux сценарии BPF доступны под лицензией GPLv2.

Cilium состоит из специализированного фонового процесса, набора BPF-программ и модулей интеграции. Фоновый процесс работает в пространстве пользователя и выполняет работу по генерированию и компилированию BPF-программ, а также взаимодействует с runtime, обеспечивающим работу контейнеров. В форме BPF-программ реализованы системы обеспечения связности контейнеров, интеграции с сетевой подсистемой (физические и виртуальные сети, VXLAN, Geneve) и балансировки нагрузки. Модули интеграции предоставляются для CNI, Kubernetes и Docker.

eBPF представляет собой встроенный в ядро Linux интерпретатор байткода, позволяющий создавать обработчики сетевых операций, контролировать доступ и отслеживать работу систем, в том числе BPF-программы могут применяться для низкоуровневой обработки входящих/исходящих пакетов, принятия решений о перенаправлении пакетов, перехвата системных вызовов, контроля доступа и использования kprobes. XDP предоставляет средства для запуска BPF-программ на уровне сетевого драйвера, с возможностью прямого доступа к DMA-буферу пакетов, что позволяет создавать высокопроизводительные обработчики для работы в условиях большой сетевой нагрузки.

Программы для eBPF могут определяться на подмножестве языка C, компилироваться при помощи специального бэкенда LLVM и загружаться в ядро. Перед выполнением интерпретатор eBPF проверяет байткод на предмет применения разрешённых инструкций и налагает определённые правила на код (например, отсутствие циклов). Благодаря применению JIT-компиляции, байткод на лету транслируется в машинные инструкции и выполняется с производительностью нативного кода. При помощи программ BPF в Cilium реализованы такие возможности, как NAT64, балансировщики для сетевых уровней L3/L4, механизм отслеживания соединений, система маппинга сетевых портов, средства управления доступом, обработчики запросов NDisc и ARP, инкапсуляция пакетов через VXLAN, Geneve и GRE.

Из преимуществ применения Cilium для контейнерной изоляции отмечается:

  • Простота: каждому контейнеру назначен адрес IPv6 (опционально IPv4), все контейнеры соединены с одним общим виртуальным сетевым пространством с изоляцией через систему меток, привязанных к контейнерам. IPv6 выбран в качестве основной модели адресации с поддержкой IPv4 для обеспечения обратной совместимости;
  • Расширяемость: пользователи могут дополнить или адаптировать для своих нужд любой аспект работы BPF-программ. Возможности перенаправления и фильтрации пакетов не ограничиваются версией ядра и могут расширяться добавлением новых типов статистики, не поддерживаемых ядром, новыми обработчиками протоколов, внесением изменений в методы отслеживания соединений, реализацией дополнительной логики перенаправления пакетов;
  • Высокая производительность: JIT-компилятор позволяет добиться эффективного выполнения BPF-программ. Для каждого контейнера генерируются отдельные программы BPF, обеспечивающие только необходимую функциональность, что позволяет уменьшить размер выполняемого кода;
  • Возможность внесения изменений и исправлений в компоненты, отвечающие за обработку и перенаправление пакетов, без перезагрузки ядра, без разрыва установленных соединений и без остановки работающих контейнеров;
  • Интеграция эффективной системы мониторинга, которая может включаться по необходимости во время работы. Возможность отслеживать сетевую активность контейнеров в условиях высокой сетевой нагрузки без внесения задержек при обработке соединений.