Симулируем с Bird
Английский | 中文
Эта статья представляет собой эксперимент, проведённый на платформе QingCloud. Существуют некоторые различия в конфигурации для разных платформ. Преимущество симуляции заключается в том, что вы можете испытать функцию Porter, не касаясь реального оборудования, но это всё ещё отличается от реального маршрутизатора.
Симулированный маршрутизатор имеет сетевую карту по умолчанию (не используется для маршрутизации), которая вызовет маршрут по умолчанию, когда пакет возвращается. Кроме того, при настройке симулированного маршрутизатора существует множество дополнительных параметров, пожалуйста, установите эти параметры в соответствии с этой статьёй.
Создайте хост в сети 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
Настройте службу 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
}
Перезагрузите Bird:
$sudo systemctl restart bird
Настройте эластичный IP. Примените эластичный IP, который в режиме ассоциации является внутренним, на консоли QingCloud. Обратите внимание, что EIP должен быть внутренним режимом ассоциации. Если это внешний режим ассоциации, EIP не может быть найден в виртуальной машине. Свяжите этот EIP с виртуальной машиной, где находится симулируемый маршрутизатор. Вам нужно только завершить ассоциацию. Нет необходимости следовать документации QingCloud.
Будет создана новая сетевая карта (обычно eth1), когда IP будет привязан к хосту QingCloud. Запустите ip a
на хосте, чтобы проверить, является ли сетевая карта UP
. Если нет, выполните ip link set up eth1
.
Включите переадресацию портов и отключите фильтрацию пакетов на симулированном маршрутизаторе:
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
Настройте брандмауэр. Проведите некоторые тесты портов на консоли QingCloud.
Настройте правила маршрутизации. Поскольку сетевая карта по умолчанию симулированного маршрутизатора — 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
wget https://github.com/kubesphere/porter/releases/download/v0.1.1/porter.yaml
На моделируемом маршрутизаторе настроено циклическое правило, поэтому этот пакет не будет отброшен. Реальный кластер 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
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
.
kubectl logs -n porter-system controller-manager-0 -c manager # Проверить логи Porter
kubectl describe eip eip-sample # Проверить события
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
Примечание: версия ядра хоста, на котором расположен моделируемый маршрутизатор, должна быть выше 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-адресов и посмотреть, есть ли трафик на каждом узле.
kubectl get pod -o wide
root@master-k8s:~# ip rule
0: from all lookup local
32763: from all to 139.198.121.228 lookup 101
tcpdump -i eth0 port $port
на этих узлах, где $port
— порт, предоставляемый сервисом. В приведённом примере это 8088.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )