Как настраивал агрегацию сетевых интерфейсов (bonding) в Linux

Ответ

Настраивал bonding (LAG) для обеспечения отказоустойчивости и увеличения пропускной способности канала до серверов, особенно для мастер-узлов Kubernetes и баз данных.

Предпочтительный способ — через Netplan (Ubuntu 18.04+) или systemd-networkd:

  1. Конфигурация в Netplan (/etc/netplan/01-netcfg.yaml):

    network:
      version: 2
      ethernets:
        eno1:
          dhcp4: no
        eno2:
          dhcp4: no
      bonds:
        bond0:
          interfaces: [eno1, eno2]
          addresses: [192.168.1.10/24]
          gateway4: 192.168.1.1
          nameservers:
            addresses: [8.8.8.8, 1.1.1.1]
          parameters:
            mode: 802.3ad                # Режим LACP
            lacp-rate: fast              # Частота отправки LACP-пакетов
            mii-monitor-interval: 100    # Интервал проверки ссылки (мс)
            transmit-hash-policy: layer3+4 # Алгоритм балансировки

    Применяем: sudo netplan apply.

  2. Проверка:

    cat /proc/net/bonding/bond0  # Детальный статус
    ip link show bond0           # Состояние интерфейса

Ключевые моменты:

  • Режим 802.3ad (mode 4) требует поддержки на коммутаторе (нужно настроить LACP-группу).
  • Для режима active-backup (mode 1) указывается primary интерфейс.
  • Обязательно тестировал отказоустойчивость, физически отключая кабель и проверяя, что трафик переключается без потери пинг-пакетов.
  • В инфраструктуре как код (Terraform/Ansible) конфигурация bonding прописывалась в шаблонах для автоматического применения на всех новых серверах.

Ответ 18+ 🔞

Боже, ну вот сидишь такой, настраиваешь bonding, а в голове одна мысль: «Чтоб всё это, ёпта, не накрылось медным тазом в самый ответственный момент». Особенно когда речь про мастер-узлы кубера и базы данных — тут доверия ебать ноль ко всем этим проводам и свичам.

Короче, задача простая, как хуй с горы: сделать так, чтобы если один кабель выйдет из строя, трафик даже не чихнул, а сразу пошёл по другому. И заодно пропускную способность увеличить, чтоб не бутылочное горлышло было.

Предпочтительный способ — через Netplan (для тех, у кого Ubuntu 18.04 и новее):

  1. Лепим конфиг Netplan (/etc/netplan/01-netcfg.yaml). Выглядит страшновато, но на деле — хуй в пальто.

    network:
      version: 2
      ethernets:
        eno1:
          dhcp4: no
        eno2:
          dhcp4: no
      bonds:
        bond0:
          interfaces: [eno1, eno2]
          addresses: [192.168.1.10/24]
          gateway4: 192.168.1.1
          nameservers:
            addresses: [8.8.8.8, 1.1.1.1]
          parameters:
            mode: 802.3ad                # Это тот самый модный режим LACP
            lacp-rate: fast              # Чтобы пакеты LACP летали часто, как угорелые
            mii-monitor-interval: 100    # Как часто тыкать палкой, жива ли ссылка (в миллисекундах)
            transmit-hash-policy: layer3+4 # Умный алгоритм, как раскидывать трафик по проводам

    Применяем магию: sudo netplan apply. Если не вывалилось с ошибкой — уже хорошо.

  2. Проверяем, не обманули ли нас.

    cat /proc/net/bonding/bond0  # Тут будет овердохуища технических деталей, но главное — увидеть, что оба порта `up` и в режиме `802.3ad`
    ip link show bond0           # Быстрый взгляд: живой ли агрегированный интерфейс

Важные моменты, где можно облажаться:

  • Режим 802.3ad (mode 4) — это не шутка. Если на коммутаторе не включить LACP на соответствующих портах, то bond поднимется, но работать как задумано — не будет. Будет тихий пиздец и волнение ебать.
  • Если нужен простой режим active-backup (mode 1), когда один интерфейс работает, а второй спит, то в параметрах надо указать primary, какой интерфейс главный.
  • Тестирование — наше всё. После настройки я брал и просто выдёргивал кабель. Смотрел, чтобы пинг не проседал ни на единый пакет. Если просел — значит, где-то косяк, и терпения ноль ебать, пока не найдёшь.
  • В инфраструктуре как код (в тех же шаблонах для Ansible) эту конфигурацию нужно было аккуратно прописать, чтобы каждый новый сервер вставал уже с правильным bonding'ом, а не как попало.