Pull to refresh

Comments 40

Я уже думал, что не осталось спецов способных кластеры без облаков строить!

Вот у меня на одном проекте три кластера к8
Первый поднят руками, второй и третий на Digital Ocean с использованием всех плюшек, включая load balancer.
Когда у меня встала задача изменить 503 страницу на балансере, в первом случае это заняло пол часа с учетом глубокого погружения в документацию. А в других ничего не получилось. Ибо не умеет красивый балансер за 5 баксов в месяц такое делать.


Так что уметь строить такие поделки как в статье жизненно необходимо, хотя бы для того, чтобы потом требовать с облаков расширения плюшек, раз уж дерут деньги.

Вот вы в начале обрисовали проблематику четырёх восьмерок у конечников. А потом собрали днс-кластер (пример действительно не самый лучший).
А потом признали, что без балансировки доп. ресурсы будут простаивать. А потом оказалось, что балансировка — это выход, чтобы перезагружать сервера в маинтенанс когда пожелаешь.


Выходит: мы хотим днем обслуживать (условно) 2 сервера CRM, хотя пользователи и один то не выгребали в половину, а ночью спать. При этом часть (возможно большая) пользователей вообще сидит на другой (8.8.8.8) CRM и чихать хотела на наш сон.


Ничего не понял, но очень интересно.

А кроме round robin других алгоритмов балансировки не предусмотрено?

Не, я, конечно знаю что сейчас уже достаточно нередко используется DoH (изредка возможно и DoT). Но резервировать-балансировать DNS, который на UDP:53 висит при помощи keepalived??? Anycast уже отменили?

На вкус и цвет все фломастеры разные. Мне мое решение OK.

Можно поподробнее — как поднять DNS anycast без BGP ?

Anycast, на секунду, абсолютно ортогонален BGP. Можете хоть статические маршруты до серверов руками позабивать и оно будет, в общем-то, работать.
А динамическая маршрутизация нужна уже для того, чтобы полностью автоматически, оперативно и родными для сетей средствами нерабочие машины из "кластера" убирать, рабочие машины добавлять. Можно и BGP поднять, желательно еще и с BFD сессией.

Можно практический пример?
У меня два vps, в России и США.
Я хочу anycast DNS (IP один, США ходит в США, Россия в Россию)
Как сделать ?

Есть ли современные истории успеха с поднятием keepalived на самих real_server'ах?
То есть когда нет отдельного балансировщика, а, условно говоря, есть всего 2 сервера, на них же и VIP висит и балансировка производится на самих же себя

Вот оно здесь и описано. real_server и virtual_server — это одни и те же сервера.

Мм… У меня всё в локалке и я так понимаю с NAT на DR так просто нельзя перейти?

Коммутаторам DR не нравится, они дропают ответные пакеты, так как в них mac не соответствует IP

Если сервер с VIP сам на VIP не ходит — все проще с DR
Если ходит — чуть проще с FWMARK

2 сервера. Запросы приходят на VIP и должны баланситься и на себя и на того парня. Так как это локалка, то попробовал только очевидный вариант с DR, но не взлетело.
А где можно почитать про вариант с FWMARK(именно в контексте двух нод, для большего количества мануалов много, а две ноды даже в документации RedHat не считают за вариант)?

Что с DR могло не взлететь?
Вешаете VIP на lo в scope host и готово.
Может свичи слишком умные и блокирую смену IP/MAC ?

Ну так отключите и будет счастье

Зачем? И так хорошо получилось.

Слишком сложно.
Много лишнего трафика.

А не наоборот? Ведь коммутаторы не просто так держат у себя соответствие IP и MAC. Насколько я понимаю, за счет этого они отправляют трафик только в тот порт, где находится получатель, а не на все порты сразу. За счет этого и экономия.Если это выключить, лишнего трафика будет в разы больше.

Port security отключается на каждом отдельном порту коммуникатора и предназначен в первую очередь для привязки mac/ip клиента. Так себе защита.
В случае DR на одном порту будет два 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

Я подозревал, что чего-то такого не хватает.

Кажись, получилось. Видимо, придется дополнить статью.


route-eth0

default via 10.2.1.1 table table0


route-eth1

default via 10.2.1.5 table table1


rule-eth0

from 10.2.1.2 table table1


rule-eth1

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.

А где? Я правил политику selinux у себя. Notify у меня от рута, потому что я хотел записать в каталог, куда у меня только рут может писать.

Sign up to leave a comment.

Articles