Calico на Orange Pi не поднимается

в 8:16, , рубрики: calico, kubernetes, kubernetes cluster, sni

Calico на Orange Pi не поднимается: как я упёрся в отсутствующие модули ядра и починил это пересборкой через orangepi-build

Orange Pi и логи Kubernetes

Orange Pi и логи Kubernetes

Я ставил 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_SETIP set support

  • CONFIG_IP_SET_HASH_IPIP set type hash:ip

  • CONFIG_IP_SET_HASH_NETIP set type hash:net

  • CONFIG_NETFILTER_XT_SET"set" match support (xt_set)

  • CONFIG_NET_IPIPIP: 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js