← Назад к списку
Железо и софт • 06.06.2026

Cilium CNI выдает ошибку bpf_map_update_elem failed hash table full как исправить лимиты карт eBPF

Развернул сетевой плагин Cilium CNI на базе eBPF в крупном продакшен-кластере Kubernetes под управлением Linux. После масштабирования количества подов и сервисов до нескольких тысяч, трафик между узлами частично заблокировался, а в логи демона (`cilium-agent`) полетели критические ошибки ядра: «Failed to update eBPF map: argument list too long» или «bpf_map_update_elem failed: hash table full» со сбоем инициализации дескрипторов. При этом стандартные сетевые мосты Linux работают, но политики безопасности NetworkPolicy перестали применяться. Подскажите, из-за каких скрытых лимитов размера eBPF-карт (bpf maps) в ядре происходит этот ступор сетевого балансировщика и как правильно переписать параметры конфигурации в Helm-чарте для расширения лимитов?

Ответы (5)

Артем Сети
Привет! Ошибка "hash table full" в контексте Cilium — это классический аппаратный тупик подсистемы eBPF в ядре Linux. В отличие от старого iptables, Cilium компилирует сетевые правила напрямую в байт-код ядра и хранит информацию о маршрутах, балансировке (LB) и эндпоинтах в специальных хэш-таблицах фиксированного размера (eBPF maps). По умолчанию размеры этих карт (например, карты трассировки соединений сокетов `bpf_ct_limit` или карты эндпоинтов) жестко зажаты в конфигурации плагина ради экономии оперативной памяти ОЗУ. Когда количество динамических сетевых сессий в кластере Kubernetes превышает дефолтный лимит, ядро Linux физически запрещает записывать новые ключи в хэш-таблицу, намертво блокируя трафик подов.
Марина Девопс
Чтобы принудительно расширить емкость внутренних таблиц eBPF на всех нодах кластера и разблокировать обработку сетевых пакетов, обновите параметры вашего Helm-конфига по шагам:
1. Откройте ваш рабочий конфигурационный файл настроек `values.yaml`, который используется для деплоя сетевого плагина Cilium.
2. Найдите блок конфигурации параметров ядра. Если его нет, создайте корневой тег `bpf:`.
3. Пропишите увеличенные значения для таблицы отслеживания соединений (conntrack) и динамических эндпоинтов, подняв их с дефолтных лимитов:
`bpf:`
` ctMax: 524288`
` mapDynamicSizeRatio: 0.005`
4. Ниже найдите или добавьте параметры управления лимитами карты прокси-маршрутов и политик авторизации:
`bpfLBMapMax: 512000`
`bpfPolicyMapMax: 32768`
5. Сохраните документ и запустите принудительное обновление сетевого манифеста кластера через Helm-консоль: `helm upgrade cilium cilium/cilium --namespace kube-system -f values.yaml`. Агенты перезапустятся, перекомпилируют eBPF-программы, и ступор сокетов сети мгновенно исчезнет.
Дмитрий Сис
Ребята, если вы увеличили параметры `ctMax` в Helm, а логи `hash table full` продолжают намертво вешать поды, проверяйте системные лимиты блокировки памяти `memlock` на уровне самой хост-системы Linux. Каждая eBPF-карта резервирует под себя непрерывный кусок физической ОЗУ, который жестко блокируется в памяти ядра (pinned memory) в обход файла подкачки swap. Если на ваших bare-metal серверах лимит `ulimit -l` зажат на старых дефолтных значениях (например, 64 Кб), операционная система просто запретит агенту Cilium расширить дескрипторы хэш-таблиц. Выставляйте лимит `memlock` в положение `unlimited` в настройках systemd или конфигурации containerd.
Никита Облако
Если раздувание размеров таблиц упирается в дефицит ОЗУ на нодах, заставьте Cilium автоматически вычищать мертвые сетевые сокеты и старые записи при помощи встроенных алгоритмов по инструкции:
1. Откройте конфигурационный файл `values.yaml` для Helm-апгрейда Cilium.
2. В секцию глобальных настроек добавьте параметры оптимизации eBPF-маскарадинга и включите поддержку автоматического вытеснения записей по принципу наименьшей давности использования (LRU):
`bpf:`
` masquerade: true`
` tproxy: true`
3. Чтобы предотвратить лавинообразное засорение таблицы Conntrack короткими UDP-пакетами (например, частыми DNS-запросами от CoreDNS), принудительно уменьшите тайм-аут удержания неактивных UDP-портов в ядре: `conntrackInterval: 10s`.
4. Сохраните изменения в коде файла.
5. Примените конфигурацию командой обновления репозитория `helm upgrade`, это позволит удерживать заполнение хэш-таблиц в пределах безопасных 50-60%.
Роман Кьюб
Если лимиты переполнились внезапно на боевом кластере посреди ночи и сеть лежит, а времени на пересчет размеров карт нет, временно отключите встроенную систему глубокого мониторинга трафика Hubble. Модуль Hubble дублирует каждую сетевую сессию в отдельные eBPF-карты событий для генерации красивых графиков, ускоряя переполнение буферов в разы. Выполните быструю команду отключения флагов без полной переустановки: `helm upgrade cilium cilium/cilium --namespace kube-system --reuse-values --set hubble.enabled=false`. Сетевая подсистема мгновенно сбросит половину служебных таблиц, порты очистятся, и связь восстановится.

Ваш ответ