IP-fabric — один из типов настройки сети кластера. Такой тип настройки позволяет создавать виртуальные машины (ВМ) с публичными IP-адресами в приватной сети.

ВМ в кластере IP-fabric получают IPv4-адреса с маской /32 или IPv6-адреса с маской /128. В качестве шлюза по умолчанию для каждой ВМ используется отдельный виртуальный интерфейс. Узлы кластера выполняют функцию маршрутизаторов.

Маршрутизация в кластере осуществляется с использованием протокола iBGP. Передачу информации о маршрутах iBGP выполняет оборудование Route Reflector (RR). В качестве такого оборудования могут использоваться физические или виртуальные маршрутизаторы и/или серверы. Рекомендуем использовать не менее двух комплектов оборудования RR в одном кластере — основного и резервного. 

Для работы IPv4-сети в кластере используйте не менее одного комплекта оборудования RR с IPv4-адресом, для работы IPv6-сети — не менее одного комплекта с IPv6-адресом.

Преимущества использования IP-fabric:

  • снижение объёма служебного трафика;
  • экономия адресного пространства;
  • изоляция трафика ВМ;
  • отсутствие привязки IP-адресов к узлам кластера;
  • возможность оперативной миграции ВМ между узлами кластера.

На узлах кластера IP-fabric не поддерживается создание сетевых мостов (бриджей).

Логика работы


При создании ВМ в кластере IP-fabric:

  1. Платформа VMmanager:
    1. Создаёт отдельный виртуальный интерфейс <vmname>_net0. Например, для ВМ с именем sea_gold, интерфейс будет называться sea_gold_net0. Все виртуальные интерфейсы на узле будут иметь одинаковые IP и MAC-адреса.
    2. Устанавливает IP-адрес созданного интерфейса в качестве шлюза для ВМ. Маршрутизация между ВМ и шлюзом осуществляется через соединение "точка-точка" (PtP).
    3. Добавляет созданный маршрут в конфигурацию сервиса FRR на узле кластера.
  2. Сервис FRR передаёт информацию о созданном маршруте по протоколу iBGP на оборудование RR.
  3. Оборудование RR передаёт информацию о маршруте на оборудование Core Gateway. После этого ВМ становится доступна из внешней сети (интернета).

 

Пример работы кластера IP-fabric

iBGP протокол динамической маршрутизации, отвечающий за обмен маршрутами между узлами и сетевым оборудованием.

Node 1, Node 2, Node 3 — узлы кластера.

VM1, VM2, VM3... — виртуальные машины.

VNET — виртуальные сетевые интерфейсы.

Core Gateway — оборудование, обеспечивающее доступ во внешнюю сеть (интернет).

FRR сервис на узле кластера, реализующий работу протокола iBGP.

Linux CORE — ядро ОС на узле кластера

Route Reflector сервер или сетевое оборудование, принимающее информацию о маршрутах от узлов и передающее её в Core Gateway.

Backup Route Reflector — резервный комплект оборудования Route Reflector.

Порядок настройки


  1. В VMmanager:
    1. Создайте пул IP-адресов для ВМ. Подробнее см. Работа с пулами.
    2. Создайте кластер с типом настройки сети IP-fabric. Подробнее см. Создание кластера. При создании укажите:
      1. IP-адрес шлюза для ВМ. VMmanager будет присваивать этот адрес всем виртуальным интерфейсам на узле кластера и использовать его только для маршрутизации между ВМ на узле. Рекомендуем указать частный IP-адрес (например, 10.0.0.1). Этот адрес не должен использоваться где-либо ещё в локальной сети;
      2. BGP-комьюнити;
      3. IP-адреса и номера автономных систем оборудования RR.
    3. Добавьте узлы в кластер. Подробнее см. Управление серверами кластера

      На узлах кластера IP-fabric с виртуализацией KVM должна быть установлена ОС AlmaLinux 8, с виртуализацией LXD — ОС Ubuntu 20.04.

  2. Настройте BGP-сессии для каждого узла кластера на оборудовании RR: укажите в настройках IP-адреса узлов и номера автономных систем BGP.

Пример настройки


В примере рассматривается настройка IP-fabric в кластере серверов, используемых в качестве гипервизоров. Роль Core Gateway выполняет маршрутизатор Juniper MX. В качестве Route Reflector используются физические серверы с ОС Linux.

Подготовка

Для настройки понадобится следующее оборудование:

  • сервер с платформой VMmanager;
  • один или несколько узлов кластера с установленной ОС AlmaLinux 8 или Ubuntu 20.04;
  • один или два сервера Route Reflector;
  • маршрутизатор Juniper MX.

Перед настройкой:

  1. Получите у провайдера информацию о настройках BGP: номере автономной системы и комьюнити.
  2. Убедитесь, что протокол BGP настроен и функционирует правильно.
  3. Создайте пул IP-адресов для виртуальных машин в VMmanager.

Настройка маршрутизатора Core Gateway

Чтобы настроить "соседство" Core Gateway и Route Reflector:

  1. Добавьте в конфигурацию маршрутизатора новый фильтр:

    set policy-options policy-statement VM term isp-ipv4 from protocol bgp
            set policy-options policy-statement VM term isp-ipv4 from route-filter <filter> orlonger
            set policy-options policy-statement VM term isp-ipv4 then accept
            set policy-options policy-statement VM then reject
            set policy-options policy-statement reject-all then reject
    CODE

    <filter> — список сетей из VMmanager

  2. Добавьте в конфигурацию маршрутизатора новую группу:

    set protocols bgp group VM import VM
            set protocols bgp group VM export reject-all
            set protocols bgp group VM peer-as <as>
            set protocols bgp group VM neighbor <rr_ip>
    CODE

    <as> — номер автономной системы

    <rr_ip> — IP-адрес Route Reflector

  3. Проверьте и примените конфигурацию:

    commit check
    CODE
    commit confirmed 5
    CODE
  4. Проверьте, что маршруты BGP получены:

    show bgp group VM detail
    CODE
  5. Подтвердите изменения в конфигурации:

    commit
    CODE

Настройка серверов Route Reflector

Чтобы настроить "соседство" между Route Reflector, Core Gateway и узлами кластера, установите и настройте ПО FRRouting (FRR). Вы можете автоматизировать этот процесс с помощью скрипта.

Для установки FRR сервер должен иметь прямой доступ к сети Интернет без использования прокси. При необходимости настройте правила сети так, чтобы подключение к Интернет выполнялось в обход прокси через маршрутизаторы или межсетевые экраны.

Если для Route Reflector используется виртуальная машина под управлением VMmanager, запустите на ней скрипт Route Reflector:

  1. Перейдите в Виртуальные машины → меню Запустить скрипт.
  2. Выберите скрипт Route Reflector и укажите его параметры:
    1. AS — номер автономной системы BGP.
    2. NEIGHBOR — IP-адрес "соседа" — узла кластера VMmanager.
    3. PREFIX — префикс IP-сетей, которые будет принимать Route Reflector.
    4. Поддержка VxLAN — нужно ли передавать информацию о виртуальных сетях (VxLAN).
  3. Нажмите Запустить скрипт.

Если для Route Reflector используется физический сервер:

  1. Создайте файл route_reflector.sh следующего содержания:

    #!/bin/sh
    # tags: debian10,debian11,ubuntu2004,alma8
    RNAME=route_reflector
    
    set -x
    
    LOG_PIPE=/tmp/log.pipe.$$                                                                                                                                                                                                                    
    mkfifo ${LOG_PIPE}
    LOG_FILE=/root/${RNAME}.log
    touch ${LOG_FILE}
    chmod 600 ${LOG_FILE}
    
    tee < ${LOG_PIPE} ${LOG_FILE} &
    
    exec > ${LOG_PIPE}
    exec 2> ${LOG_PIPE}
    
    killjobs() {
        jops="$(jobs -p)"
        test -n "${jops}" && kill ${jops} || :
    }
    trap killjobs INT TERM EXIT
    
    echo
    echo "=== Recipe ${RNAME} started at $(date) ==="
    echo
    
    if [ -f /etc/redhat-release ]; then
        OSNAME=centos
    else
        OSNAME=debian
    fi
    
    Service() {
        # $1 - name
        # $2 - command
    
        if [ -n "$(which systemctl 2>/dev/null)" ]; then
            systemctl ${2} ${1}.service
        else
            if [ "${2}" = "enable" ]; then
                if [ "${OSNAME}" = "debian" ]; then
                    update-rc.d ${1} enable
                else
                    chkconfig ${1} on
                fi
            else
                service ${1} ${2}
            fi
        fi
    }
    
    if [ "${OSNAME}" = "debian" ]; then
        export DEBIAN_FRONTEND="noninteractive"
    
        # Wait firstrun script
        while ps uxaww | grep  -v grep | grep -Eq 'apt-get|dpkg' ; do echo "waiting..." ; sleep 3 ; done
        apt-get update --allow-releaseinfo-change || :
        apt-get update
        test -f /usr/bin/which || apt-get -y install which
        which lsb_release 2>/dev/null || apt-get -y install lsb-release
        which logger 2>/dev/null || apt-get -y install bsdutils
        OSREL=$(lsb_release -s -c)
        apt install -y curl ca-certificates
        curl -s https://deb.frrouting.org/frr/keys.asc | apt-key add -
        FRRVER="frr-stable"
        echo deb https://deb.frrouting.org/frr $(lsb_release -s -c) $FRRVER | tee -a /etc/apt/sources.list.d/frr.list
        apt update
        apt -y install frr frr-pythontools
    else
        OSREL=$(printf '%.0f' $(rpm -qf --qf '%{version}' /etc/redhat-release))
        FRRVER="frr-stable"
        yum install -y curl
        curl -O https://rpm.frrouting.org/repo/$FRRVER-repo-1-0.el8.noarch.rpm
        yum install -y ./$FRRVER*
        yum install -y frr frr-pythontools
    fi
    
    sed -i '/bgpd=/s/no/yes/' /etc/frr/daemons
    CONFIG="/etc/frr/frr.conf"
    ip=$(ip route get 1 | grep -Po '(?<=src )[^ ]+')
    if grep -q "router bgp" $CONFIG; then
        # Already exists. adding new neighbor or new network
        if grep -q "($NEIGHBOR)" $CONFIG; then
            # This neighbor already exists
            true
        else
            sed -i "/extended-nexthop/a    neighbor ($NEIGHBOR) peer-group fabric" $CONFIG
            sed -i "/extended-nexthop/a    neighbor ($NEIGHBOR) remote-as ($AS)" $CONFIG
        fi
        if [ "($VXLAN)" = "yes" ]; then
            # need to add vxlan?
            if grep -q "address-family l2vpn evpn" $CONFIG; then
                # already enabled
                true
            else
                sed -i '/exit-address-family/cexit-address-family\
        !\
        address-family l2vpn evpn\
            neighbor fabric activate\
            neighbor fabric route-reflector-client\
            advertise-all-vni\
        exit-address-family' $CONFIG
            fi
        fi
        if grep -q "($PREFIX)" $CONFIG; then
            # already added
            true
        else
            if ! [ "($PREFIX)" = "()" ]; then
                cat << EOF >> $CONFIG
    ip prefix-list IPV4_PLIST permit ($PREFIX) ge 32 le 32
    !
    EOF
            fi
        fi
    else
        cat << EOF > $CONFIG
    router bgp ($AS)
        bgp router-id $ip
        bgp log-neighbor-changes
        no bgp default ipv4-unicast
        neighbor fabric peer-group
        neighbor fabric capability extended-nexthop
        neighbor ($NEIGHBOR) remote-as ($AS)
        neighbor ($NEIGHBOR) peer-group fabric
        !
        address-family ipv4 unicast
            neighbor fabric activate
            neighbor fabric route-map IPV4_IMPORT in
            neighbor fabric route-reflector-client
        exit-address-family
        !
    EOF
        if [ "($VXLAN)" = "yes" ]; then
            cat << EOF >> $CONFIG
        address-family l2vpn evpn
            neighbor fabric activate
            neighbor fabric route-reflector-client
            advertise-all-vni
        exit-address-family
    EOF
        fi
        cat << EOF >> $CONFIG
    exit
    !
    route-map IPV4_IMPORT permit 5
        match ip address prefix-list IPV4_PLIST
    exit
    !
    ip nht resolve-via-default
    !
    EOF
    if ! [ "($PREFIX)" = "()" ]; then
        cat << EOF >> $CONFIG
    ip prefix-list IPV4_PLIST permit ($PREFIX) ge 32 le 32
    !
    EOF
        fi
        Service frr enable
    fi
    sed -i '/Nice/d' /usr/lib/systemd/system/frr.service
    sed -i '/Nuce/d' /lib/systemd/system/frr.service
    systemctl daemon-reload
    Service frr restart
    
    
    BASH
  2. Замените макросы в тексте файла:
    1. ($AS) — на номер автономной системы BGP.
    2. ($NEIGHBOR) — на IP-адрес "соседа" — узла кластера VMmanager.
    3. ($PREFIX) — на префикс IP-сетей, которые будет принимать Route Reflector.
    4. ($VXLAN) — на:
      • уеs — если сервис должен передавать информацию о виртуальных сетях (VxLAN);
      • no — если информацию о виртуальных сетях передавать не нужно.
  3. Запустите скрипт: 

    sh route_reflector.sh
    BASH

При добавлении новых узлов в кластер информацию о них нужно будет добавить в конфигурационный файл FRR. Для этого повторно запустите скрипт с нужными параметрами или внесите изменения вручную в файл /etc/frr/frr.conf.

Настройка VMmanager

Для настройки IP-fabric в VMmanager:

  1. Cоздайте кластер с типом сети IP-Fabric. При создании укажите настройки для соединения с Core Gateway и Route Reflector.
  2. Подключите серверы в созданный кластер.
  3. Создайте ВМ в кластере.