Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Legacy в коробочке

Legacy в коробочке

Новые микросервисы появляются, но монолит никуда не исчезает. Мы в Avito разрабатываем и деплоим сервисы с помощью связки Docker и Kubernetes. Зачастую интегрировать монолит с сервисами довольно проблематично. А что, если монолит тоже завернуть в Docker+Kubernetes и применять те же практики, что и для микросервисов?
В докладе речь пойдёт о том, как изменилась Dev-среда в Avito в связи с переходом на микросервисную архитектуру. В частности, поговорим про:
- подход "legacy in a box";
- то, как мы решали проблемы с базами и sphinxsearch;
- то, как Docker и Kubernetes помогли нам сократить различия между окружениями;
- Developer Experience.
Доклад будет полезен как командам, планирующим или переживающим распил монолита, так и всем тем, кому приходится работать со сторонними legacy-системами.

#gowayfest

Ilia Saulenko

July 21, 2017
Tweet

Other Decks in Technology

Transcript

  1. Суровая реальность Монолит надо разрабатывать: • Поддерживать старый код •

    Разрабатывать новые фичи Монолит надо тестировать: • Тестировать новые фичи • Интегрировать с микросервисами
  2. Что не нравится? Vagrant-окружения слишком хрупкие Vagrant/Chef-конфигурации сильно отличаются от

    продакшена Разные решения для dev- и test-сред Тесты используют общие хранилища данных Общие базы/сфинксы etc
  3. Kubernetes — это перебор! У нас же всего одно приложение

    на одном локальном сервере! Зачем оркестрация? Мы просто хотим писать код!
  4. Kubernetes — это перебор! Раздаёт IP-адреса контейнерам автоматически kube-dns для

    service discovery Ingress controller для HTTP-роутинга Readiness probe Heapster для мониторинга отдельных компонентов
  5. Среднестатистический микросервис Приложение Хранилища данных Зависимости от других сервисов Описание

    сборки (Dockerfile) Описание деплоя (Chart.yaml) Приложение Dockerfile Chart.yaml Данные Сторонний сервис
  6. Монолит Приложение Puppet + python + bash Данные Сторонний сервис

    Сторонний сервис Сторонний сервис Данные Данные Данные
  7. Приложение Puppet + python + bash Данные Сторонний сервис Сторонний

    сервис Сторонний сервис Данные Данные Данные
  8. Как быть с большими базами? 1. Никак — ходить в

    продакшен 2. Никак — поднимать пустой сервер без данных
  9. Как быть с большими базами? 1. Никак — ходить в

    продакшен 2. Никак — поднимать пустой сервер без данных 3. Поднимать сервер без данных и накатывать тестовые данные
  10. Как быть с большими базами? 1. Никак — ходить в

    продакшен 2. Никак — поднимать пустой сервер без данных 3. Поднимать сервер без данных и накатывать тестовые данные 4. Семплировать часть боевых данных
  11. Как быть с большими базами? 1. Никак — ходить в

    продакшен 2. Никак — поднимать пустой сервер без данных 3. Поднимать сервер без данных и накатывать тестовые данные 4. Семплировать часть боевых данных 5. Сделать пул серверов на снапшотах файловых систем (ZFS, etc)
  12. Docker commit Не всегда образ можно собрать с помощью docker

    build Например, если нужно сделать образ SphinxSearch из базы данных, запущенной в соседнем контейнере
  13. Docker commit $ docker run -d --name db-container db-image $

    docker run -d --name sphinx-container --link db-container sphinxsearch $ docker exec sphinx-container indexer -c sphinx.conf --all $ docker stop sphinx-container $ docker commit -m “sphinx indexes” sphinx-container sphinx-image
  14. Сборка кода: версии софта В Vagrant одна версия node.js, на

    тестовых серверах — другая docker build обычно решает большую часть проблем
  15. Сборка кода: когда docker build не хватает Для сборки и

    запуска приложений — разный набор софта
  16. Сборка кода: когда docker build не хватает Для сборки и

    запуска приложений — разный набор софта Внешние зависимости (например, собрать словарь из базы данных)
  17. Build container Dockerfile.build: FROM debian RUN apt-get install php composer

    nodejs npm ENTRYPOINT [“make”, “build”] … $ docker build -f Dockerfile.build -t build-image . $ docker run -v $PWD:/app/ build-image Dockerfile: FROM debian RUN apt-get install php COPY ./build/ /app/ … $ docker build -t run-image .
  18. Helm Chart Chart.yaml templates/ charts/ метаданные k8s-ресурсы рекурсия values.yaml значения

    по умолчанию, публичный интерфейс чарта deployment.yaml configmap.yaml ingress.yaml service.yaml
  19. $ helm upgrade --install --wait release-name ./ Helm Kubernetes Pod

    Container Container Container ... Pod Container Декларативный деплой Chart
  20. Readiness probe > GET /healthz < 200 OK > GET

    /healthz < 500 Internal Server Error
  21. $ helm upgrade --install --wait release-name ./ $ echo $?

    1 Readiness probe = Smoke test Helm Kubernetes Pod Container Container Container ... Pod Container
  22. Helm: проблемы Молодой, быстро развивающийся Нет фидбэка в процессе установки*

    go/template внутри yaml** * https://github.com/kubernetes/helm/pull/2386 ** https://github.com/ksonnet/ksonnet-lib
  23. “Хочу тестовую среду, у которой будет своя база, локально поднятые

    сервисы A и B, а за сервисом C пусть ходит в staging” Условные зависимости
  24. “Хочу тестовую среду, у которой будет своя база, локально поднятые

    сервисы A и B, а за сервисом C пусть ходит в staging” “Мне нужно разрабатывать новый сервис D локально и интегрировать его с монолитом. Остальные зависимости можно вообще не поднимать” Условные зависимости
  25. vboxfs: • Медленное чтение • Нет поддержки смены прав внутри

    дерева • inotify не работает kubectl: • Слишком fine-grained • “kubectl exec” — это вам не терминал Developer Experience: проблемы
  26. Скрипт для автоматизации рутины: логи, ssh, etc CLI-дашборд, показывающий самое

    важное lsyncd вместо vboxfs Облако вместо VirtualBox Draft? Developer Experience: решение
  27. Что получилось? Docker + Kubernetes + Helm (+ VirtualBox +

    Minikube) Переиспользование образов при разработке и тестировании “Legacy в коробочке”, поднимаемое одной командой локально или в кластере