Использование haproxy/iptables + etcd + confd для автоматического...
TRANSCRIPT
![Page 1: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/1.jpg)
Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях
Сергей Пузырёв
![Page 2: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/2.jpg)
Service-oriented architecture
1. Приложение состоит из множества слабо связанных сервисов, которые общаются друг с другом с использованием четко определённого API.
2. Сервисы ничего не знают о клиентах, их задача – оказывать сервис.
3. Клиента не волнует, каким образом работает сервис.
4. Сервисы используют другие сервисы.
![Page 3: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/3.jpg)
Service-oriented architecture
Что такое сервис?
1. У сервиса есть интерфейс – API.2. Сервис имеет точку входа (endpoint) – обычно пара
IP:port.3. Сервис может пользоваться другими сервисами. В
этом случае он должен быть правильно сконфигурирован.
![Page 4: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/4.jpg)
Service-oriented architecture
Пример сервиса - memcached:1. API: стандартный протокол memcached.2. Endpoint: например, 10.0.0.7:11211.3. Сервисы, которыми пользуется memcached,
отсутствуют.
Client Memcached
![Page 5: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/5.jpg)
Service-oriented architecture
Пример сервиса - mcrouter: (github.com/facebook/mcrouter)1. API: стандартный протокол memcached.2. Endpoint: например, 10.0.0.6:11211.3. Mcrouter пользуется двумя сервис memcached.
Endpoint сервиса memcached забит в конфиг mcrouter.
Client Mcrouter
MemcachedMemcached
![Page 6: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/6.jpg)
Service-oriented architecture
Несложное PHP-приложение:
Php-fpm
Memcached
MySQLslave
Nginx
Php-fpm
MySQLmaster Memcached
Mcrouter
Staticstorage
16 отношений client<->service
![Page 7: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/7.jpg)
Service-oriented architecture
Сложное приложение (мопед не мой):
![Page 8: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/8.jpg)
![Page 9: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/9.jpg)
Как связывать сервисы друг с другом?Дешево и сердито: хардкод endpoint’ов в конфиги.
Плюсы:1. Очень быстрый старт.2. Просто, нужен только vim.3. Ничего не ломается само.
Минусы:4. Не работает в большом проекте.5. Требуется вручную поддерживать документацию.6. Сложно вносить массовые изменения, подключать
новые инстансы сервисов, мигрировать сервисы.
![Page 10: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/10.jpg)
Как связывать сервисы друг с другом?Дешево и сердито: DNS + хардкод.
Плюсы:1. Лишь немного сложнее хардкода IP-адресов.2. Почти так же просто, нужен только vim и DNS-
сервер.3. Проще вносить массовые изменения.
Минусы:4. По прежнему не работает в большом проекте.5. Так же требуется вручную поддерживать
документацию.6. Сложно подключать новые инстансы сервисов.7. Асинхронность внесения изменений, лаги.8. Софт часто не перерезолвливает записи.
![Page 11: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/11.jpg)
Появляются сотни сервисов. Потом тысячи.
![Page 12: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/12.jpg)
Как связывать сервисы друг с другом?Системы управления конфигурацией (Puppet, SaltStack, etc.).
Плюсы:1. При правильной организации проще вносить
изменения.2. Один инструмент для всего.
Минусы:3. Медленно!4. При неправильной организации вносить изменения
становится очень сложно.5. Неактуальная документация продолжает
существовать.
![Page 13: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/13.jpg)
Как связывать сервисы друг с другом?Пусть роботы всё делают за нас!Системы service-discovering’а.
![Page 14: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/14.jpg)
Service-discovering
Что это такое?
Система обнаружения сервисов (СОС) – специальный сервис, в котором другие сервисы могут делать две вещи:1. Регистрироваться (записывать свой endpoint).2. Находить другие сервисы (читать предварительно
зарегистрированные endpoint’ы других сервисов).
Часто системы обнаружения сервисов предоставляют также сервис распределённых блокировок.
Примеры:Zookeeper, etcd, consul, SkyDNS, etc.
![Page 15: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/15.jpg)
Service-discovering
Etcd: что это такое и как с этим жить?github.com/coreos/etcd
Etcd - высоконадёжное распределенное хранилище параметров конфигурации, задаваемых в форме key->value.
Etcd также можно использовать как систему распределенных блокировок.
![Page 16: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/16.jpg)
Service-discovering
Confd: что это такое и зачем оно нужно?www.confd.io
Confd - легковесная система конфигурации, специально созданная для отслеживания данных в etcd, шаблонизирования конфигов и перезапуска приложений при изменении данных в etcd.
NB: нередко вместо Confd можно использовать скрипт на bash, наподобие while true ; do smth ; done .
![Page 17: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/17.jpg)
Service-discovering
Etcd
Client
Confd
Announcer
Mcrouter
Announcer
Memcached
Announcer
Memcached
Confd
![Page 18: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/18.jpg)
Как связывать сервисы друг с другом?Системы service-discovering’а:
Плюсы:1. Очень быстрое внесение изменений.2. Не требуется документировать, что где работает и
как должно быть сконфигурировано.
Минусы:3. Сложно.4. Страшно – “а вдруг развалится?”.5. Внешние сущности в виде confd и announcer’а. В
идеале нужно обучать сервисы общаться с etcd напрямую.
![Page 19: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/19.jpg)
Как связывать сервисы друг с другом?Что мы хотели?
1. Приложения не должны постоянно перезапускаться (до свидания, confd).
2. Мы не хотели привязывать тонны legacy-кода наших приложений к СОС.
3. Облегчить миграцию сервисов на новые endpoint’ы, не требующую переконфигурации тысяч других сервисов (ради чего и затевалось).
4. Приложение не должно деградировать в условиях сломавшейся СОС, выключившегося датацентра, тормозящей сети и т.п. более, чем деградировало бы без СОС.
![Page 20: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/20.jpg)
Как связывать сервисы друг с другом?
![Page 21: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/21.jpg)
Как связывать сервисы друг с другом?Трудно связать сервисы друг с другом?
Давайте инкапсулируем связь между сервисами в отдельный сервис!
![Page 22: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/22.jpg)
Etcd + iptables/HAproxy + confdБыло так:
Etcd
Client
Confd
Announcer
Mcrouter
Announcer
Memcached
Announcer
Memcached
Confd
![Page 23: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/23.jpg)
Etcd + iptables/HAproxy + confdА стало так:
Etcd
Client
Confd
Announcer
Mcrouter
Announcer
Memcached
Announcer
Memcached
Confd
HAProxy
![Page 24: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/24.jpg)
Etcd + iptables/HAproxy + confdПочему так?
1. Некоторые приложения трудно перезапускать.2. Постоянно писать шаблоны к разному софту
утомляет.3. Бесплатная статистика от HAproxy.4. В простых кейсах получаем еще и бесплатную
балансировку.
Что плохо?
1. HAproxy не умеет в UDP.
![Page 25: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/25.jpg)
Etcd + iptables/HAproxy + confdА iptables DNAT умеет:
Confd Confd
Etcd
iptablesDNAT
iptablesDNAT
Client statsdCarbon
(Graphite)
![Page 26: Использование haproxy/iptables + etcd + confd для автоматического service-discovering’а в переменчивых сетях](https://reader035.vdocuments.pub/reader035/viewer/2022062308/55c8ed59bb61eb512b8b4748/html5/thumbnails/26.jpg)
Результат
1. Миграции сервисов становятся безболезненными.2. Добавление новых инстансов сервисов в простых
кейсах (когда можно просто добавить инстанс в пул HAProxy) происходит очень легко.
3. Нельзя забыть что-то переконфигурировать.4. Новых конфигов требуют только новые типы
сервисов.