Пытаюсь настроить серверы бастиона высокой доступности. Отказоустойчивость, балансировка нагрузки не требуется. Два сервера под управлением debian. бастион01 и бастион02. 192.168.0.10 и 192.168.0.11. Плавающий IP-адрес - 192.168.0.12.
Я начал с этих конфигов:
bastion01:
global_defs {
notification_email {
dev@null.com
}
notification_email_from lb1@mydomain.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.12
}
}
бастион02:
global_defs {
notification_email {
dev@null.com
}
notification_email_from lb2@mydomain.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.12
}
}
Это прекрасно работает. Подтверждено, что плавающий IP-адрес переключится при отказе при завершении работы любого из серверов.
Однако он не обрабатывает случай, когда ssh остановлен, но сам сервер все еще работает.
Для этого мне нужно добавить проверку TCP.
Похоже, что в документации keepalived есть пример:
http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html
Однако их пример включает в себя балансировку нагрузки, которая просто добавляет еще один уровень сложности, который меня не интересует.
Похоже, что рассматриваемый блок:
TCP_CHECK {connect_timeout 3 connect_port 22}
Я попытался предположить, как это настроить:
bastion01:
global_defs {
notification_email {
dev@null.com
}
notification_email_from lb1@mydomain.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.12
}
}
real_server 192.168.0.10 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
real_server 192.168.0.11 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
бастион02:
global_defs {
notification_email {
dev@null.com
}
notification_email_from lb2@mydomain.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.12
}
}
real_server 192.168.0.10 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
real_server 192.168.0.11 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
Но это не сработало, он не понял блоки real_server. Ладно, ладно, может быть, мне не обойтись только с отработкой отказа, может быть, проверка tcp является частью lb-компонента keepalived, поэтому я должен использовать здесь балансировку нагрузки. Это нормально, не повредит. Итак ... конфиги теперь становятся (взяты прямо из http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html ):
bastion01:
global_defs {
notification_email {
dev@null.com
}
notification_email_from lb1@mydomain.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.12
}
}
virtual_server 192.168.1.11 22 {
delay_loop 6
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
protocol TCP
real_server 192.168.0.10 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
real_server 192.168.0.11 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
}
бастион02:
global_defs {
notification_email {
dev@null.com
}
notification_email_from lb2@mydomain.com
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 101
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.12
}
}
virtual_server 192.168.1.11 22 {
delay_loop 6
lb_algo rr
lb_kind NAT
nat_mask 255.255.255.0
protocol TCP
real_server 192.168.0.10 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
real_server 192.168.0.11 22 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 22
}
}
}
Это просто не работает.
Когда я останавливаю ssh на bastion01 и пытаюсь подключиться к плавающему ip, я получаю отказ в соединении, ip не переключается на bastion02.
В логах на bastion01:
bastion01 Keepalived_healthcheckers[11613]: Check on service [192.168.0.10]:22 failed after 1 retry.
bastion01 Keepalived_healthcheckers[11613]: Removing service [192.168.0.10]:22 from VS [192.168.1.11]:22
Как мне убедить keepalived переключить плавающий IP-адрес при сбое проверки работоспособности TCP?
Если вам не нужна балансировка нагрузки, сценарии отслеживания предлагают аварийное переключение на основе проверок, выполняемых для вашей службы.
Сначала добавьте vrrp_script
блокировать перед ваш vrrp_instance
:
global_defs {
enable_script_security
}
vrrp_script chk_sshd {
script "/usr/bin/pgrep sshd" # or "nc -zv localhost 22"
interval 5 # default: 1s
}
Затем добавьте track_script
на ваш vrrp_instance
ссылаясь на vrrp_script
:
vrrp_instance VI_1 {
... other stuff ...
track_script {
chk_sshd
}
}
Хотя это и не обязательно, enable_script_security
и полное доменное имя исполняемого файла обеспечивают некоторые гарантии против злонамеренных действий и подавляют предупреждения в журналах. Видеть страница руководства Keepalived для получения дополнительной информации.