1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/kubesphere-openelb

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
simulate_with_bird.md 17 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 15:10 f2d1f5c

Симулируем с Bird

Английский | 中文

Эта статья представляет собой эксперимент, проведённый на платформе QingCloud. Существуют некоторые различия в конфигурации для разных платформ. Преимущество симуляции заключается в том, что вы можете испытать функцию Porter, не касаясь реального оборудования, но это всё ещё отличается от реального маршрутизатора.

Симулированный маршрутизатор

Симулированный маршрутизатор имеет сетевую карту по умолчанию (не используется для маршрутизации), которая вызовет маршрут по умолчанию, когда пакет возвращается. Кроме того, при настройке симулированного маршрутизатора существует множество дополнительных параметров, пожалуйста, установите эти параметры в соответствии с этой статьёй.

Предварительные условия

  1. Кластер k8s.
  2. Убедитесь, что хост, используемый для имитации маршрутизатора, может быть подключён к кластеру k8s, включая порт BGP и порт приложения в кластере.
  3. Общедоступный IP-адрес.

Создание маршрутизатора

  1. Создайте хост в сети k8s и установите Bird на хосте. Платформа QingCloud имеет только версию Bird 1.5. Эта версия не поддерживает ECMP. Чтобы испытать все функции Porter, вам необходимо установить как минимум версию 1.6. Выполните следующий скрипт для установки Bird версии 1.6:

    $sudo add-apt-repository ppa:cz.nic-labs/bird
    $sudo apt-get update
    $sudo apt-get install bird
    $sudo systemctl enable bird  
  2. Настройте службу BGP маршрутизатора. Измените /etc/bird/bird.conf и добавьте следующие параметры:

    protocol bgp mymaster {   
        description "192.168.1.4";  # Router ID, обычно основной IP-адрес
        local as 65001;             # Локальный номер AS, должен отличаться от номера AS кластера k8s
        neighbor 192.168.1.5 port 17900 as 65000;  # Главный узел IP и номер AS
        source address 192.168.1.4;                # IP маршрутизатора  
        import all;   
        export all;
        enable route refresh off;  # Из-за низкого протокола BGP в bird 1.6 несколько маршрутов, рекламируемых Porter, станут одним маршрутом, этот параметр можно использовать в качестве обходного пути для решения этой проблемы.
        add paths on; # Когда этот параметр установлен в положение «on», вы можете получить несколько маршрутов от Porter.
    }

    Вышеуказанные параметры настраивают соседа для симулируемого маршрутизатора. Сосед — это главный узел кластера. Мы предполагаем, что ваш контроллер Porter развёрнут на главном узле. Если вы не хотите ограничивать размещение porter на главном узле или мастер не может развернуть модули, то вам нужно добавить все узлы соседей в этот файл конфигурации в соответствии с вышеуказанными правилами. Измените часть kernel файла, отмените комментарии export all и включите функцию ECMP:

    protocol kernel {
         scan time 60;
         import none;
         export all;     # Фактически вставьте маршруты в таблицу маршрутизации ядра
         merge paths on; # Включите ECMP, этому параметру требуется как минимум bird 1.6
    }
    
  3. Перезагрузите Bird:

     $sudo systemctl restart bird 
  4. Настройте эластичный IP. Примените эластичный IP, который в режиме ассоциации является внутренним, на консоли QingCloud. Обратите внимание, что EIP должен быть внутренним режимом ассоциации. Если это внешний режим ассоциации, EIP не может быть найден в виртуальной машине. Свяжите этот EIP с виртуальной машиной, где находится симулируемый маршрутизатор. Вам нужно только завершить ассоциацию. Нет необходимости следовать документации QingCloud.

  5. Будет создана новая сетевая карта (обычно eth1), когда IP будет привязан к хосту QingCloud. Запустите ip a на хосте, чтобы проверить, является ли сетевая карта UP. Если нет, выполните ip link set up eth1.

  6. Включите переадресацию портов и отключите фильтрацию пакетов на симулированном маршрутизаторе:

    sysctl -w net.ipv4.ip_forward=1   
    sysctl -w net.ipv4.conf.all.rp_filter=0    
    sysctl -w net.ipv4.conf.eth1.rp_filter=0
    sysctl -w net.ipv4.conf.eth0.rp_filter=0
  7. Настройте брандмауэр. Проведите некоторые тесты портов на консоли QingCloud.

  8. Настройте правила маршрутизации. Поскольку сетевая карта по умолчанию симулированного маршрутизатора — eth0, после того как кластер вернёт IP... Пакеты будут отправляться с eth0 по умолчанию. Пользователь получает доступ к IP-адресу общедоступной сети через eth1, что может привести к сбою передачи. Поэтому пакеты, отправленные с привязанного IP-адреса, необходимо направить на eth1.

Получите доступ к этому адресу в браузере и используйте tcpdump -i eth1 для захвата пакетов на смоделированном маршрутизаторе и наблюдения за адресом верхнего маршрутизатора, например:

root@i-7bwamgny:~# tcpdump -i eth1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
14:24:07.401555 IP 139.198.254.4.1395 > 139.198.121.228.omniorb: Flags [S], seq 3677905607, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532475097 ecr 0], length 0
14:24:07.403573 IP 139.198.254.4.1396 > 139.198.121.228.omniorb: Flags [S], seq 2462558694, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532475100 ecr 0], length 0
14:24:07.654341 IP 139.198.254.4.1397 > 139.198.121.228.omniorb: Flags [S], seq 1471601642, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532475350 ecr 0], length 0
14:24:10.400770 IP 139.198.254.4.1395 > 139.198.121.228.omniorb: Flags [S], seq 3677905607, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532478097 ecr 0], length 0
14:24:10.404100 IP 139.198.254.4.1396 > 139.198.121.228.omniorb: Flags [S], seq 2462558694, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532478100 ecr 0], length 0
14:24:10.658557 IP 139.198.254.4.1397 > 139.198.121.228.omniorb: Flags [S], seq 1471601642, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532478351 ecr 0], length 0
14:24:16.401591 IP 139.198.254.4.1395 > 139.198.121.228.omniorb: Flags [S], seq 3677905607, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532484098 ecr 0], length 0
14:24:16.404605 IP 139.198.254.4.1396 > 139.198.121.228.omniorb: Flags [S], seq 2462558694, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532484101 ecr 0], length 0
14:24:16.656750 IP 139.198.254.4.1397 > 139.198.121.228.omniorb: Flags [S], seq 1471601642, win 64240, options [mss 1394,nop,wscale 8,sackOK,TS val 532484351 ecr 0], length 0

В приведённом выше выводе `139.198.121.228` — это привязанный IP, а левая сторона от `>` — адрес верхнего маршрутизатора. Настройте правила для возврата пакетов через политики маршрутизации:

```bash
sudo ip rule add from 139.198.254.4/32 lookup 101 # Если пакет приходит с этого IP, то перейти к таблице маршрутизации 101
sudo ip route replace default dev eth1 table 101  # Установить сетевую карту по умолчанию таблицы маршрутизации 101 на eth1

Фактический физический маршрутизатор не должен настраивать вышеуказанные правила, потому что маршрутизатор знает, как правильно настроить этот IP. Если вам нужно получить доступ и протестировать ECMP с нескольких IP-адресов, эти IP-адреса также должны быть настроены с помощью тех же шагов

После завершения настройки вы можете выполнить birdc show protocol, чтобы просмотреть информацию о соединении.

Примечание: если способ подключения к хосту осуществляется через общедоступный IP-адрес, после выполнения вышеуказанной операции возможно, что соединение SSH будет отключено (если и только если общедоступный IP-адрес SSH и общедоступный IP-адрес вашего теста находятся в сети QingCloud, NAT будет направлен на указанный выше 139.198.254.4/32). После отключения можно использовать VNC для подключения хоста на веб-сайте QingCloud. Рекомендуется использовать VPN-соединение. Следующие операции в кластере k8s будут иметь тот же эффект.

Настройка плагинов

Все операции выполняются на главном узле кластера k8s

  1. Получите файл YAML Porter
    wget https://github.com/kubesphere/porter/releases/download/v0.1.1/porter.yaml
  2. Вам необходимо изменить ConfigMap с именем bgp-cfg в YAML в соответствии с Конфигурацией BGP
  3. Настроить правила маршрутизации общедоступной сети IP. То же самое, что и проблема с смоделированным маршрутизатором. Этот шаг необходимо настроить на всех узлах k8s, поскольку фактическая служба может быть развёрнута на любом узле. ``` sudo ip rule add to 139.198.254.0/24 lookup 101 sudo ip route replace default via 192.168.98.5 dev eth0 table 101 # 192.168.98.5 — это IP-адрес маршрутизатора.

На моделируемом маршрутизаторе настроено циклическое правило, поэтому этот пакет не будет отброшен. Реальный кластер k8s не нужно настраивать, потому что шлюзом по умолчанию для кластера k8s является этот маршрутизатор.

4. Установите Porter в кластере k8s: `kubectl apply -f porter.yaml`
5. Добавьте EIP:

```bash
kubectl apply -f - <<EOF
apiVersion: network.kubesphere.io/v1alpha1
kind: Eip
metadata:
    name: eip-sample
spec:
    address: 139.198.121.228
    protocol: bgp
EOF 
  1. Разверните сервис в kubernetes. Сервис должен содержать следующие аннотации, а тип также должен быть указан как LoadBalancer:
kind: Service
apiVersion: v1
metadata:
name: mylbapp
annotations:
lb.kubesphere.io/v1alpha1: porter
#protocol.porter.kubesphere.io/v1alpha1: bgp 
spec:
selector:
app: mylbapp
type: LoadBalancer 
ports:
- name: http
port: 8088
targetPort: 80

Пример: Service

Примечание: Если вы хотите назначить IP-адрес сервису, есть два способа: — Добавить spec.loadBalancerIP: <ip> (рекомендуется). — Добавить eip.porter.kubesphere.io/v1alpha1: <ip> в annotations.

  1. Проверьте журналы Porter и события EIP. Если проблем нет, вы можете получить доступ к сервису через EIP.
kubectl logs -n porter-system controller-manager-0 -c manager # Проверить логи Porter
kubectl describe eip eip-sample # Проверить события
  1. Проверьте, есть ли на моделируемом маршрутизаторе два маршрута с одинаковой стоимостью:
root@i-7bwamgny:~# ip route
default via 192.168.98.1 dev eth0
139.198.121.228 proto bird
nexthop via 192.168.98.2 dev eth0 weight 1
nexthop via 192.168.98.4 dev eth0 weight 1

Тестирование балансировки нагрузки ECMP

Примечание: версия ядра хоста, на котором расположен моделируемый маршрутизатор, должна быть выше 3.6. Версия ядра платформы QingCloud по умолчанию — 4.4. Используемый алгоритм хеширования ECMP — L3. ECMP будет корректировать маршрут доступа только на основе исходного IP. Версии ядра выше 4.12 поддерживают L4. Вы можете запустить sysctl net.ipv4.fib_multipath_hash_policy 1, чтобы изменить алгоритм балансировки нагрузки, затем использовать curl, чтобы получить доступ к этому eip, чтобы добиться эффекта балансировки нагрузки.

Для фактического маршрутизатора требуется только включить функцию ECMP для достижения балансировки нагрузки. Чтобы проверить эффективность балансировки нагрузки, вам необходимо получить доступ к этому EIP с разных исходных IP-адресов и посмотреть, есть ли трафик на каждом узле.

  1. Посмотрите на узел, где находится Pod:
kubectl get pod -o wide
  1. Посмотрите, установил ли каждый узел правила маршрутизации:
root@master-k8s:~# ip rule
0: from all lookup local
32763: from all to 139.198.121.228 lookup 101
  1. Запустите tcpdump -i eth0 port $port на этих узлах, где $port — порт, предоставляемый сервисом. В приведённом примере это 8088.
  2. Получите доступ к этому EIP с различных IP-адресов и посмотрите, есть ли трафик на этих узлах. Если есть, то с балансировкой нагрузки проблем нет.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/kubesphere-openelb.git
git@api.gitlife.ru:oschina-mirror/kubesphere-openelb.git
oschina-mirror
kubesphere-openelb
kubesphere-openelb
master