Calico на Orange Pi не поднимается: как я упёрся в отсутствующие модули ядра и починил это пересборкой через orangepi-build
Я ставил Kubernetes на Orange Pi (orangepi4pro) и наивно ожидал, что Calico «просто заведётся». В реальности DaemonSet calico-node ушёл в перезапуски, readiness/liveness-пробы падали, а в событиях Kubernetes мелькали BIRD и Felix.
Сначала это выглядит как «какая-то проблема Calico/BGP», но причина оказалась куда прозаичнее: в установленном ядре банально нет нужных netfilter/ipset/ipip модулей.
Симптомы: CrashLoopBackOff, BIRD не готов, Felix не отвечает
Типичная картина в kubectl describe pod / событиях:
Back-off restarting failed container install-cni
Readiness probe failed: calico/node is not ready: BIRD is not ready: ... /var/run/bird/bird.ctl: no such file or directory
calico/node is not ready: felix is not ready: readiness probe reporting 503
Liveness probe failed: Felix is not live: ... dial tcp [::1]:9099: connect: connection refused
На этом этапе легко начать «лечить Calico»: менять манифесты, отключать BGP, ковырять iptables. Но прежде чем делать резкие движения, стоит проверить основу: есть ли в ядре то, на чём Calico обычно держится.
Почему это часто не Calico, а ядро
Calico (Felix + iptables/nft + ipset + туннели) активно использует функциональность ядра Linux. На некоторых сборках/дистрибутивах для ARM-плат (включая «вендорские» образы как у меня взятые с официального сайта Orange Pi) часть модулей может отсутствовать.
В моём случае система была:
/etc/os-release: Orange Pi 1.0.6 Jammy (Ubuntu 22.04)
uname -r: 5.15.147-sun60iw2
А в /lib/modules/ обнаружилось, что из ipset есть только базовый модуль, а «hash:*» и связанные компоненты отсутствуют.
Быстрая проверка: виноваты ли модули
На проблемной ноде выполните:
uname -r
sudo modprobe ip_set_hash_ip ip_set_hash_net xt_set ipip
Если увидите ошибки вида Module ... not found, то Calico, скорее всего, не починится «настройками» — ядру просто нечего загружать.
Дополнительно можно посмотреть, что реально лежит в дереве модулей:
ls /lib/modules/$(uname -r)/kernel/net/netfilter/ipset 2>/dev/null
ls /lib/modules/$(uname -r)/kernel/net/ipv4 2>/dev/null | grep -i ipip || true
Варианты решения
Дальше обычно два пути:
-
Вариант A: перейти на другое ядро/ОС (например, Armbian или другое «полное» ядро для вашей платы), где нужные модули уже включены.
-
Вариант B: пересобрать ядро (или хотя бы модули) с включением нужных опций.
Я пошёл по варианту B, потому что у меня уже был развёрнут orangepi-build и рядом лежали исходники/артефакты для ветки 6.6:
~/orangepi-build/kernel/orange-pi-6.6-sun60iw2
linux-6.6.98-sun60iw2_1.0.8_arm64.*
Пошагово: пересборка через orangepi-build (вариант B, «как для новичка»)
0) Сначала обезопасьтесь
Пересборка и установка ядра — риск. Минимум:
-
имейте доступ к консоли/серийному порту или способ восстановиться через SD/USB;
-
если нода уже в кластере и мешает — временно выведите её из планирования:
# на control-plane:
kubectl cordon orangepi4pro
# при необходимости:
kubectl drain orangepi4pro --ignore-daemonsets --delete-emptydir-data
1) Запускаем сборку
Перейдите в каталог сборки и запустите скрипт:
cd ~/orangepi-build
./build.sh
Если у вас другой входной скрипт (по README) — используйте его.
2) Выбираем, что собирать
В меню вида:
Compile image
rootfs
kernel
u-boot
выберите Kernel package. Это важно: build-система соберёт пакет(ы) (.deb), которые проще и безопаснее ставить, чем «вручную make install».
3) Включаем меню конфигурации ядра
На вопрос:
Select the kernel configuration
- Do not change the kernel configuration
- Show a kernel configuration menu before compilation
выберите Show a kernel configuration menu before compilation, чтобы попасть в menuconfig.
4) Выбираем ветку ядра
Если видите выбор current vs legacy, то в большинстве случаев берите current Recommended (особенно если вы уже видите, что у вас используются исходники ветки 6.6).
5) menuconfig: включаем нужные опции как модули
В menuconfig управление такое:
-
стрелки — перемещение,
Enter— зайти в раздел,Esc— назад; -
/— поиск по названию опции; -
M— собрать как модуль,Y— встроить в ядро.
Дальше удобнее всего нажимать / и по очереди искать/включать (ставить <M>):
-
CONFIG_IP_SET —
IP set support -
CONFIG_IP_SET_HASH_IP —
IP set type hash:ip -
CONFIG_IP_SET_HASH_NET —
IP set type hash:net -
CONFIG_NETFILTER_XT_SET —
"set" match support (xt_set) -
CONFIG_NET_IPIP —
IP: IPIP tunnel support
Где это обычно лежит (если полезнее идти «по дереву»):
-
ipip:
Networking support → Networking options → IP: tunneling → IPIP -
ipset:
Networking support → Networking options → Network packet filtering framework (Netfilter) → IP set support -
xt_set: рядом с Xtables/матчами Netfilter (часто в той же зоне, что iptables matches).
После изменений выйдите из menuconfig и согласитесь сохранить конфигурацию.
6) Дожидаемся сборки пакетов
Компиляция на ARM может занять долго. Дождитесь завершения сборки в orangepi-build.
7) Находим и ставим .deb пакеты ядра
Папки и названия могут отличаться, но обычно пакеты лежат в output/ или output/debs. Идея простая: найти .deb и поставить их через dpkg.
Пример:
cd ~/orangepi-build
ls output 2>/dev/null || true
ls output/debs 2>/dev/null || true
Дальше установка:
sudo dpkg -i *.deb
(либо перечислите конкретные файлы .deb, если в папке много лишнего).
8) Перезагрузка и контрольная проверка
Перезагрузитесь:
sudo reboot
После загрузки проверьте:
uname -r
sudo modprobe ip_set_hash_ip ip_set_hash_net xt_set ipip
Если modprobe проходит без Module not found — вы закрыли корневую причину.
Возвращаем Calico в чувство
На control-plane перезапустите DaemonSet и посмотрите статус:
kubectl -n kube-system rollout restart ds/calico-node
kubectl -n kube-system get pods -o wide | grep calico-node
Ожидаемый результат: pod calico-node на вашей ARM-ноде становится 1/1 Ready, readiness/liveness перестают падать.
Что делать, если после установки ядро не загрузилось
Это худший сценарий, но он возможен. Обычно причина в boot-конфигурации/загрузчике. Здесь универсального рецепта «в двух строках» нет — и именно поэтому я предпочитаю путь через orangepi-build и установку .deb пакетов: он менее «ручной» и чаще оставляет возможность откатиться.
Если всё же сломалось:
-
загрузитесь с SD/USB, верните предыдущие пакеты ядра (или откатите образ);
-
проверьте, что вы собирали корректную ветку (current/legacy) именно под вашу плату.
Итоги
Если Calico на ARM-ноде не поднимается и вы видите BIRD/Felix ошибки, не начинайте с тюнинга Calico. Сначала проверьте базовую вещь: присутствуют ли в ядре модули, на которые он опирается.
В моём кейсе решением стала пересборка ядра/модулей через orangepi-build с включением:
-
ip_set_hash_ip,ip_set_hash_net,xt_set,ipip
После этого readiness/liveness Calico перестали падать, и нода нормально вошла в кластер.
Автор: otopy
