- PVSM.RU - https://www.pvsm.ru -
Я ставил Kubernetes на Orange Pi (orangepi4pro) и наивно ожидал, что Calico «просто заведётся». В реальности DaemonSet calico-node ушёл в перезапуски, readiness/liveness-пробы падали, а в событиях Kubernetes мелькали BIRD и Felix.
Сначала это выглядит как «какая-то проблема Calico/BGP», но причина оказалась куда прозаичнее: в установленном ядре банально нет нужных netfilter/ipset/ipip модулей.
Типичная картина в 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 (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.*
Пересборка и установка ядра — риск. Минимум:
имейте доступ к консоли/серийному порту или способ восстановиться через SD/USB;
если нода уже в кластере и мешает — временно выведите её из планирования:
# на control-plane:
kubectl cordon orangepi4pro
# при необходимости:
kubectl drain orangepi4pro --ignore-daemonsets --delete-emptydir-data
Перейдите в каталог сборки и запустите скрипт:
cd ~/orangepi-build
./build.sh
Если у вас другой входной скрипт (по README) — используйте его.
В меню вида:
Compile image
rootfs
kernel
u-boot
выберите Kernel package. Это важно: build-система соберёт пакет(ы) (.deb), которые проще и безопаснее ставить, чем «вручную make install».
На вопрос:
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.
Если видите выбор current vs legacy, то в большинстве случаев берите current Recommended (особенно если вы уже видите, что у вас используются исходники ветки 6.6).
В 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 и согласитесь сохранить конфигурацию.
Компиляция на ARM может занять долго. Дождитесь завершения сборки в orangepi-build.
Папки и названия могут отличаться, но обычно пакеты лежат в 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, если в папке много лишнего).
Перезагрузитесь:
sudo reboot
После загрузки проверьте:
uname -r
sudo modprobe ip_set_hash_ip ip_set_hash_net xt_set ipip
Если modprobe проходит без Module not found — вы закрыли корневую причину.
На 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
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sni/447788
Ссылки в тексте:
[1] Источник: https://habr.com/ru/articles/1015212/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1015212
Нажмите здесь для печати.