Как настроить отказоустойчивые IP-адреса для высокой доступности с Hetzner Online
У меня есть кластер из 3 узлов Ubuntu, работающих в виртуальных машинах в лаборатории, и я хочу перенести его в производство. Hetzner Online hetzner.de предлагает несколько недорогих выделенных серверов, поэтому я арендовал 3 машины, соединенные гигабитным коммутатором.
Мое намерение состоит в том, чтобы создать HA-Setup с двумя keepalived перед 2 HAProxy Server. Keepalived настроен с VIP внутри моей настройки. К сожалению, это не работает с Hetzner. Однако они предоставляют систему, называемую отказоустойчивый IP, где можно переключаться с помощью сценария на другой сервер: http://wiki.hetzner.de/index.php/Failover_Skript
Мой конфиг для keepalived выглядит так:
vrrp_script chk_haproxy {
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
virtual_ipaddress {
192.168.56.101/24 # this is the shared IP I was using
}
track_script {
chk_haproxy
}
}
Так как их сценарий отработки отказа вписывается в это?
Похоже, что я не единственный, у кого проблема, просто решение не так очевидно. https://www.howtoforge.com/community/threads/hetzner-to-stop-support-for-high-availability-setups.19988/
1 ответ
Поскольку это старый ответ, я не уверен, что вы все еще ищете ответ. Но я наткнулся на это в поисках лучшего способа, как это сделать.
Hetzner назначает отказоустойчивый IP-адрес выделенному серверу не для того, чтобы настроить его на сервере, а для маршрутизации трафика на исходный IP-адрес сервера. Поэтому можно ничего не менять на вашем сервере и вручную переключать IP в их интерфейсе администратора. Тем не мение; это не подходящее решение для большинства, так как я не хотел бы вставать с постели, чтобы переключиться вручную. Это должно быть сделано автоматически, а затем уведомить администратора, что аварийное переключение выполнено. Может быть, даже с небольшим отчетом о проблемах, с которыми столкнулась система, и почему она отказала.
Keepalived может сделать это за вас, нужно только настроить keepalived для запуска сценария при сбое. Но если нет IP-адреса для перехода на другой ресурс, как мы можем перейти на другой ресурс?
Просто; создайте внутреннюю сеть между серверами и назначьте свой собственный не маршрутизируемый внутренний IP для keepalived. Поскольку эта внутренняя сеть использует тот же интерфейс, что и внешняя сеть, это не имеет большого значения. Преимущество этого подхода заключается в том, что вы можете сохранить весь внутренний трафик на 100% внутренним, используя этот внутренний VIP.
Как только Keepalived перестанет работать, вы приказываете запустить скрипт из Hetzner, чтобы также переключить внешний ip с помощью: notify
Пример:
vrrp_script chk_haproxy {
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
state MASTER
interface enp0s31f6.4000
virtual_router_id 51
priority 101
virtual_ipaddress {
192.168.100.3/24 # this is the shared IP I was using
}
track_script {
chk_haproxy
}
notify /usr/sbin/hetzner_failoverIP.sh database set $THIS_SERVER_IP
}
Конечно, скрипт Hetzner может быть настроен намного умнее, например, выбрав IP-адрес сервера.
Недостатком, который следует отметить, является то, что внешний IP займет от 40 до 60 секунд. Для меня минимум 40 секунд и максимум 1 минута это слишком долго.
Другим вариантом является использование облачных экземпляров Hetzner для включения HA без использования аварийного IP-адреса и приведенного выше сценария. В облаке есть другое решение: облако с плавающим IP.
Эта опция обойдется вам примерно в 8,50 евро в месяц за:
- два облачных экземпляра (1 базовый процессор, 2 ГБ памяти и 20 ТБ трафика каждый)
- два облачных плавающих IP
Затем используйте keepalived для управления облачным плавающим IP (раздел virtual_ipaddress) и HAProxy для отправки всего трафика на выделенные серверы. HAProxy выполнит проверку здоровья, и вам не нужно беспокоиться о:
- Переключение IP-адресов с помощью Hetzner API
- 40-60 секунд дополнительного простоя
Стоит отметить, что облачные серверы Hetzner не поддерживают внутреннюю сеть. Но это не требуется, если вы используете их таким образом, и это не будет стоить вам дополнительно, поскольку внутренний трафик является бесплатным. В целях безопасности обеспечьте балансировщики нагрузки (облачные экземпляры Keepalived+HAProxy) с помощью SELinux/AppArmor и Firewalld. Используйте зашифрованный трафик между двумя кластерами (cloud <-> Dedicated), чтобы предотвратить перехват пакетов. Я бы также зашифровал трафик между вашими выделенными серверами, даже если вы используете частную VLAN, трафик все еще отправляется через тот же сетевой адаптер. Что-то иметь в виду.
Используемые источники:
- https://wiki.hetzner.de/index.php/Failover/en
- https://wiki.hetzner.de/index.php/Failover_Skript/en
- https://wiki.hetzner.de/index.php/Vswitch/en
- https://wiki.hetzner.de/index.php/Cloud_floating_IP_persistent/en
- https://www.hetzner.com/cloud
- https://twitter.com/hetzner_online/status/955781300513857536