Aviasales: миграция поискового движка в docker / Дмитрий...

198
Миграция поискового движка в Docker Дмитрий Кузьменков www.aviasales.ru

Transcript of Aviasales: миграция поискового движка в docker / Дмитрий...

Page 1: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Миграция поискового движка в Docker

Дмитрий Кузьменковwww.aviasales.ru

Page 2: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

aviasales.ru

Page 3: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 1 500 000 поисков в день

aviasales.ru

Page 4: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 1 500 000 поисков в день

++ 1 000 поисков в минуту в пики

aviasales.ru

Page 5: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 1 500 000 поисков в день

++ Поиск – опрос 200 партнеров в realtime

++ 1 000 поисков в минуту в пики

aviasales.ru

Page 6: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 1 500 000 поисков в день

++ 15 000 предложений в одном ответе

++ Поиск – опрос 200 партнеров в realtime

++ 1 000 поисков в минуту в пики

aviasales.ru

Page 7: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 1 500 000 поисков в день

++ 15 000 предложений в одном ответе

++ Поиск – опрос 200 партнеров в realtime

++ 1 минута на отдачу билетов

++ 1 000 поисков в минуту в пики

aviasales.ru

Page 8: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Yasen – что за зверь?

Page 9: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Yasen – что за зверь?++ Yet Another Search ENgine

Page 10: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Yasen – что за зверь?++ Yet Another Search ENgine

++ Python 3.4 & Tornado 4.2

Page 11: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Yasen – что за зверь?++ Yet Another Search ENgine

++ 8 серверов

++ Python 3.4 & Tornado 4.2

Page 12: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Yasen – что за зверь?++ Yet Another Search ENgine

++ 8 серверов

++ Python 3.4 & Tornado 4.2

++ Первый ответ за 200 ms

Page 13: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

Page 14: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

HAProxy

Page 15: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

HAProxy

bee.0

bee.1

bee.2

bee.3

Page 16: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

HAProxy

bee.0

bee.1

bee.2

bee.3

queue

Page 17: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

HAProxy

bee.0

bee.1

bee.2

bee.3

ant.0

ant.1queue

Page 18: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

HAProxy

bee.0

bee.1

bee.2

bee.3

ant.0

ant.1

Redis

queue

Page 19: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

HAProxy

bee.0

bee.1

bee.2

bee.3

MySQLPostgres

RedisRabbitMQ

ant.0

ant.1

Redis

queue

Page 20: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Как оно работает

HAProxy

bee.0

bee.1

bee.2

bee.3

MySQLPostgres

RedisRabbitMQ

ant.0

ant.1

Redis

watcher configs

queue

Page 21: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Пчела (bee)

Page 22: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Пчела (bee)++ Обслуживает HTTP-запросы на поиск

Page 23: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Пчела (bee)++ Обслуживает HTTP-запросы на поиск

++ Асинхронная на Tornado

Page 24: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Пчела (bee)++ Обслуживает HTTP-запросы на поиск

++ Асинхронная на Tornado

++ Цикл жизни 30 минут

Page 25: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Пчела (bee)++ Обслуживает HTTP-запросы на поиск

++ Асинхронная на Tornado

++ Цикл жизни 30 минут

++ 16 пчел на одной ноде

Page 26: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Наблюдатель (watcher)

Page 27: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Наблюдатель (watcher)++ 1 процесс на одну ноду

Page 28: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Наблюдатель (watcher)++ 1 процесс на одну ноду

++ Следит за изменениями файлов настроек

Page 29: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Наблюдатель (watcher)++ 1 процесс на одну ноду

++ Следит за изменениями файлов настроек

++ Обновляет настройки пчел в runtime

Page 30: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Муравей (ant)

Page 31: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Муравей (ant)++ Приоритеты: low, normal, high

Page 32: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Муравей (ant)++ Приоритеты: low, normal, high

++ Шлёт информацию о найденных билетах в Redis

Page 33: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Муравей (ant)++ Приоритеты: low, normal, high

++ Шлёт информацию о найденных билетах в Redis

++ Сохраняет статистику в разные базы данных

Page 34: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Муравей (ant)++ Приоритеты: low, normal, high

++ Шлёт информацию о найденных билетах в Redis

++ Сохраняет статистику в разные базы данных

++ Stateless

Page 35: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Очередь (burlesque)

Page 36: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Очередь (burlesque)++ 1 процесс на одну ноду

Page 37: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Очередь (burlesque)++ 1 процесс на одну ноду

++ Go + leveldb

Page 38: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Очередь (burlesque)++ 1 процесс на одну ноду

++ Go + leveldb

++ Умеет 3000+ rps concurrent read/write

Page 39: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Очередь (burlesque)++ 1 процесс на одну ноду

++ Go + leveldb

++ Умеет 3000+ rps concurrent read/write

++ Простой HTTP-интерфейс для работы

Page 40: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Очередь (burlesque)++ 1 процесс на одну ноду

++ Go + leveldb

++ Умеет 3000+ rps concurrent read/write

++ Простой HTTP-интерфейс для работы

++ Opensource: https://github.com/KosyanMedia/burlesque

Page 41: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Что же не так?

Page 42: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Что же не так?++ Время на подъем сервиса для разработки

Page 43: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Что же не так?

++ 2 часа на деплой всей системы

++ Время на подъем сервиса для разработки

Page 44: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Что же не так?

++ 2 часа на деплой всей системы

++ Monit – тупит на большом количестве процессов

++ Время на подъем сервиса для разработки

Page 45: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Что же не так?

++ 2 часа на деплой всей системы

++ Chef – настройка серверов

++ Monit – тупит на большом количестве процессов

++ Время на подъем сервиса для разработки

Page 46: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Контейнеризация?

Page 47: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Зачем?

Page 48: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Зачем?++ Единое окружение везде

Page 49: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Зачем?++ Единое окружение везде

++ Сборка образа где угодно

Page 50: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Зачем?++ Единое окружение везде

++ Ориентирован на DevOps

++ Сборка образа где угодно

Page 51: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Зачем?++ Единое окружение везде

++ Ориентирован на DevOps

++ Никаких правок на горячую в коде production

++ Сборка образа где угодно

Page 52: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Зачем?++ Единое окружение везде

++ Ориентирован на DevOps

++ Никаких правок на горячую в коде production

++ Простота отката

++ Сборка образа где угодно

Page 53: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Оркестрация?

Page 54: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ Kubernetes

Оркестрация?

Page 55: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ Kubernetes

++ Rancher

Оркестрация?

Page 56: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ Kubernetes

++ Rancher

++ Swarm

Оркестрация?

Page 57: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Kubernetes

Page 58: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Kubernetes++ By Google

Page 59: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Kubernetes++ By Google

++ Хорош для большого количества хостов

Page 60: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Kubernetes++ By Google

++ Хорош для большого количества хостов

++ Сложность

Page 61: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Rancher

Page 62: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Rancher++ Функциональный web-интерфейс

Page 63: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Rancher++ Функциональный web-интерфейс

++ Работает с другими оркестрациями

Page 64: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Rancher++ Функциональный web-интерфейс

++ Работает с другими оркестрациями

++ Относительно молодой

Page 65: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Swarm

Page 66: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Swarm++ Идет в комплекте с Docker

Page 67: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Swarm++ Идет в комплекте с Docker

++ Самый легкий из всех альтернатив

Page 68: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Swarm++ Идет в комплекте с Docker

++ Самый легкий из всех альтернатив

++ Прост в использовании

Page 69: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В поисках серебряной пули

Page 70: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В поисках серебряной пули++ Хочется прозрачности

Page 71: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В поисках серебряной пули++ Хочется прозрачности

++ Простые вещи дешевле поддерживать

Page 72: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В поисках серебряной пули++ Хочется прозрачности

++ Простые вещи дешевле поддерживать

++ Ещё одна технологическая прослойка

Page 73: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В поисках серебряной пули++ Хочется прозрачности

++ Простые вещи дешевле поддерживать

++ Ещё одна технологическая прослойка

++ Вероятность вернуться к прошлой инфраструктуре

Page 74: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В поисках серебряной пули++ Хочется прозрачности

++ Простые вещи дешевле поддерживать

++ Ещё одна технологическая прослойка

++ Вероятность вернуться к прошлой инфраструктуре

++ Время, время, время…

Page 75: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Docker – это же просто!

Page 76: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Docker – это же просто!++ docker build

Page 77: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Docker – это же просто!++ docker build

++ docker-compose

Page 78: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Docker – это же просто!++ docker build

++ docker-compose

++ BASH объединяет <3

Page 79: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Docker – это же просто!++ docker build

++ docker-compose

++ profit!

++ BASH объединяет <3

Page 80: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Dockerfile – сердце контейнера

Page 81: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Dockerfile – сердце контейнера++ Простой набор команд

Page 82: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Dockerfile – сердце контейнера++ Простой набор команд

++ RUN

Page 83: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Dockerfile – сердце контейнера++ Простой набор команд

++ RUN

++ COPY

Page 84: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Dockerfile – сердце контейнера++ Простой набор команд

++ RUN

++ COPY

++ ENV

Page 85: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Dockerfile – сердце контейнера++ Простой набор команд

++ RUN

++ COPY

++ ENV

++ To be continued...

Page 86: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблемы? Конечно!

Page 87: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблемы? Конечно!++ Root по умолчанию

Page 88: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблемы? Конечно!++ Root по умолчанию

++ Наследуется от одного образа

Page 89: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблемы? Конечно!++ Root по умолчанию

++ Наследуется от одного образа

++ Слишком толсто – если плодить слои

Page 90: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблемы? Конечно!++ Root по умолчанию

++ Наследуется от одного образа

++ Слишком толсто – если плодить слои

++ COPY всегда root

Page 91: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблемы? Конечно!++ Root по умолчанию

++ Наследуется от одного образа

++ Слишком толсто – если плодить слои

++ COPY всегда root

++ COPY в конце или “прощай, кэш”

Page 92: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Контейнерный root

Page 93: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Контейнерный root++ Root в контейнере = root на host-машине

Page 94: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ Создаваемые файлы тоже root

Контейнерный root++ Root в контейнере = root на host-машине

Page 95: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ Создаваемые файлы тоже root

Контейнерный root++ Root в контейнере = root на host-машине

++ Процесс может не встать из-под root

Page 96: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ Создаваемые файлы тоже root

Контейнерный root++ Root в контейнере = root на host-машине

++ Процесс может не встать из-под root

++ Non-root – наш выбор

Page 97: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Linux capabilities по умолчанию

Page 98: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Linux capabilities по умолчанию++ chown

++ dac_override

++ fowner

++ fsetid

++ kill

++ setgid

++ setuid

++ setpcap

++ net_bind_service

++ net_raw

++ sys_chroot

++ mknod

++ audit_write

++ setfcap

++ man capabilities(7)

Page 99: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Добавляя безопасности

Page 100: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Добавляя безопасности++ --cap-add & --cap-drop для управления

Page 101: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Добавляя безопасности++ --cap-add & --cap-drop для управления

++ --cap-drop=all, когда это возможно

Page 102: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Добавляя безопасности++ --cap-add & --cap-drop для управления

++ --cap-drop=all, когда это возможно

++ Никаких --privileged

Page 103: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А как же stateful?

Page 104: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А как же stateful?++ Проблем нет только у stateless

Page 105: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А как же stateful?++ Проблем нет только у stateless

++ Простой путь – общие папки

Page 106: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А как же stateful?++ Проблем нет только у stateless

++ Простой путь – общие папки

++ Более сложный – etcd, consul, redis

Page 107: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А как же stateful?++ Проблем нет только у stateless

++ Простой путь – общие папки

++ Более сложный – etcd, consul, redis

++ Комбо – забираем состояние с мастер-ноды

Page 108: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Разделяй и используй

Page 109: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Разделяй и используй++ Общие папки на host-машине

Page 110: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Разделяй и используй++ Общие папки на host-машине

++ VOLUME внутри контейнера

Page 111: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблема записи

Page 112: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблема записи++ Неразбериха с правами на файлы

Page 113: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблема записи++ Неразбериха с правами на файлы

++ ARG USER_ID=1000 for the rescue

Page 114: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Проблема записи++ Неразбериха с правами на файлы

++ ARG USER_ID=1000 for the rescue

++ docker build --build-arg USER_ID="$(id -u)"

Page 115: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

User namespaces

Page 116: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

User namespaces++ Появились с версией 1.10

Page 117: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

User namespaces++ Появились с версией 1.10++ Root контейнера = non uid-0 на host-машине

Page 118: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

User namespaces++ Появились с версией 1.10++ Root контейнера = non uid-0 на host-машине++ По умолчанию отключено

Page 119: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

User namespaces++ Появились с версией 1.10++ Root контейнера = non uid-0 на host-машине++ По умолчанию отключено++ --userns-remap в опциях запуска демона

Page 120: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А сети такие разные

Page 121: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А сети такие разные++ Bridge

Page 122: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А сети такие разные++ Bridge

++ Host

Page 123: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А сети такие разные++ Bridge

++ Host

++ Overlay

Page 124: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А сети такие разные++ Bridge

++ Host

++ Overlay

++ Macvlan

Page 125: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А сети такие разные++ Bridge

++ Host

++ Overlay

++ Macvlan

++ None

Page 126: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: bridge

Page 127: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: bridge++ На самом деле NAT

Page 128: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: bridge++ На самом деле NAT

++ Отдельный локальный IP для контейнера

Page 129: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: bridge++ На самом деле NAT

++ Отдельный локальный IP для контейнера

++ Изоляция порта внутри контейнера

Page 130: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: bridge++ На самом деле NAT

++ Отдельный локальный IP для контейнера

++ Изоляция порта внутри контейнера

++ Суёт свой хвост в iptables – админы недовольны

Page 131: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: host

Page 132: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: host++ Сеть хост-машины как есть в контейнере

Page 133: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: host++ Сеть хост-машины как есть в контейнере

++ Host port = container port

Page 134: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: host++ Сеть хост-машины как есть в контейнере

++ Host port = container port

++ Свобода iptables от вмешательств Docker

Page 135: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: host++ Сеть хост-машины как есть в контейнере

++ Host port = container port

++ Свобода iptables от вмешательств Docker

++ Наш выбор!

Page 136: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: overlay

Page 137: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: overlay++ Multi-host сеть прямо из коробки

Page 138: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: overlay++ Multi-host сеть прямо из коробки

++ Swarm mode (1.12+) или кастомная настройка кластера

Page 139: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: overlay++ Multi-host сеть прямо из коробки

++ Swarm mode (1.12+) или кастомная настройка кластера

++ Пока что всё ещё сыроват

Page 140: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: macvlan

Page 141: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: macvlan++ Свежачок с 1.12, kernel v3.9–3.19 and 4.0+

Page 142: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: macvlan++ Свежачок с 1.12, kernel v3.9–3.19 and 4.0+

++ Только одна сеть на сетевой интерфейс

Page 143: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: macvlan++ Свежачок с 1.12, kernel v3.9–3.19 and 4.0+

++ Только одна сеть на сетевой интерфейс

++ Каждому контейнеру уникальный MAC

Page 144: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: macvlan++ Свежачок с 1.12, kernel v3.9–3.19 and 4.0+

++ Только одна сеть на сетевой интерфейс

++ Каждому контейнеру уникальный MAC

++ Прямой доступ к другим контейнерам, минуя gateway

Page 145: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: macvlan++ Свежачок с 1.12, kernel v3.9–3.19 and 4.0+

++ Только одна сеть на сетевой интерфейс

++ Нет доступа из контейнера к хост-машине по IP

++ Каждому контейнеру уникальный MAC

++ Прямой доступ к другим контейнерам, минуя gateway

Page 146: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: none

Page 147: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: none++ Нет сети – нет проблем!

Page 148: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Network mode: none++ Нет сети – нет проблем!

++ Лучший вариант – если сеть не нужна

Page 149: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Limit everything

Page 150: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Limit everything++ CPU: --cpu-shares, --cpuset-cpus

Page 151: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Limit everything++ CPU: --cpu-shares, --cpuset-cpus

++ Memory: --memory, --memory-reservation

Page 152: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Limit everything++ CPU: --cpu-shares, --cpuset-cpus

++ Memory: --memory, --memory-reservation

++ Swap: --memory-swap, --memory-swappiness

Page 153: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Limit everything++ CPU: --cpu-shares, --cpuset-cpus

++ Memory: --memory, --memory-reservation

++ Swap: --memory-swap, --memory-swappiness

++ Storage: --device-read-bps, --device-write-bps

Page 154: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Limit everything++ CPU: --cpu-shares, --cpuset-cpus

++ Memory: --memory, --memory-reservation

++ Swap: --memory-swap, --memory-swappiness

++ Storage: --device-read-bps, --device-write-bps

++ И это далеко не всё

Page 155: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Собираем всё вместе

Page 156: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Собираем всё вместе++ Динамический docker-compose.yml

Page 157: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Собираем всё вместе++ Динамический docker-compose.yml

++ Одна сущность контейнера – один YAML template

Page 158: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Собираем всё вместе++ Динамический docker-compose.yml

++ Одна сущность контейнера – один YAML template

++ Множим контейнеры через генератор конфига

Page 159: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Собираем всё вместе++ Динамический docker-compose.yml

++ Одна сущность контейнера – один YAML template

++ Множим контейнеры через генератор конфига

++ scale bee=10 ant=1 goqueue=1

Page 160: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблонизируем

Page 161: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблонизируем++ Секция docker-compose как шаблон

Page 162: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблонизируем++ Секция docker-compose как шаблон

++ Есть %ЗАМЕНЯЕМЫЕ% значения

Page 163: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблонизируем++ Секция docker-compose как шаблон

++ Есть %ЗАМЕНЯЕМЫЕ% значения

++ А ещё переменные окружения

Page 164: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблонизируем++ Секция docker-compose как шаблон

++ Есть %ЗАМЕНЯЕМЫЕ% значения

++ А ещё переменные окружения

++ Все константы и настройки – env.sh

Page 165: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблонизируем++ Секция docker-compose как шаблон

++ Есть %ЗАМЕНЯЕМЫЕ% значения

++ А ещё переменные окружения

++ Все константы и настройки – env.sh

++ Сборка всех шаблонов в один на чистом BASH

Page 166: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблон муравья

Page 167: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблон муравья++ %SEQUENCE% – номер контейнера

Page 168: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблон муравья++ %SEQUENCE% – номер контейнера

++ ${VAR} – окружение из env.sh

Page 169: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Шаблон муравья++ %SEQUENCE% – номер контейнера

++ ${VAR} – окружение из env.sh

++ export BEE_PORT=${BEE_PORT:-7089}

Page 170: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Деплой на сервер

Page 171: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Деплой на сервер++ Забираем свежий код из git

Page 172: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Деплой на сервер++ Забираем свежий код из git

++ Генерируем docker-compose.yml по окружению

Page 173: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Деплой на сервер++ Забираем свежий код из git

++ Генерируем docker-compose.yml по окружению

++ Собираем все образы

Page 174: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Деплой на сервер++ Забираем свежий код из git

++ Генерируем docker-compose.yml по окружению

++ Собираем все образы

++ Запускаем контейнеры – docker-compose --no-build up

Page 175: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А если несколько?

Page 176: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А если несколько?++ Сервера, окружения, scale – cluster.yml

Page 177: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

А если несколько?++ Сервера, окружения, scale – cluster.yml

Page 178: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Выкатка на ферму

Page 179: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Выкатка на ферму++ grep production cluster.yml | cut -d: -f1

Page 180: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Выкатка на ферму++ grep production cluster.yml | cut -d: -f1

++ Запуск deploy-скрипта на всех выбранных нодах

Page 181: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Выкатка на ферму++ grep production cluster.yml | cut -d: -f1

++ Запуск deploy-скрипта на всех выбранных нодах

++ И всё это одновременно на всех нодах

Page 182: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Выкатка на ферму++ grep production cluster.yml | cut -d: -f1

++ Запуск deploy-скрипта на всех выбранных нодах

++ И всё это одновременно на всех нодах

++ Снова BASH: background processes & wait

Page 183: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Выкатка на ферму++ grep production cluster.yml | cut -d: -f1

++ Запуск deploy-скрипта на всех выбранных нодах

++ И всё это одновременно на всех нодах

++ Снова BASH: background processes & wait

++ Success or fail? Шлем в slack

Page 184: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Выкатка на ферму++ grep production cluster.yml | cut -d: -f1

++ Запуск deploy-скрипта на всех выбранных нодах

++ И всё это одновременно на всех нодах

++ Снова BASH: background processes & wait

++ Success or fail? Шлем в slack

Page 185: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В сухом остатке

Page 186: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В сухом остатке++ 50 человеко-часов на написание системы

Page 187: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В сухом остатке

++ Полная миграция за 150 человеко-часов

++ 50 человеко-часов на написание системы

Page 188: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В сухом остатке

++ Полная миграция за 150 человеко-часов

++ 500 строк BASH'а в 5-ти файлах на управление

++ 50 человеко-часов на написание системы

Page 189: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В сухом остатке

++ Полная миграция за 150 человеко-часов

++ 500 строк BASH'а в 5-ти файлах на управление

++ Масштабирование в одном месте

++ 50 человеко-часов на написание системы

Page 190: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

В сухом остатке

++ Полная миграция за 150 человеко-часов

++ 500 строк BASH'а в 5-ти файлах на управление

++ Масштабирование в одном месте

++ Автоматизация настройки dev-окружения

++ 50 человеко-часов на написание системы

Page 191: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Было Стало

Page 192: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 8 мощных серверов ++ 24 дешевые машинки

Было Стало

Page 193: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 8 мощных серверов ++ 24 дешевые машинки

++ Chef, monit, Centos 6 ++ Ubuntu 16 LTS (4.4) <3 Docker

Было Стало

Page 194: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 8 мощных серверов ++ 24 дешевые машинки

++ Chef, monit, Centos 6 ++ Ubuntu 16 LTS (4.4) <3 Docker

++ 2 часа боли при деплое ++ 10 минут радости при деплое

Было Стало

Page 195: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 8 мощных серверов ++ 24 дешевые машинки

++ Chef, monit, Centos 6 ++ Ubuntu 16 LTS (4.4) <3 Docker

++ 2 часа боли при деплое ++ 10 минут радости при деплое

++ DevOps настраивают окружение ++ Developers управляют окружением

Было Стало

Page 196: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

++ 8 мощных серверов ++ 24 дешевые машинки

++ Chef, monit, Centos 6 ++ Ubuntu 16 LTS (4.4) <3 Docker

++ 2 часа боли при деплое ++ 10 минут радости при деплое

++ DevOps настраивают окружение ++ Developers управляют окружением

++ Ручной scale процессов ++ Scale по необходимости деплоем

Было Стало

Page 197: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

[email protected]

dmitrykuzmenkov

Page 198: Aviasales: миграция поискового движка в docker / Дмитрий Кузьменков (Aviasales)

Вопросы? [email protected]

dmitrykuzmenkov