IPVS¶
Коротко¶
IP Virtual Server - балансировщик нагрузки L4 в ядре Linux. Часть проекта LVS (Linux Virtual Server).
Клиент обращается на VIP, IPVS распределяет соединения на real servers. Работает с TCP и UDP.
Три метода доставки: - NAT - изменение dst IP, ответ через балансировщик - DR (Direct Routing) - изменение MAC, ответ напрямую клиенту - TUN (Tunneling) - IPIP инкапсуляция
Используется в keepalived, kube-proxy (Kubernetes).
Методы forwarding¶
NAT (-m)¶
Балансировщик переписывает dst IP с VIP на IP real server. Ответ идет обратно через балансировщик.
- Real servers используют LVS как default gateway
- Поддерживает port mapping (VIP:80 -> RIP:8080)
- Балансировщик обрабатывает весь трафик
- Real servers могут быть в приватной сети
DR (-g)¶
Балансировщик меняет только MAC-адрес. IP остается VIP. Real server отвечает напрямую клиенту.
Client -> [VIP] -> LVS (MAC rewrite) -> Real Server
Client <------------------------------ Real Server
- Real servers должны иметь VIP на loopback (без ARP)
- Не поддерживает port mapping
- Высокая производительность
- Real servers в одном L2 сегменте с LVS
TUN (-i)¶
Балансировщик инкапсулирует пакет в IPIP туннель. Real server декапсулирует и отвечает напрямую.
- Real servers могут быть в разных сетях
- Не поддерживает port mapping
- Требует IPIP на real servers
Schedulers¶
rr - round robin. По очереди.
wrr - weighted round robin. Учитывает weight серверов.
lc - least connections. На сервер с наименьшим числом соединений.
wlc - weighted least connections. lc с учетом weight. По умолчанию.
sh - source hash. Один клиент всегда на один сервер.
dh - destination hash. Для прокси/кешей.
sed - shortest expected delay.
nq - never queue. Сначала на idle серверы.
Команды¶
Установка. Загрузка модуля ядра. Создать сервис (TCP, round robin). Создать сервис (UDP). Добавить real server (NAT, weight 1). Добавить real server (DR, weight 2). Weight 0 - graceful drain. Удалить real server. Удалить сервис. Показать конфигурацию. Статистика. Текущие соединения. Очистить все правила. Сохранить/восстановить.Примеры¶
HTTP балансировщик (NAT)¶
echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm -A -t 192.168.1.100:80 -s wlc
ipvsadm -a -t 192.168.1.100:80 -r 10.0.0.10:80 -m -w 1
ipvsadm -a -t 192.168.1.100:80 -r 10.0.0.11:80 -m -w 1
Real servers: default gateway на IP балансировщика.
HTTP балансировщик (DR)¶
На балансировщике:
ip addr add 192.168.1.100/32 dev eth0
ipvsadm -A -t 192.168.1.100:80 -s wlc
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.10:80 -g -w 1
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11:80 -g -w 1
На каждом real server:
ip addr add 192.168.1.100/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
Persistence¶
Клиент привязан к серверу на 300 секунд.