Я играю с keepalived и запускаю эту настройку на своем главном узле:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass XXXXXXXXXXXXXXXXXXXXXXXXX
}
virtual_ipaddress {
192.168.178.200/32 dev eth0
192.168.178.201/32 dev eth0
}
}
virtual_server 192.168.178.201 8443 {
delay_loop 10
protocol TCP
lb_algo rr
lb_kind DR
real_server 192.168.178.210 8443 {
weight 1
TCP_CHECK {
connect_timeout 5
}
}
real_server 192.168.178.211 8443 {
weight 1
TCP_CHECK {
connect_timeout 5
}
}
real_server 192.168.178.212 8443 {
weight 1
TCP_CHECK {
connect_timeout 5
}
}
}
На подчиненных узлах у меня такая же установка с более низким priority
и state BACKUP
.
По причинам тестирования 2 из 3 узлов отключены, и я ожидал, что VIP (.201
) балансирует трафик на 192.168.178.211:8443
. (.212
и 213
не в сети, .211
онлайн) Я столкнулся с таким поведением 192.168.178.201:8443
доступен только в том случае, если ГЛАВНЫЙ узел - это тот же компьютер, что и доступный серверный компьютер.
В моем случае это означает, что 192.168.178.211:8443
доступен только если 192.168.178.211
является ГЛАВНЫМ узлом. Если т.е. 192.168.178.212
это МАСТЕР-узел, на который не направляется трафик 192.168.178.211:8443
.
sysctl.conf:
#keepalived
net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_forward=1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.rp_filter = 2
Кто может мне в этом помочь?
Я понял из вашего вопроса и комментариев, что балансировщики нагрузки и реальные серверы - это одни и те же машины.
Согласно Документация Redhat:
Доступ к виртуальному IP от балансировщиков нагрузки или одного из реальных серверов не поддерживается. Точно так же не поддерживается настройка балансировщика нагрузки на тех же машинах, что и реальный сервер.
Однако это все еще возможно согласно База знаний LVS, но требует немного больше усилий для настройки.
Основываясь на вашем примере, давайте возьмем настройку 3 узлов без сценария отслеживания с одним виртуальным IP-адресом для keepalived-2.0.19
в CentOS 7:
192.168.178.201
192.168.178.210
с приоритетом 150192.168.178.211
с приоритетом 100192.168.178.212
с приоритетом 50Тогда возможная конфигурация для keepalived:
На узле 1
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 150
advert_int 1
virtual_ipaddress {
192.168.178.201/32
}
}
virtual_server 192.168.178.201 {
lvs_sched rr
lvs_method DR
protocol TCP
persistence_timeout 50
delay_loop 10
real_server 192.168.178.210 {
TCP_CHECK {
connect_timeout 5
connect_port 8443
}
}
real_server 192.168.178.211 {
TCP_CHECK {
connect_timeout 5
connect_port 8443
}
}
real_server 192.168.178.212 {
TCP_CHECK {
connect_timeout 5
connect_port 8443
}
}
}
На узле 2
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.178.201/32
}
}
virtual_server 192.168.178.201 {
lvs_sched rr
lvs_method DR
protocol TCP
persistence_timeout 50
delay_loop 10
real_server 192.168.178.211 {
TCP_CHECK {
connect_timeout 5
connect_port 8443
}
}
real_server 192.168.178.212 {
TCP_CHECK {
connect_timeout 5
connect_port 8443
}
}
}
На узле 3
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
virtual_ipaddress {
192.168.178.201/32
}
}
virtual_server 192.168.178.201 {
lvs_sched rr
lvs_method DR
protocol TCP
persistence_timeout 50
delay_loop 10
real_server 192.168.178.212 {
TCP_CHECK {
connect_timeout 5
connect_port 8443
}
}
}
NB: на каждом узле LVS настроен в соответствии с его приоритетом (все меньше и меньше real_server
). Если вы настроите LVS симметрично, пакеты будут бесконечно отправляться туда и обратно между узлами и никогда не отвечал.
Вам необходимо добавить виртуальный IP-адрес в качестве адреса обратной связи на всех узлах. В противном случае узлы BACKUP получают сообщения TCP от балансировщика нагрузки, но не знают, что с ними делать.
На всех узлах в /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.178.201
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback
На всех узлах в /etc/sysconfig/network
добавьте строку
GATEWAYDEV=eth0
На всех узлах, настроить параметры ядра
net.ipv4.conf.ens192.arp_ignore = 1
net.ipv4.conf.ens192.arp_announce = 2
net.ipv4.ip_forward = 1