Comments 40
Я уже думал, что не осталось спецов способных кластеры без облаков строить!
Вот у меня на одном проекте три кластера к8
Первый поднят руками, второй и третий на Digital Ocean с использованием всех плюшек, включая load balancer.
Когда у меня встала задача изменить 503 страницу на балансере, в первом случае это заняло пол часа с учетом глубокого погружения в документацию. А в других ничего не получилось. Ибо не умеет красивый балансер за 5 баксов в месяц такое делать.
Так что уметь строить такие поделки как в статье жизненно необходимо, хотя бы для того, чтобы потом требовать с облаков расширения плюшек, раз уж дерут деньги.
Вот вы в начале обрисовали проблематику четырёх восьмерок у конечников. А потом собрали днс-кластер (пример действительно не самый лучший).
А потом признали, что без балансировки доп. ресурсы будут простаивать. А потом оказалось, что балансировка — это выход, чтобы перезагружать сервера в маинтенанс когда пожелаешь.
Выходит: мы хотим днем обслуживать (условно) 2 сервера CRM, хотя пользователи и один то не выгребали в половину, а ночью спать. При этом часть (возможно большая) пользователей вообще сидит на другой (8.8.8.8) CRM и чихать хотела на наш сон.
Ничего не понял, но очень интересно.
Не, я, конечно знаю что сейчас уже достаточно нередко используется DoH (изредка возможно и DoT). Но резервировать-балансировать DNS, который на UDP:53 висит при помощи keepalived??? Anycast уже отменили?
Можно поподробнее — как поднять DNS anycast без BGP ?
Anycast, на секунду, абсолютно ортогонален BGP. Можете хоть статические маршруты до серверов руками позабивать и оно будет, в общем-то, работать.
А динамическая маршрутизация нужна уже для того, чтобы полностью автоматически, оперативно и родными для сетей средствами нерабочие машины из "кластера" убирать, рабочие машины добавлять. Можно и BGP поднять, желательно еще и с BFD сессией.
Есть ли современные истории успеха с поднятием keepalived на самих real_server'ах?
То есть когда нет отдельного балансировщика, а, условно говоря, есть всего 2 сервера, на них же и VIP висит и балансировка производится на самих же себя
Мм… У меня всё в локалке и я так понимаю с NAT на DR так просто нельзя перейти?
Если сервер с VIP сам на VIP не ходит — все проще с DR
Если ходит — чуть проще с FWMARK
2 сервера. Запросы приходят на VIP и должны баланситься и на себя и на того парня. Так как это локалка, то попробовал только очевидный вариант с DR, но не взлетело.
А где можно почитать про вариант с FWMARK(именно в контексте двух нод, для большего количества мануалов много, а две ноды даже в документации RedHat не считают за вариант)?
Что с DR могло не взлететь?
Вешаете VIP на lo в scope host и готово.
Может свичи слишком умные и блокирую смену IP/MAC ?
Ну так отключите и будет счастье
Зачем? И так хорошо получилось.
Слишком сложно.
Много лишнего трафика.
А не наоборот? Ведь коммутаторы не просто так держат у себя соответствие IP и MAC. Насколько я понимаю, за счет этого они отправляют трафик только в тот порт, где находится получатель, а не на все порты сразу. За счет этого и экономия.Если это выключить, лишнего трафика будет в разы больше.
Я вешал на lo, по какому-то гайду лохматых годов(там ещё танцы с бубном sysctl практикуются) — http://kb.linuxvirtualserver.org/wiki/Building_Two-Node_Directors/Real_Servers_using_LVS_and_Keepalived
В итоге в tcpdump вижу только SYN от клиента и тишина, до real_server'ов ничего не доходит.
В какую сторону можно покопать?
В целом там все ок, немного лишь устарело.
ip a a vip/32 dev lo scope host решает с arp_anounce/ignore. Ip_forwd не нужен без рутинга на сетевых устройствах.
ipvsadm должен показывать real_server с ненулевым весом и соединения на нем.
Попробуйте выключить rs на ноду с vip-ом — должен быть трафик на второй rs. Обратного трафика с rs не будет — rs отдаёт напрямую клиенту с DR/FWMARK
Трафик должен входить через физический интерфейс на VIP. Иначе дальше lo он не уходит.
Ну и iptables конечно должен пропускать
Пробую на совсем простом стенде: никакого VRRP, первая нода — VS, вторая нода — RS, на ней на lo висит VIP, iptables везде пустые.
При запросе на VS виден только SYN, после чего нода-VS отвечает клиенту ICMP Destination Unreachable (Host Unreachable). На RS при этом вообще нет пакетов.
Куда ещё можно покопать?
С fwmark тоже просто — метите пакеты на VIP в prerouting, вешаете VIP на lo и… вот
Коллеги привет.
На счет статической маршрутизации, можно использовать обычный формат "IP Command Arguments Format" — пруф линк
cat /etc/sysconfig/network-scripts/route-eth0
192.168.1.0/24 dev eth0 src 192.168.1.60 table 101
default via 192.168.1.1 table 101
route-eth0 "курильщика" это ни что иное, как "network/netmask directive format" — пруф линк
Я только один вижу, что один маршрут лишний?
Вот это попадет в таблицу main и не нужно.
ip route add "$vip/32" dev "$dev1" src "$ip1"
По-моему, я пробовал ip формат, и у меня он не взлетел. Когда руки дойдут, попробую настроить по документации, на которую вы дали ссылки.
Потому что надо еще так.
yum install NetworkManager-config-routing-rules
systemctl enable NetworkManager-dispatcher.service
systemctl start NetworkManager-dispatcher.service
Я подозревал, что чего-то такого не хватает.
Кажись, получилось. Видимо, придется дополнить статью.
default via 10.2.1.1 table table0
default via 10.2.1.5 table table1
from 10.2.1.2 table table1
from 10.2.1.6 table table1
Специально добавлял по одному, пока все не заработает, чтобы от лишних маршрутов избавиться. Больше никаких костылей, благодаря Bearpuh.
rule-eth0
from 10.2.1.2 table table1
Точно?
Ну и в моем понимании, так не должен работать интернет.
Что с этим правилом не так? Правила я взял отсюда https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.multiple-links.html
У меня с ними взлетело. Потом удалил из команды префикс ip rule add и хвост записал в rule-eth0. И сейчас все работает зашибись.
Это на одном сервере. На другом — другие ip.
Понял. Вы правы, там table0. Я реальные конфиги не выкладываю, ручками примеры для хабра пишу. Так что интернет работает, а это копипаста.
возможно я перестарался с маршрутами. Я рассуждал так, что в каждой таблице должны быть перечислены одинаковые варианты. Нет ли как в iptables какого-нибудь инструмента выявить неработающие маршруты? Скажем, получить счетчики пакетов, отмаршрутизированных по каждому правилу.
Я обычно использую инструментарий iproute — ip r get
Example D.25. Testing routing tables with ip route get
[root@tristan]# ip -s route get 127.0.0.1/32
ip -s route get 127.0.0.1/32
local 127.0.0.1 dev lo src 127.0.0.1
cache <local> users 1 used 1 mtu 16436 advmss 16396
[root@tristan]# ip -s route get 127.0.0.1/32
local 127.0.0.1 dev lo src 127.0.0.1
cache <local> users 1 used 2 mtu 16436 advmss 16396
Надо бы еще сказать, что согласно документации, скрипты должны помещаться в эту папку
/usr/libexec/keepalived
И не обязательно запускать от рута. В документации описан пользователь keepalived_script.
Это важно, если использовать selinux.
Отказоустойчивый кластер с балансировкой нагрузки с помощью keepalived