- Вопрос или проблема
- Wireguard
- Ответ или решение
- Решение проблемы с запуском MetalLB Speaker на узле K3s с WireGuard
- Введение
- Описание проблемы
- Причины и рекомендации по устранению
- 1. Отсутствие секрета metallb-memberlist
- 2. Ошибка при конфигурации сетевых интерфейсов
- 3. Проверка конфигурации WireGuard
- Завершение и проверка
- Заключение
Вопрос или проблема
У меня есть узел almaLinux
с k3s
, подключенный к VPS-серверу в качестве шлюза через сеть wireguard
.
Версии:
➜ ~ kubectl version
Версия клиента: v1.30.5+k3s1
Версия Kustomize: v5.0.4-0.20230601165947-6ce0bf390ce3
Версия сервера: v1.30.5+k3s1
➜ ~ helm search repo metallb
ИМЯ ВЕРСИЯ ЧАРТА ВЕРСИЯ ПРИЛОЖЕНИЯ ОПИСАНИЕ
metallb/metallb 0.14.8 v0.14.8 Реализация сетевого балансировщика нагрузки для Kube...
➜ ~ k3s -v
Версия k3s v1.30.5+k3s1 (9b586704)
Версия go go1.22.6
Команда установки k3s:
curl -sfL https://get.k3s.io | sh -s - server \
--write-kubeconfig-mode 644 \
--selinux \
--disable=servicelb \
--disable=traefik \
--disable=local-storage \
--disable=metrics-server \
--cluster-init \
--cluster-domain <example.domain.com> \
--flannel-iface wg0 \
--flannel-external-ip <внешний IP шлюза> \
--advertise-address <ip wireguard> \
Далее metallb
устанавливается с помощью helm
в пространстве имен по умолчанию:
helm install metallb metallb/metallb
После запуска я получаю следующее:
➜ ~ k get pods
ИМЯ ГОТОВ СТАТУС ПЕРЕЗУПУСКИ ВРЕМЯ
metallb-controller-77cb7f5d88-lp82x 1/1 Работает 0 2м17с
metallb-speaker-695f4 3/4 ОшибкаПерезапуска 2 (9с назад) 2м17с
Описание пода speaker:
➜ ~ k describe pod metallb-speaker-695f4
Имя: metallb-speaker-695f4
Пространство имен: default
Приоритет: 0
Сервисная учетная запись: metallb-speaker
Узел: <имя хоста>/<ip wireguard>
Время запуска: Вс, 27 Окт 2024 17:20:15 +TZ
Метки: app.kubernetes.io/component=speaker
app.kubernetes.io/instance=metallb
app.kubernetes.io/name=metallb
controller-revision-hash=54989b5cc8
pod-template-generation=1
Аннотации: <нет>
Статус: Работает
IP: <ip wireguard>
IPs:
IP: <ip wireguard>
<...>
Контейнеры:
speaker:
ID контейнера: containerd://4f27b5af57e5ae11ced1db16f799ce81d6fef4c5801351bfac7d736942cb4c31
Изображение: quay.io/metallb/speaker:v0.14.8
ID изображения: quay.io/metallb/speaker@sha256:fd86bfc502601d6525739d411a0045e7085a4008a732be7e271c851800952142
Порты: 7472/TCP, 7946/TCP, 7946/UDP
Хост Порты: 7472/TCP, 7946/TCP, 7946/UDP
Аргументы:
--port=7472
--log-level=info
Состояние: Работает
Запущен: Вс, 27 Окт 2024 17:22:56 +TZ
Последнее состояние: Завершен
Причина: Ошибка
Код завершения: 1
Запущен: Вс, 27 Окт 2024 17:21:53 +TZ
Завершен: Вс, 27 Окт 2024 17:22:23 +TZ
Готов: Ложь
Количество перезапусков: 3
Жизнеспособность: http-get http://:monitoring/metrics delay=10s timeout=1s period=10s #success=1 #failure=3
Готовность: http-get http://:monitoring/metrics delay=10s timeout=1s period=10s #success=1 #failure=3
Переменные окружения:
METALLB_NODE_NAME: (v1:spec.nodeName)
METALLB_HOST: (v1:status.hostIP)
METALLB_ML_BIND_ADDR: (v1:status.podIP)
METALLB_ML_LABELS: app.kubernetes.io/name=metallb,app.kubernetes.io/component=speaker
METALLB_ML_BIND_PORT: 7946
METALLB_ML_SECRET_KEY_PATH: /etc/ml_secret_key
FRR_CONFIG_FILE: /etc/frr_reloader/frr.conf
FRR_RELOADER_PID_FILE: /etc/frr_reloader/reloader.pid
METALLB_BGP_TYPE: frr
METALLB_POD_NAME: metallb-speaker-695f4 (v1:metadata.name)
Монтирования:
/etc/frr_reloader from reloader (rw)
/etc/metallb from metallb-excludel2 (rw)
/etc/ml_secret_key from memberlist (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-llfjq (ro)
frr:
ID контейнера: containerd://b0e2892309f5910caefec2e572d44f69ad6b59a9a8169834b0384f0481559e8a
Изображение: quay.io/frrouting/frr:9.1.0
ID изображения: quay.io/frrouting/
<...>
Класс QoS: BestEffort
Селекторы узлов: kubernetes.io/os=linux
Допуск: node-role.kubernetes.io/control-plane:NoSchedule op=Exists
node-role.kubernetes.io/master:NoSchedule op=Exists
node.kubernetes.io/disk-pressure:NoSchedule op=Exists
node.kubernetes.io/memory-pressure:NoSchedule op=Exists
node.kubernetes.io/network-unavailable:NoSchedule op=Exists
node.kubernetes.io/not-ready:NoExecute op=Exists
node.kubernetes.io/pid-pressure:NoSchedule op=Exists
node.kubernetes.io/unreachable:NoExecute op=Exists
node.kubernetes.io/unschedulable:NoSchedule op=Exists
События:
Тип Причина Возраст Откуда Сообщение
---- ------ ---- ---- -------
Обычно Запланировано 2м54с default-scheduler Успешно назначен default/metallb-speaker-695f4 на <имя хоста>
Предупреждение ОшибкаПримонтирования 2м47с (x5 за 2м55с) kubelet Не удалось настроить том "memberlist": секрет "metallb-memberlist" не найден
Обычно Забирается 2м39с kubelet Забирается изображение "quay.io/frrouting/frr:9.1.0"
Обычно Забрано 2м21с kubelet Успешно забрано изображение "quay.io/frrouting/frr:9.1.0" за 17.675с (17.675с включая ожидание). Размер изображения: 80293937 байт.
Обычно Создано 2м21с kubelet Контейнер cp-frr-files создан
Обычно Запущено 2м21с kubelet Контейнер cp-frr-files запущен
Обычно Забирается 2м19с kubelet Забирается изображение "quay.io/metallb/speaker:v0.14.8"
Обычно Забрано 2м7с kubelet Успешно забрано изображение "quay.io/metallb/speaker:v0.14.8" за 11.504с (11.504с включая ожидание). Размер изображения: 53146149 байт.
Обычно Создано 2м7с kubelet Контейнер cp-reloader создан
Обычно Запущено 2м7с kubelet Контейнер cp-reloader запущен
Обычно Забрано 2м6с kubelet Контейнер изображение "quay.io/metallb/speaker:v0.14.8" уже присутствует на машине
Обычно Создано 2м6с kubelet Контейнер cp-metrics создан
Обычно Запущено 2м6с kubelet Контейнер cp-metrics запущен
Обычно Забрано 2м5с kubelet Контейнер изображение "quay.io/metallb/speaker:v0.14.8" уже присутствует на машине
Обычно Создано 2м5с kubelet Контейнер speaker создан
Обычно Запущено 2м5с kubelet Контейнер speaker запущен
Обычно Забрано 2м5с kubelet Контейнер изображение "quay.io/frrouting/frr:9.1.0" уже присутствует на машине
Обычно Создано 2м5с kubelet Контейнер frr создан
Обычно Запущено 2м5с kubelet Контейнер frr запущен
Обычно Забрано 2м5с kubelet Контейнер изображение "quay.io/frrouting/frr:9.1.0" уже присутствует на машине
Обычно Создано 2м5с kubelet Контейнер reloader создан
Обычно Запущено 2м4с kubelet Контейнер reloader запущен
Логи speaker:
➜ ~ k logs metallb-speaker-695f4
Контейнер "speaker" по умолчанию: speaker, frr, reloader, frr-metrics, cp-frr-files (init), cp-reloader (init), cp-metrics (init)
{"branch":"dev","caller":"main.go:106","commit":"dev","goversion":"gc / go1.22.4 / amd64","level":"info","msg":"MetalLB speaker starting version 0.14.8 (commit dev, branch dev)","ts":"2024-10-27T14:25:09Z","version":"0.14.8"}
{"caller":"announcer.go:126","event":"createARPResponder","interface":"enp7s0","level":"info","msg":"создан ARP-ответчик для интерфейса","ts":"2024-10-27T14:23:09Z"}
{"caller":"announcer.go:135","event":"createNDPResponder","interface":"enp7s0","level":"info","msg":"создан NDP-ответчик для интерфейса","ts":"2024-10-27T14:23:09Z"}
{"caller":"main.go:127","level":"info","msg":"начало завершения работы","op":"shutdown","ts":"2024-10-27T14:23:21Z"}
Wireguard
Конфигурация:
➜ ~ cat /etc/wireguard/wg0.conf
[Интерфейс]
Приватный ключ = <ключ>
Адрес = <ip wireguard>/24
DNS = 1.1.1.1
[Сосед]
Открытый ключ = <ключ>
Разрешенные IP = 0.0.0.0/0
Конечная точка = <ip сервера vps>:<порт>
Я проверил запуск metallb
без wireguard, для которого я получил работающий speaker
:
curl -sfL https://get.k3s.io | sh -s - server \
--write-kubeconfig-mode 644 \
--selinux \
--disable=servicelb \
Ответ или решение
Решение проблемы с запуском MetalLB Speaker на узле K3s с WireGuard
Введение
Вы столкнулись с проблемой, когда компонент MetalLB Speaker не запускается корректно на узле K3s, который подключен к VPS серверу через WireGuard. В процессе изучения этой ситуации мы рассмотрим все аспекты настройки и возможные причины возникновения ошибок, основываясь на предоставленной информации.
Описание проблемы
Из ваших данных видно, что после установки MetalLB в кластере K3s, Pod metallb-speaker
находится в состоянии CrashLoopBackOff
. Это говорит о том, что он постоянно сталкивается с ошибками при старте и перезапускается. При детальном изучении вывода команды kubectl describe pod metallb-speaker-695f4
можно заметить следующие ключевые моменты:
- Не найден секрет: В логах вы упомянули сообщение об ошибке, связанной с
FailedMount
дляvolume "memberlist"
с указанием на то, что секретmetallb-memberlist
отсутствует. - Логи Pod: Логирование показывает, что MetalLB Speaker запускается, создает ARP и NDP респондеры, но затем вызывает событие
shutdown
, которое приводит к завершению работы.
Причины и рекомендации по устранению
1. Отсутствие секрета metallb-memberlist
Одной из основных причин сбоя MetalLB Speaker является отсутствие необходимого секрета. Он используется для обеспечения синхронизации между экземплярами. Вам необходимо создать данный секрет вручную. Для этого выполните следующую команду:
kubectl create secret generic metallb-memberlist --from-literal=secretkey=<your-secret-key>
Замените <your-secret-key>
на случайно сгенерированное значение. После этого проверьте состояние Pod и его логи.
2. Ошибка при конфигурации сетевых интерфейсов
Так как ваш узел K3s работает через WireGuard, важно правильно настроить сетевые интерфейсы. В MetalLB Speaker есть возможность указывать интерфейсы, на которых он должен работать. Убедитесь, что интерфейс wg0
правильно сконфигурирован:
- Проверьте, что интерфейс
enp7s0
(как указано в логах) является активным и имеет правильные IP-адреса. - Убедитесь, что маршрутизация настроена так, чтобы трафик мог корректно маршрутизироваться через WireGuard.
3. Проверка конфигурации WireGuard
Ваша текущая конфигурация WireGuard выглядит корректно на первый взгляд. Однако стоит обратить внимание на следующие моменты:
- Проверьте, что настройка
AllowedIPs
на стороне клиента действительно разрешает все необходимые IP-адреса. - Убедитесь, что VPS сервер отвечает на запросы UDP, поскольку MetalLB работает через BGP, который использует UDP. Можно протестировать порты с помощью утилиты, такой как
nc
илиtelnet
.
Завершение и проверка
После внесения изменений:
-
Перезапустите Pod Speaker с помощью команды:
kubectl delete pod metallb-speaker-695f4
-
Проверьте состояние Pod и логи повторно, чтобы удостовериться, что он запускается без ошибок:
kubectl get pods kubectl logs metallb-speaker-<pod-id>
Завершение всех этих шагов, а также обращение внимания на логирование и конфигурацию помогут устранить проблемы с запуском MetalLB Speaker в вашем кластере K3s, работающем через WireGuard.
Заключение
Настройка сетевых сервисов в Kubernetes может быть непростой задачей, особенно в условиях использования VPN-технологий, таких как WireGuard. Убедитесь, что все компоненты правильно сконфигурированы, а службы доступны. Если у вас останутся дополнительные вопросы или проблемы, рекомендуется обратиться к сообществу или документации MetalLB для получения поддержки.