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

#їстиСлонаTalks - Зустріч Перша: Смерть моноліт...

Avatar for reedrefucher reedrefucher
November 27, 2018

#їстиСлонаTalks - Зустріч Перша: Смерть моноліта, або досвід застосування мікросервісів у банковій та ігровій сфері

Avatar for reedrefucher

reedrefucher

November 27, 2018

Other Decks in Programming

Transcript

  1. Что такое Docker • Open-Source ПО • Докер предназначен для

    упрощения создания, развертывания и запуска приложений с использованием портативных самодостаточных контейнеров (Linux или Windows) • Нужен для разработчиков и системных администраторов Ранее: Это работает на моей машине, почему не работает на продуктиве? Сейчас: Если это работает в Docker, то это работает в продуктиве процесс = контейнер у контейнера единственная точка входа
  2. История создания Docker • 1979: Unix V7 • 2000: FreeBSD

    Jails • 2001: Linux Vserver • 2004: Solaris Containers • 2005: Open VZ (Open Virtuzzo) • 2006: Process Containers(by Google) • 2008: LXC (LinuX Containers) • 2011: Warden • 2013: LMCTFY • 2013: Docker
  3. Virtual Machines App 1 App 2 App 2 Bins/Libs Bins/Libs

    Bins/Libs Guest OS Guest OS Guest OS Host Operating System Hypervisor Infrastructure Docker Containers Operating System Container Engine App 1 App 2 App 2 Bins/Libs Bins/Libs Bins/Libs Infrastructure Сравнение Docker-контейнеров и виртуальных машин
  4. Registry Registry Хранение статических образов Images Статические образы контейнеров Container

    Экземпляр образа с запущенным процессом(service/web) Базовая топология Docker Hosted Docker Registry Docker Trusted Registry on-prem Docker Hub Registry Docker Trusted Registry on-cloud Azure Container Registry AWS Container Registry Google Conteiner Registry Other Clouds On-premises Public Cloud
  5. •.NET Core Docker images xPlat (Linux & Windows Nano Server)

    •.NET Framework images Windows Server Core Docker и .NET
  6. Dockerfile FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app FROM microsoft/dotnet:2.1-sdk AS

    build ADD vostok-root-sha256.crt /usr/local/share/ca- certificates/vostok-root-sha256.crt RUN update-ca-certificates WORKDIR /src COPY ["TestAPI/TestAPI.csproj", "TestAPI/"] RUN dotnet restore "TestAPI/TestAPI.csproj" COPY . . WORKDIR "/src/TestAPI" RUN dotnet build "TestAPI.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "TestAPI.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "TestAPI.dll"]
  7. Команды докер • Формирования образа docker build -t testapi:test .

    • Просмотр образов в системе docker images • Запуск контейнера docker run -p 5000:5000 testapi:test • Просмотр запущенных контейнеров docker ps • Отправка образа в хранилище docker push registry.bank.lan/test/testapi:test • Запуск bash внутри контейнера docker exec -it ee21e1076737 bash • Остановка контейнера docker stop ee21e1076737 • Удаление образа docker rmi -f 01f2bb1c5dd4 • Помощь docker help https://docs.docker.com/engine/refere nce/commandline/docker/
  8. Монолиты vs Микросервисы Микросервисное приложение Подход к разворачиванию монолитных приложений

    App1 • Традиционное приложение, состоящее со слоев и библиотек • Масштабируемость через клонирование приложения на сервера/виртуальные машины Разворачивание полного прилиожения • В микросервисном приложении функциональность разделена на отдельные небольшие сервисы • Масштабируемость через разворачивание каждого сервиса независимо дублированием экземпляров на серверах/VM/Docker App1 App2 Независимое разворачивание микросервисов Мелкозернистая структура Крупнозернистая структура
  9. Микросервисы и данные Слой Web Слой сервиса SQL BD или

    No-SQL BD БД обычно “бутылочное горлышко” • Единственная монолитная БД • Слои технологий SQL У каждого микросервиса своя model/date Stateful services Stateless services Stateless service с отдельным хранилищем • Взаимосвязанные микросервисы • Удаленное хранилище для “холодных данных”
  10. Ключевые шаблоны микросервисов 1.Прямая коммуникация vs. API Gateway 2.Health checks

    3.“Эластичное” облачное приложение: 1.Retries 2.Автоматический выключатель 4.Event Bus (Async. Pub/sub коммуникация) 5.Масштабирование при помощи Оркестратора
  11. API Gateway API Gateway Container ASP.NET Core Web API Microservice

    1 Container Web API Microservice 2 Container Web API Microservice 3 Container Web API Back end
  12. Retries API Gateway Container ASP.NET Core Web API Microservice 1

    Container Web API Microservice 2 Container Web API Microservice 3 Container Web API Back end .NET Core 2.1 HttpClient factory
  13. • Задача, идеально подходящая под микросервисную архитектуру • Желание попробовать

    новую технологию и новый подход • Выход .NET Core • Масштабируемость • Сервер на Linux • Nginx Как мы пришли к использованию Docker
  14. Как мы пришли к использованию Docker Макс Щедривый Олег Андреев

    «Нужно использовать Докер – я уже проверил на танчиках, работает классно!» «Верю на слово. Будем делать… Саша, надо сделать нам докер контейнеры.» Саша Рябчун OKAY
  15. Что мы сделали для того, чтобы у нас появились сервисы

    Docker Приняли решение попробовать Развернули тестовую среду FZNetCoreDMZ Развернули Spark Запустили пополнения в Ringoo Развернули BankID TechDoc Сентябрь 2017 Ноябрь 2017 Февраль 2018 Июль 2018 Октябрь 2018 Сегодня
  16. • Инфраструктура • Переход на .NET Core • Нахождения решений

    Что мы сделали для того, чтобы у нас появились сервисы Docker
  17. • Бизнес задача: Внешний API для интеграции B2B • Особенности:

    аутентификация, авторизация, шифрование и проверка подписи • Ограничения: DMZ открыт только на вход • Сервисы: Spark, Energo, Corezoid, VodafonePay, VostokOAuth, ChatBot Применение. ExternalAPI. Описание
  18. 1. Вариативность различных решений 2. NAT для доступа внутрь сети

    3. Запросы с DMZ внутрь сети 4. Внутренние хосты Группы Фоззи имеют доступ в банк напрямую 5. Petya (malware) как точка невозврата Применение. ExternalAPI. Состояние до
  19. Банк DMZ Применение. ExternalAPI. Архитектура FZNetCoreDMZ Внутренняя сеть банка Spark

    EnergoDMZ CorezoidDMZ VostokOAuth ChatBot Sharepoint UPCGate SmsGate CorezoidAPI Energo.Front IS-Gate Site
  20. Применение. ExternalAPI Итог 1. Закрыли потребности бизнеса 2. Развернули инфраструктуру

    3. Попробовали Docker 4. Попробовали .NET Core 5. Настроили CI 6. Настроили управление 7. С 2018-02-19 проблем не обнаружено 8. Оно работает!!!!! “Очень понравился ваш API, он изменил мое представление о банковских продуктах. Понятный функционал и отличная поддержка” Андреев Дмитрий. IT-директор Ringoo
  21. BankID Вход с BankID очень похож на «Войти с Facebook»

    или «Войти с Google» и работает на основе протокола OAuth 2.0. BankID это сервис от НБУ созданный для проведения удаленной идентификации пользователя с целью предоставления административных, банковских и коммерческих услуг онлайн.
  22. Уже возможно: • 13 порталов административных услуг (ПАП) и еще

    9 в процессе подключения. Планируется: • Дистанционное открытие счетов в банках. • Коммерческие услуги (страхование, услуги от мобильных операторов, работа с ценными бумагами, получение ЕЦП и другие). BankID
  23. BankID Запрос на данные клиента + сертификат Портал админ услуг

    (ПАУ) Трансляция запроса от ПАП Цетральный узел BankID НБУ Подписанные и зашифрованые данные клиента Сайт банка Трансляция данных от банка Цетральный узел BankID НБУ Портал админ услуг (ПАУ)
  24. Архитектура BankID Сеть банка DMZ Внешняя сеть ПАУ BankID НБУ

    oauth.vostok. bank VostokOAuth Интернет Банк Банка Восток Базы данных
  25. Текущее состояние: тестирование совместно с НБУ Сроки выполнения: 4 месяца.

    На разных этапах были задействованы 3 разработчика и 2 системных администратора. Сделано: • Создан и развернут сайт для авторизации клиента (средствами Docker). • Создан и развернут VostokOAuth backend сервис (получение данных о клиенте из различных баз данных, формирование пакета с данными, наложение ЕЦП, шифрование). • Сайт и VostokOAuth обмениваются информацией через DMZ Трудности: • Работа с сессиями сайта развернутого в Docker при наличии нескольких нод BankID
  26. BankID 1. Получили опыт в переходе с ASP.NET MVC 4.6

    на ASP.NET Core MVC 2. Работа с сертификатами под Window и Linux: RSACryptoProvider, RSACng, RSAOpenSsl 3. Подключение Volume 4. Передача ENV в приложение 5. Увидели разницу между развертыванием Windows Service и Docker Проблема: Сессии (20 ноября решено)
  27. Планы на будущее. Новое только docker + .NET Core 1.

    Новые разработки с использованием: .NET Core 2.1, Docker, Swarm 2. Инвентаризация существующего ПО с графиком перехода на Docker 3. Покупка оборудования для увеличение мощностей 4. Решения проблем с безопасностью: OAuth2, Сертификаты 5. Swarm -> Kubernetes 6. Вырастить своего DevOps’а ☺
  28. Планы на будущее. Energo. Текущее состояние s Mobile app Web

    app Cashbox Fozzy Admin App FrontService FZEnergoWCF BackgroundService DocLoader BankFamily Cellphone Gerc Portmone StepAcademy NikolaevOblEnergo InfoxVodokanal Ukrtelecom DataAccess Types Contracts Contracts.Api Core Utils IBankMobile CellphoneInfo CellphoneWCF CellphoneBackgroundService BusinessLogic CertificatesSync FZCellphoneWCF GenerateOMSVerifications LightCertificate - BankFamily interface - Kyivstar interface … - BankFamily API - Kyivstar API … - BankFamily Entities - Kyivstar Entities … ISCard
  29. Планы на будущее. Energo. Микросервисная архитектура API Gateways FZNetCoreDMZ Scheduler

    FZCore Интернет-банк Кеш-бокс Агенты FrontService BackService Клиенты HTTP request/response Services Pormone Kyivstar VostokCard BackService MS SQL • 1 сервис = 1 контейнер • Масштабируемость • Высокая доступность • Коммуникация и синхронная и асинхронная • У каждого сервиса своя model/bll • HealthCheck • Retries • Нет бизнес-логики в БД • EnergoFramework меняется редко • Побороть «бутылочное горлышко» БД
  30. Планы на будущее.Energo. Итог 1. WCF -> ASP.NET Core 2.

    Использование RabbitMQ 3. Разделение монолита на микросервисы 4. Масштабируемость 5. Нет бизнес-логики в БД 6. Entity Framework Core 7. Тестирование компонентов отдельно 8. Unit-тесты
  31. Резюме 1. Мы проверили – это работает! 2. Приглашаем всех

    в секту свидетелей Docker, в Банке и Фоззи инфраструктура готова 3. При увеличении количества контейнеров возрастает необходимость в оркестровке 4. .NET Core мощный, активно развивающийся инструмент
  32. Что такое XVM • XVM: eXtended Visualization Mod — самый

    популярный мод для игры World of Tanks. • Максимальное количество активных пользователей: более 3 700 000 человек. • XVM — полностью бесплатный мод с открытым исходным кодом. Принять участие в разработке может каждый! • Маркеры над танками • Кастомизируемые панели игроков, таблица статистики и экран загрузки • Мод миникарты • Замена «лампочки» «шестого чувства» • Лог нанесённого урона • Модифицированная полоса захвата базы • Иконки кланов и игроков
  33. Что такое World of Tanks • MMO-Action, аркадный танковый симулятор

    • Релиз в 2011 году • В пике более 10 млн MAU • Сейчас около 5 млн MAU • В 2013 рекорд: 190к игроков на одном сервере, более 800к игроков всего
  34. Как появился XVM • OTM – Over Target Markers •

    До ноября 2011: • Nicolas Siver • Adobe Flash • С ноября 2011: • bkon, sirmax • swfmill • Flash Developer
  35. Как появился XVM • Оленемер • Apache + PHP •

    Dokan (FUSE) • WebDAV Server (PHP) • Установка…
  36. Как появился XVM • Установка оленемера "А теперь мы со

    всем этим борделем на борту попытаемся взлететь"
  37. Команда • 2011 • bkon, sirmax (OTM, Оленемер) • 2012

    • +iBat (хостинг, backend dev) • -bkon • +Mr 13 (CEO & PR) • +XlebniDizele4ku (frontend dev) • +Mr A (frontend dev, release management) • +Mixaill (l10n, CI) • +q4x2 (DevOps, backend dev) • +seriych (Data Scientist) • 2013+ • - XlebniDizele4ku • -Mr A • -q4x2
  38. Вехи проекта 11.2011 OTM + Оленемер 01.2012 Переезд на VPS

    02.2012 XVM 05.2012 NodeJS backend + .NET Client 08.2012 Форум koreanrandom.com 10.2012 www.modxvm.com 01.2013 Авторизация … JSONx … Миграция с Doken на Python … Миграция с AS2 на AS3 … Python Macros 05.2017 Rancher + Docker 10.2017 Миграция с MongoDB на PostgreSQL 08.2018 Переезд на Kubernetes (в процессе)
  39. Первый подход – Bare Metal PHP FS Clients • http://domain.com/users/<nickname>

    1 запрос на игрока до 30 запросов за раз • Кэширование на клиенте • 64K inodes limit => /al/ex/alex1234 • 100-200 RPS VPS Dedicated Server Intel Core i7-920, 8 GB DDR3, 2 x 750 GB SATA II HDD MySQL • Hetzner EQ4 • MySQL • Updater • 200-300 RPS -> CPU
  40. Первый подход – Bare Metal Node.js Clients • http://domain.com/users/<id><id>... 1

    запрос на всех игроков в бою • Node.js + MongoDB 100-150 RPS (~4000 old RPS) • REST, Stat, Info, Mon, … • Express Framework Dedicated Server Intel Core i7-920, 8 GB DDR3, 2 x 750 GB SATA II HDD MongoDB Dedicated Server Intel Core i7-2600, 32 GB DDR3, 2 x 3 TB SATA III HDD Dedicated Server Intel Core i7-4770, 32 GB DDR3, 2 x 240 GB SSD Dedicated Server Intel Core i7-2600, 32 GB DDR3, 2 x 3 TB SATA III HDD + 240 GB SSD • ! MEM ! -> Hetzner EX-4S 200-250 RPS • ! IOPS ! -> SSD 350-400 RPS • EX40-SSD (дешевле) • ! CPU !
  41. Первый подход – Bare Metal Node.js Clients MongoDB Dedicated Server

    Xeon E5-1650 v2, 64 GB ECC DDR3, 2 x 240 GB SSD • PX90-SSD 500 RPS • Java Server 500+ RPS (Up to 3000 RPS ) Java
  42. Первый подход – Bare Metal Nginx (TLS) Clients Java Dedicated

    Server Intel Core i7-4770, 32 GB DDR3, 2 x 2 TB HDD • Java Server 500+ RPS (Up to 3000 RPS ) • HTTPS + EX40 MongoDB Dedicated Server Xeon E5-1650 v2, 64 GB ECC DDR3, 2 x 240 GB SSD • PX90-SSD 500 RPS
  43. Первый подход – Bare Metal Nginx (TLS) Clients XVM Proxy

    Dedicated Server Intel Core i7-4770, 32 GB DDR3, 2 x 2 TB HDD • Java Server 500+ RPS (Up to 3000 RPS ) • HTTPS + EX40 MongoDB Dedicated Server Xeon E5-1650 v2, 64 GB ECC DDR3, 2 x 240 GB SSD Account • Account Service • PX90-SSD 500 RPS
  44. Первый подход – Bare Metal Nginx (TLS) Clients XVM Proxy

    Dedicated Server Intel Core i7-4770, 32 GB DDR3, 2 x 2 TB HDD • Java Server 500+ RPS (Up to 3000 RPS ) • HTTPS + EX40 MongoDB Dedicated Server Xeon E5-1650 v2, 64 GB ECC DDR3, 2 x 240 GB SSD Account • Account Service Updater • Updater • PX90-SSD 500 RPS
  45. Второй подход – Rancher 1.x Hexa Intel Xeon E5-1650 v3

    256 GB RAM 2 x 480 GB SSD Quad Intel Core i7-6700 64 GB RAM 2 x 2 TB HDD Loki Intel Xeon E3-1246 v3 32 GB RAM 2 x 2 TB HDD Thor Intel Xeon E3-1246 v3 32 GB RAM 2 x 2 TB HDD Ares Intel Xeon E3-1246 v3 32 GB RAM 2 x 2 TB HDD
  46. Второй подход – Rancher 1.x Hexa • Account Widget •

    LB • MongoDB • PG: XVM • XVM Proxy • XVM Proxy Test • Grafana • Collectd • Docker Registry • Updater: Players • Rancher Server Intel Xeon E5-1650 v3 256 GB RAM 2 x 480 GB SSD • Account Widget 2 • LB • modxvm.com • dev.modxvm.com • PG: Vault • PG: Calc • Updater: Clans • Updater: XTE • Updater: WN8 • Nginx: Static • WN8 Plots • InfluxDB • Collectd • Collectd Services Quad Intel Core i7-6700 64 GB RAM 2 x 2 TB HDD • LB • RabbitMQ: XMQP • XMQP Worker • Collectd Loki Intel Xeon E3-1246 v3 32 GB RAM 2 x 2 TB HDD • LB • RabbitMQ: XMQP • XMQP Worker • Collectd Thor Intel Xeon E3-1246 v3 32 GB RAM 2 x 2 TB HDD • LB • PG: Arc • Collectd Ares Intel Xeon E3-1246 v3 32 GB RAM 2 x 2 TB HDD
  47. Третий подход - Kubernetes Hetzner Cloud node-003 CX-21 2 VCPU

    4 GB RAM 40 GB DISK node-002 CX-21 2 VCPU 4 GB RAM 40 GB DISK node-001 CX-21 2 VCPU 4 GB RAM 40 GB DISK Workstation • rke • Kubernetes • Rancher 2.0 – Cluster • Helm • CEPH • rke • Kubernetes • Rancher 2.0 – Cluster • Helm • CEPH • Heketi (GlusterFS) • Helm Charts for XVM • Oops…
  48. Третий подход - Kubernetes Hetzner Cloud node-003 CX-21 2 VCPU

    4 GB RAM 40 GB DISK node-002 CX-21 2 VCPU 4 GB RAM 40 GB DISK node-001 CX-21 2 VCPU 4 GB RAM 40 GB DISK Workstation • Terraform: www.terraform.io - hcloud provider