Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)

737 views

Published on

РИТ++ 2017
Зал Сан-Паулу, 5 июня, 15:00

Тезисы:
http://ritfest.ru/2017/abstracts/2653.html

Новые микросервисы появляются, но монолит никуда не исчезает. Мы в Avito разрабатываем и деплоим сервисы с помощью связки Docker и Kubernetes. Зачастую интегрировать монолит с сервисами довольно проблематично. А что, если монолит тоже завернуть в Docker+Kubernetes и применять те же практики, что и для микросервисов?

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

Доклад будет полезен как командам, планирующим или переживающим распил монолита, так и всем тем, кому приходится работать со сторонними legacy-системами.

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Legacy в коробочке. Dev-среда на базе Kubernetes / Илья Сауленко (Avito)

  1. 1. Legacy в коробочке Dev-среда на базе Kubernetes Илья Сауленко Avito
  2. 2. Как выглядит микросервисная архитектура?
  3. 3. Суровая реальность Монолит надо разрабатывать: ● Поддерживать старый код ● Разрабатывать новые фичи Монолит надо тестировать: ● Тестировать новые фичи ● Интегрировать с микросервисами
  4. 4. Среды в Avito: раньше LXC dev: test:
  5. 5. Нужны новые среды!
  6. 6. Что не нравится? Vagrant-окружения слишком хрупкие Vagrant/Chef-конфигурации сильно отличаются от продакшена Разные решения для dev- и test-сред Тесты используют общие хранилища данных Общие базы/сфинксы etc
  7. 7. Микросервисы в Avito
  8. 8. Среды в Avito: сейчас
  9. 9. Kubernetes — это сложно! Настраивать сеть Ставить etcd Готовить сертификаты
  10. 10. Kubernetes — это сложно! Minikube
  11. 11. Kubernetes — это сложно! Minikube ...или kubeadm
  12. 12. Kubernetes — это перебор! У нас же всего одно приложение на одном локальном сервере! Зачем оркестрация? Мы просто хотим писать код!
  13. 13. Kubernetes — это перебор! Раздаёт IP-адреса контейнерам автоматически kube-dns для service discovery Ingress controller для HTTP-роутинга Readiness probe Heapster для мониторинга отдельных компонентов
  14. 14. Микросервис vs монолит: найдите 10 отличий
  15. 15. Среднестатистический микросервис Приложение Хранилища данных Зависимости от других сервисов Описание сборки (Dockerfile) Описание деплоя (Chart.yaml) Приложение Dockerfile Chart.yaml Данные Сторонний сервис
  16. 16. Монолит Приложение Puppet + python + bash Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные
  17. 17. Приложение Puppet + python + bash Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные
  18. 18. Базы в Docker-контейнерах
  19. 19. Базы в Docker-контейнерах Immutable
  20. 20. Базы в Docker-контейнерах Immutable Ограничены по размеру
  21. 21. Как быть с большими базами?
  22. 22. Как быть с большими базами? 1. Никак — ходить в продакшен
  23. 23. Как быть с большими базами? 1. Никак — ходить в продакшен 2. Никак — поднимать пустой сервер без данных
  24. 24. Как быть с большими базами? 1. Никак — ходить в продакшен 2. Никак — поднимать пустой сервер без данных 3. Поднимать сервер без данных и накатывать тестовые данные
  25. 25. Как быть с большими базами? 1. Никак — ходить в продакшен 2. Никак — поднимать пустой сервер без данных 3. Поднимать сервер без данных и накатывать тестовые данные 4. Семплировать часть боевых данных
  26. 26. Как быть с большими базами? 1. Никак — ходить в продакшен 2. Никак — поднимать пустой сервер без данных 3. Поднимать сервер без данных и накатывать тестовые данные 4. Семплировать часть боевых данных 5. Сделать пул серверов на снапшотах файловых систем (ZFS, etc)
  27. 27. Docker commit Не всегда образ можно собрать с помощью docker build Например, если нужно сделать образ SphinxSearch из базы данных, запущенной в соседнем контейнере
  28. 28. 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
  29. 29. Docker commit: альтернативы Ansible Container Packer
  30. 30. Приложение Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные Puppet + python + bash
  31. 31. Приложение Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные Puppet + python + bash
  32. 32. Сборка кода: версии софта
  33. 33. Сборка кода: версии софта В Vagrant одна версия node.js, на тестовых серверах — другая
  34. 34. Сборка кода: версии софта В Vagrant одна версия node.js, на тестовых серверах — другая docker build обычно решает большую часть проблем
  35. 35. Сборка кода: когда docker build не хватает
  36. 36. Сборка кода: когда docker build не хватает Для сборки и запуска приложений — разный набор софта
  37. 37. Сборка кода: когда docker build не хватает Для сборки и запуска приложений — разный набор софта Внешние зависимости (например, собрать словарь из базы данных)
  38. 38. Build container base OS build dependencies build image:
  39. 39. Build container base OS build dependencies sources build image: +
  40. 40. Build container base OS build dependencies sources build image: app + =
  41. 41. Build container app
  42. 42. Build container base OS runtime dependencies app image: app
  43. 43. Build container base OS runtime dependencies app app image: app
  44. 44. Build container base OS build dependencies base OS runtime dependencies sources app build image: app image: app + =
  45. 45. 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 .
  46. 46. Build container: альтернативы IMPORT/EXPORT в Rocker mount в dapp Multi-stage builds в Docker 17.05
  47. 47. Приложение Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные Dockerfile Puppet + python + bash
  48. 48. Приложение Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные Dockerfile Puppet + python + bash
  49. 49. Helm для деплоя
  50. 50. Почему Helm? Менеджер релизов: приложение + конфигурация Шаблонизация Kubernetes-ресурсов Использует существующие Kubernetes-примитивы
  51. 51. Helm: альтернативы AppController Flux Spinnaker
  52. 52. Helm Chart Chart.yaml templates/ charts/метаданные k8s-ресурсы рекурсия values.yaml значения по умолчанию, публичный интерфейс чарта deployment.yaml configmap.yaml ingress.yaml service.yaml
  53. 53. $ helm upgrade --install --wait release-name ./ Helm Kubernetes Pod Container Container Container ... Pod Container Декларативный деплой Chart
  54. 54. Readiness probe
  55. 55. Readiness probe > GET /healthz < 200 OK
  56. 56. Readiness probe > GET /healthz < 200 OK > GET /healthz < 500 Internal Server Error
  57. 57. $ helm upgrade --install --wait release-name ./ $ echo $? 1 Readiness probe = Smoke test Helm Kubernetes Pod Container Container Container ... Pod Container
  58. 58. Helm: проблемы Молодой, быстро развивающийся Нет фидбэка в процессе установки* go/template внутри yaml** * https://github.com/kubernetes/helm/pull/2386 ** https://github.com/ksonnet/ksonnet-lib
  59. 59. Приложение Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные Dockerfile Chart.yaml
  60. 60. Приложение Данные Сторонний сервис Сторонний сервис Сторонний сервис Данные Данные Данные Dockerfile Chart.yaml
  61. 61. Условные зависимости
  62. 62. “Хочу тестовую среду, у которой будет своя база, локально поднятые сервисы A и B, а за сервисом C пусть ходит в staging” Условные зависимости
  63. 63. “Хочу тестовую среду, у которой будет своя база, локально поднятые сервисы A и B, а за сервисом C пусть ходит в staging” “Мне нужно разрабатывать новый сервис D локально и интегрировать его с монолитом. Остальные зависимости можно вообще не поднимать” Условные зависимости
  64. 64. values.yaml, values.dev.yaml, values.test.yaml Условные зависимости
  65. 65. values.yaml, values.dev.yaml, values.test.yaml serviceA.location: ‘on-cluster’ Условные зависимости
  66. 66. values.yaml, values.dev.yaml, values.test.yaml serviceA.location: ‘on-cluster’ {{- if eq .Values.location “on-cluster” -}} … {{- end -}} Условные зависимости
  67. 67. values.yaml, values.dev.yaml, values.test.yaml requirements.yaml Условные зависимости
  68. 68. Приложение Сторонний сервис Данные Dockerfile Chart.yaml
  69. 69. Developer Experience
  70. 70. vboxfs: ● Медленное чтение ● Нет поддержки смены прав внутри дерева ● inotify не работает kubectl: ● Слишком fine-grained ● “kubectl exec” — это вам не терминал Developer Experience: проблемы
  71. 71. Скрипт для автоматизации рутины: логи, ssh, etc CLI-дашборд, показывающий самое важное lsyncd вместо vboxfs Облако вместо VirtualBox Draft? Developer Experience: решение
  72. 72. Что получилось?
  73. 73. Что получилось? Docker + Kubernetes + Helm (+ VirtualBox + Minikube) Переиспользование образов при разработке и тестировании “Legacy в коробочке”, поднимаемое одной командой локально или в кластере
  74. 74. Спасибо! Вопросы? Илья Сауленко, Avito @mynameiswhm

×