Metallb speaker не работает на узле k3s с 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 можно заметить следующие ключевые моменты:

  1. Не найден секрет: В логах вы упомянули сообщение об ошибке, связанной с FailedMount для volume "memberlist" с указанием на то, что секрет metallb-memberlist отсутствует.
  2. Логи 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.

Завершение и проверка

После внесения изменений:

  1. Перезапустите Pod Speaker с помощью команды:

    kubectl delete pod metallb-speaker-695f4
  2. Проверьте состояние Pod и логи повторно, чтобы удостовериться, что он запускается без ошибок:

    kubectl get pods
    kubectl logs metallb-speaker-<pod-id>

Завершение всех этих шагов, а также обращение внимания на логирование и конфигурацию помогут устранить проблемы с запуском MetalLB Speaker в вашем кластере K3s, работающем через WireGuard.

Заключение

Настройка сетевых сервисов в Kubernetes может быть непростой задачей, особенно в условиях использования VPN-технологий, таких как WireGuard. Убедитесь, что все компоненты правильно сконфигурированы, а службы доступны. Если у вас останутся дополнительные вопросы или проблемы, рекомендуется обратиться к сообществу или документации MetalLB для получения поддержки.

Оцените материал
Добавить комментарий

Капча загружается...