Выпуск Cilium 1.0, сетевой системы для Linux-контейнеров, основанной на BPF
7 мая 2018 года
Опубликован первый значительный релиз проекта Cilium, в рамках которого подготовлена система для обеспечения сетевого взаимодействия и применения политик безопасности для изолированных контейнеров и процессов. Ключевой особенностью Cilium является использование еBPF (Berkeley Packet Filter) и XDP (eXpress Data Path) для разграничения сетевого доступа. Исходные тексты компонентов, работающих на уровне пользователя, написаны на языке Go и распространяются под лицензией Apache 2.0. Загружаемые в ядро Linux сценарии BPF доступны под лицензией GPLv2.
Изначально Cilium был разработан компанией Google, но затем преобразован в независимый проект, развиваемый сообществом. Помимо Google в разработке Cilium принимают участие такие компании, как Facebook, Netflix и Red Hat. Выпуск Cilium 1.0 обусловлен полной стабилизацией API, обеспечением длительной поддержки (LTS) и признанием проекта готовым для промышленного применения.
Основу Cilium составляет фоновый процесс, который работает в пространстве пользователя и выполняет работу по генерированию и компилированию BPF-программ, а также взаимодействия с runtime, обеспечивающим работу контейнеров. В форме BPF-программ реализованы системы обеспечения связности контейнеров, интеграции с сетевой подсистемой (физические и виртуальные сети, VXLAN, Geneve) и балансировки нагрузки. Фоновый процесс дополняют управляющий cli-интерфейс, репозиторий правил доступа, система мониторинга и модули интеграции CNI и CMM с поддержкой Kubernetes, Mesos и Docker.
Особенности Cilium:
- Упрощённая сетевая модель: каждому контейнеру назначается адрес IPv6 (опционально IPv4), все контейнеры соединены с одним общим виртуальным сетевым пространством с изоляцией через систему меток, привязанных к контейнерам. На базе меток могут выделяться сегменты сети и вводиться дополнительные правила доступа. IPv6 выбран в качестве основной модели адресации с поддержкой IPv4 для обеспечения обратной совместимости. Сеть может быть настроена в двух режимах: Overlay/VXLAN и Direct Routing.
- Расширяемость: пользователи могут дополнить или адаптировать для своих нужд любой аспект работы BPF-программ. Возможности перенаправления и фильтрации пакетов не ограничиваются версией ядра и могут расширяться добавлением новых типов статистики, не поддерживаемых ядром, новыми обработчиками протоколов, внесением изменений в методы отслеживания соединений, реализацией дополнительной логики перенаправления пакетов;
- Возможность внесения изменений и исправлений в компоненты, отвечающие за обработку и перенаправление пакетов, без перезагрузки ядра, без разрыва установленных соединений и без остановки работающих контейнеров;
- Интеграция эффективной системы мониторинга, которая может включаться по необходимости во время работы и позволяет отслеживать сетевую активность контейнеров в условиях высокой сетевой нагрузки без внесения задержек при обработке соединений. Кроме IP-адресов отображаются дополнительные метаданные, такие как метки контейнеров и имена сервисов. Система также позволяет производить инспектирование на уровне вызовов API. Постоянно отслеживается связность между узлами кластера и величина задержек при выполнении сетевых операций, что позволяет оперативно выявлять сбои узлов и сетевые проблемы. Также собираются метрики, имеющие отношение к производительности и состоянию сервисов;
- Все компоненты Cilium могут применяться в полностью распределённом окружении, формируя общую виртуальную сеть для кластера. Демон, управляющие прослойки и генерируемые BPF-приложения могут выполняться на разных узлах. В будущем планируется предоставить средства для объединения разных кластеров без применения сложных прокси-сервисов;
- Обеспечение сетевой безопасности как на уровне пакетов, так и на уровне API: возможности по фильтрации трафика комбинируются с авторизацией на уровне API, что позволяет обеспечить защиту и для традиционных внедрений и для систем на базе архитектуры микросервисов (микросервисы взаимодействуют через API с идентификацией не по IP, а по именам сервисов, Cilium позволяет избавиться от дополнительных прокси);
- Применение идентификации: вместо разграничения на основе исходных IP-адресов в Cilium применяется система меток, точно идентифицирующих каждый сетевой пакет (позволяет отследить привязку к контейнеру и сервису). Дополнительно поддерживается и традиционная система контроля доступа на основе правил, отталкивающихся от IP-адресов и подсетей. По возможности в Cilium используется дополнительный уровень абстракции, позволяющий избежать привязки к жестко заданным IP в пользу использования имён сервисов в правилах доступа;
- Распределённая и масштабируемая система балансировки нагрузки, использующая BPF для организации связи между сервисами. Поддерживается балансировка round-robin с учётом весовых коэффициентов и функция хэширования потоков. Эффективность работы балансировщика не зависит от числа сервисов. Балансировщик может быть настроен в форме Kubernetes Service Implementation (альтернатива kube-proxy, все сервисы Kubernetes ClusterIP автоматически реализуются в форме BPF) или с управлением через API (возможность прямой настройки параметров балансировщика);
- Высокая производительность. JIT-компилятор позволяет добиться эффективного выполнения BPF-программ. Для каждого контейнера генерируются отдельные программы BPF, обеспечивающие только необходимую функциональность, что позволяет уменьшить размер выполняемого кода.
При организации перенаправления трафика между большим числом сервисов iptables становится узким местом в производительности (из-за необходимости перебора правил при 5000 сервисов производительность падает на 30%, а при 10000 - на 80%, обновление правил для 5000 сервисов занимает 11 минут). Cilium сводит обновление правил к уровню O(1), при котором производительность не зависит от числа записей. Благодаря хэшированию время поиска и применения правил всегда постоянно и не зависит от числа сервисов. Замена традиционного IPVS в балансировщике нагрузки Facebook на решение на базе BPF и XDP позволило поднять производительность в 10 раз. Применение механизма Sockmap в BPF также позволяет ускорить выполнение операций редиректа запросов, которые в среднем по сравнению с iptables выполняются в 2 раза быстрее.
eBPF представляет собой встроенный в ядро Linux интерпретатор байткода, позволяющий создавать обработчики сетевых операций, контролировать доступ и отслеживать работу систем, в том числе BPF-программы могут применяться для низкоуровневой обработки входящих/исходящих пакетов, принятия решений о перенаправлении пакетов, перехвата системных вызовов, контроля доступа и использования kprobes. XDP предоставляет средства для запуска BPF-программ на уровне сетевого драйвера, с возможностью прямого доступа к DMA-буферу пакетов, что позволяет создавать высокопроизводительные обработчики для работы в условиях большой сетевой нагрузки.
Программы для eBPF могут определяться на подмножестве языка C, компилироваться при помощи специального бэкенда LLVM и загружаться в ядро. Перед выполнением интерпретатор eBPF проверяет байткод на предмет применения разрешённых инструкций и налагает определённые правила на код (например, отсутствие циклов). Благодаря применению JIT-компиляции, байткод на лету транслируется в машинные инструкции и выполняется с производительностью нативного кода. При помощи программ BPF в Cilium реализованы такие возможности, как NAT64, балансировщики для сетевых уровней L3/L4, механизм отслеживания соединений, система маппинга сетевых портов, средства управления доступом, обработчики запросов NDisc и ARP, инкапсуляция пакетов через VXLAN, Geneve и GRE.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.