
Привет! Хочу поделиться реализованным кейсом на тему георезервирования между двумя инфраструктурными площадками. Эта информация может быть полезной для компаний или коллективов, которым нужно обеспечить доступность критически важных сервисов, даже если один из инфраструктурных сегментов (ЦОДов) выйдет из строя.
На схеме продемонстрировано: способ подключения площадок между собой (direct connect), компоненты с настроенным пирингом (t0 asa), узлы haproxy и bird (ha1 ha2), а также критический сервис, состоящий из двух application узлов (app1 app2) и арбитра, руководящего процессом переключения в случае отказа основного узла (ControlNode).
Смысл состоит в ситуации, что если основная правая цепочка (dc asa -> ha1 -> app1) выходит из строя, то vip (10.10.1.15), как и критический app, все-равно остается доступен для серверного и пользовательского сегментов. Заранее могу сказать, что арбитр, стоящий в отличном от данных площадок месте, в случае выхода из строя никакой критики не несет.
С правой стороны маршрутизацией занимается asa cluster, который выступает в качестве пира для haproxy.
interface Port-channel47.137
bfd interval 500 min_rx 500 multiplier 3 ##таймеры bfd на интерфейсе
interface Port-channel47.180
bfd interval 500 min_rx 500 multiplier 3 ##таймеры bfd на интерфейсе
neighbor 10.100.1.11 remote-as 65668 ##сосед 1
neighbor 10.100.1.11 description * PAM *
neighbor 10.100.1.11 password 0 *****
neighbor 10.100.1.11 version 4
neighbor 10.100.1.11 fall-over bfd ##включеный bfd
neighbor 10.100.1.11 activate
neighbor 10.100.1.11 default-originate ##анонс дефолта
neighbor 10.100.1.11 prefix-list BGPAnycast_IN in ##что принимаем от соседа
neighbor 10.100.1.11 prefix-list BGPAnycast_OUT out ##что отдаём соседу
##Префис листы что принимаем, что отдаём
prefix-list BGPAnycast_IN seq 10 permit 10.10.1.0/24 le 32
!
prefix-list BGPAnycast_OUT seq 5 permit 0.0.0.0/0 На основании данного конфига ASA, конфигурация bird выполнена следующим образом:
log syslog all;
router id 10.100.1.11;
filter OUT {
if net ~ [ 10.10.1.15/32 ] then accept;
reject;
}
filter IN {
if net ~ [ 0.0.0.0/0 ] then accept;
reject;
}
protocol device {
debug { states,routes,filters,interfaces,events,packets };
}
protocol direct {
# disabled;
interface "ens160";
}
protocol kernel {
learn;
persist;
scan time 10;
import all;
export all;
graceful restart;
}
template bgp bgp_template {
debug { states,routes,filters,interfaces,events,packets };
description "Connection to BGP peer";
local as 65668;
gateway recursive;
add paths on;
graceful restart;
connect delay time 2;
connect retry time 5;
error wait time 5,30;
import filter IN;
export filter OUT;
bfd on;
}
protocol bgp ASA from bgp_template {
neighbor 10.100.1.1 as 65500;
source address 10.100.1.11;
password "ваш пароль";
}
# bfd
protocol bfd {
interface "ens160" {
min rx interval 500 ms;
multiplier 3;
};
import all;
export none;
neighbor 10.100.1.1;
}
protocol static {
route 10.10.1.15/32 via "ens160";
}С левой стороны tier-0 gateway, но к сожалению поделится конфигурацией на уровне сетевых компонентов не могу, т.к. настраивалось коллегами предоставляющими данный инфраструктурный сервис/площадку.
Конфигурация bird с левой стороны выполнена следующим образом:
log syslog all;
router id 10.50.1.5;
filter OUT {
if net ~ [ 10.10.1.15/32 ] then accept;
reject;
}
filter IN {
if net ~ [ 0.0.0.0/0 ] then accept;
reject;
}
protocol device {
debug { states,routes,filters,interfaces,events,packets };
}
protocol direct {
# disabled;
interface "ens160";
}
protocol kernel {
learn;
persist;
scan time 10;
import all;
export all;
graceful restart;
}
template bgp bgp_template {
debug { states,routes,filters,interfaces,events,packets };
description "Connection to BGP peer";
local as 65668;
gateway recursive;
add paths on;
graceful restart;
connect delay time 2;
connect retry time 5;
error wait time 5,30;
import filter IN;
export filter OUT;
bfd on;
}
protocol bgp CLOUD_TO_1 from bgp_template {
neighbor 10.50.1.11 as 4241300161;
source address 10.50.1.5;
password "ваш пароль";
}
protocol bgp CLOUD_TO_2 from bgp_template {
neighbor 10.50.1.12 as 4241300161;
source address 10.50.1.5;
password "ваш пароль";
}
protocol bfd {
interface "ens160" {
min rx interval 500 ms;
multiplier 3;
};
import all;
export none;
neighbor 10.50.1.11;
neighbor 10.50.1.12;
}
protocol static {
route 10.10.1.15/32 via "ens160";
}Стоит также добавить, что узлы HAProxy, после настройки BIRD, убирают на уровне ОС шлюз, так как BGP-пиринг самостоятельно предоставит шлюз вместе с требуемыми маршрутами. Узлы BIRD + HAProxy работают в составе Ubuntu 22.04. В качестве интерфейса для VIP выполнен dummy-адаптер, который описан в netplan. Для адаптера добавлена служба, чтобы в случае перезапуска узла IP (10.10.1.15) автоматически поднимался.
Ну и пример конфигурации haproxy для правой стороны
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option tcplog
option dontlognull
option http-server-close
option log-health-checks
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 15m
timeout server 15m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats
mode http
bind *:7000
stats enable
stats uri /
listen ssh
bind *:22
mode tcp
option allbackups
default-server inter 3s fall 2 rise 2 on-marked-down shutdown-sessions
server ha1 ha1:22 check
server ha2 ha2:22 check backup