История Создания Облачного Сервиса, Сдобренная Киберпанком



История создания облачного сервиса, сдобренная киберпанком

Работая в сфере ИТ, вы начинаете замечать, что системы имеют свой собственный характер.

Они могут быть гибкими, молчаливыми, эксцентричными и суровыми.

Они могут притягивать или отталкивать.

Так или иначе, с ними приходится «договариваться», лавировать между «подводными камнями» и выстраивать цепочки их взаимодействия.

Итак, нам выпала честь построить облачную платформу, и для этого нам нужно было «уговорить» пару подсистем работать с нами.

К счастью, у нас есть «язык API», прямые руки и много энтузиазма.

Эта статья не будет технически сложной, но опишет проблемы, с которыми мы столкнулись при построении облака.

Наш путь я решил описать в виде легкой технической фантазии о том, как мы искали общий язык с системами и что из этого вышло.

Добро пожаловать в кот.



Начало пути

Некоторое время назад нашей команде была поставлена задача запустить облачную платформу для наших клиентов.

У нас была управленческая поддержка, ресурсы, аппаратный стек и свобода в выборе технологий для реализации программной части сервиса.

Также был ряд требований:

  • для сервиса необходим удобный личный кабинет;
  • платформа должна быть интегрирована в существующую биллинговую систему;
  • программное и аппаратное обеспечение: OpenStack + Tungsten Fabric (Open Contrail), которое наши инженеры научились неплохо «готовить».

О том, как собиралась команда, разрабатывался интерфейс личного кабинета и принимались дизайнерские решения, мы расскажем в другой раз, если сообществу Хабра будет интересно.

Инструменты, которые мы решили использовать:

  • Python + Flask + Swagger + SQLAlchemy — вполне стандартный набор Python;
  • Vue.js для интерфейса;
  • Мы решили реализовать взаимодействие между компонентами и сервисами, используя Celery поверх AMQP.
Предвидя вопросы о выборе Python, поясню.

Язык нашел свою нишу в нашей компании и вокруг него сложилась небольшая, но все же культура.

Поэтому было решено начать строить сервис на нем.

Более того, скорость развития подобных задач зачастую имеет решающее значение.

Итак, начнем наше знакомство.



Тихий Билл - выставление счетов

Мы знаем этого парня уже давно.

Он всегда сидел рядом со мной и молча что-то считал.

Иногда он пересылал нам запросы пользователей, выставлял счета клиентам и управлял услугами.

Обычный трудолюбивый парень.

Правда, были трудности.

Он молчалив, иногда задумчив, а часто сам по себе.



История создания облачного сервиса, сдобренная киберпанком

Биллинг — первая система, с которой мы попытались подружиться.

И первая трудность, с которой мы столкнулись, была при оформлении услуг.

Например, при создании или удалении задача попадает во внутреннюю очередь выставления счетов.

Таким образом реализуется система асинхронной работы с сервисами.

Чтобы обрабатывать типы наших сервисов, нам нужно было «поместить» наши задачи в эту очередь.

И тут мы столкнулись с проблемой: отсутствием документации.



История создания облачного сервиса, сдобренная киберпанком

Судя по описанию программного API, решить эту проблему еще можно, но у нас не было времени заниматься реверс-инжинирингом, поэтому мы вынесли логику наружу и организовали очередь задач поверх RabbitMQ. Операция над сервисом инициируется клиентом из личного кабинета, превращается в «задачу» Celery на бэкенде и выполняется на стороне биллинга и OpenStack. Celery позволяет довольно удобно управлять задачами, организовывать повторы и следить за статусом.

Подробнее о «сельдерее» можно прочитать, например, Здесь .

Кроме того, выставление счетов не остановило проект, у которого закончились деньги.

Общаясь с разработчиками, мы выяснили, что при подсчете статистики (а нам нужно реализовать именно такую логику) существует сложная взаимосвязь правил остановки.

Но эти модели плохо вписываются в наши реалии.

Мы также реализовали это через задачи на Celery, перенеся логику управления сервисами на бэкенд-сторону.

Обе вышеперечисленные проблемы привели к тому, что код стал немного раздутым и в будущем нам придется провести рефакторинг, чтобы вынести логику работы с задачами в отдельный сервис.

Нам также необходимо хранить некоторую информацию о пользователях и их услугах в наших таблицах для поддержки этой логики.

Другая проблема – тишина.

Билли молча отвечает «ОК» на некоторые запросы API. Так было, например, когда мы производили выплаты обещанных платежей во время теста (об этом позже).

Запросы были выполнены корректно и ошибок мы не увидели.



История создания облачного сервиса, сдобренная киберпанком

Пришлось изучать логи при работе с системой через UI. Оказалось, что сам биллинг выполняет аналогичные запросы, меняя область действия на конкретного пользователя, например, admin, передавая его в параметре su. В целом, несмотря на пробелы в документации и мелкие недочёты API, всё прошло вполне хорошо.

Логи можно читать даже при большой нагрузке, если понимать, как они структурированы и на что обращать внимание.

Структура базы данных витиеватая, но вполне логичная и в чем-то даже привлекательная.

Итак, подводя итог, основные проблемы, с которыми мы столкнулись на этапе взаимодействия, связаны с особенностями реализации конкретной системы:

  • недокументированные «особенности», так или иначе затронувшие нас;
  • закрытый исходный код (биллинг написан на C++), как следствие - проблему 1 невозможно решить никаким другим способом, кроме как «методом проб и ошибок».

К счастью, продукт имеет достаточно обширный API и мы интегрировали в личный кабинет следующие подсистемы:
  • модуль технической поддержки – запросы из личного кабинета «проксируются» в биллинг прозрачно для клиентов сервиса;
  • финансовый модуль – позволяет выставлять счета текущим клиентам, производить списания и формировать платежные документы;
  • модуль управления сервисом — для этого нам пришлось реализовать собственный обработчик.

    Расширяемость системы сыграла нам на руку и мы «научили» Билли новому виду сервиса.

    Это было немного хлопотно, но так или иначе, я думаю, мы с Билли поладим.



Прогулка по вольфрамовым полям – Вольфрамовая ткань

Вольфрамовые поля усеяны сотнями проводов, через которые передаются тысячи бит информации.

Информация собирается в «пакеты», анализируется, выстраивая сложные маршруты, как по волшебству.



История создания облачного сервиса, сдобренная киберпанком

Это домен второй системы, с которой нам пришлось подружиться — Tungsten Fabric (TF), ранее OpenContrail. Его задача — управлять сетевым оборудованием, предоставляя нам как пользователям программную абстракцию.

TF — SDN, инкапсулирует сложную логику работы с сетевым оборудованием.

Есть хорошая статья про саму технологию, например, здесь .

Система интегрируется с OpenStack (обсуждается ниже) через плагин Neutron.

История создания облачного сервиса, сдобренная киберпанком

Взаимодействие сервисов OpenStack. С этой системой нас познакомили ребята из оперативного отдела.

Мы используем API системы для управления сетевым стеком наших сервисов.

Никаких серьезных проблем или неудобств нам это пока не доставило (не могу говорить за ребят из О?), но были некоторые странности во взаимодействии.

Первый выглядел так: команды, требующие вывода большого количества данных на консоль экземпляра при подключении по SSH, просто «обрывали» соединение, а через VNC все работало корректно.



История создания облачного сервиса, сдобренная киберпанком

Для тех, кто не знаком с проблемой, это выглядит довольно забавно: ls /root работает корректно, тогда как, например, top полностью «зависает».

К счастью, мы уже сталкивались с подобными проблемами.

Решилось настройкой MTU на маршруте от вычислительных узлов до роутеров.

Кстати, это не проблема ТФ.

Следующая проблема была не за горами.

В один «прекрасный» момент магия маршрутизации исчезла, вот так.

TF перестал управлять маршрутизацией на оборудовании.



История создания облачного сервиса, сдобренная киберпанком

Мы работали с Openstack с уровня администратора и после этого перешли на необходимый уровень пользователя.

Похоже, что SDN «захватывает» область действия пользователя, которым выполняются действия.

Дело в том, что для подключения TF и OpenStack используется одна и та же учетная запись администратора.

На этапе перехода к пользователю «волшебство» исчезло.

Было решено создать отдельный аккаунт для работы с системой.

Это позволило нам работать, не нарушая функционал интеграции.



Кремниевые формы жизни — OpenStack

Силиконовое существо причудливой формы обитает вблизи вольфрамовых полей.

Больше всего он похож на ребенка-переростка, который может раздавить нас одним взмахом, но явной агрессии от него не исходит. Он не вызывает страха, но его размеры внушают страх.

Как и сложность происходящего вокруг.



История создания облачного сервиса, сдобренная киберпанком

OpenStack — это ядро нашей платформы.

OpenStack имеет несколько подсистем, из которых мы сейчас наиболее активно используем Nova, Glance и Cinder. У каждого из них есть свой API. Nova отвечает за вычислительные ресурсы и создание экземпляров, Cinder отвечает за управление томами и их снимками, Glance — сервис изображений, который управляет шаблонами ОС и метаинформацией на них.

Каждый сервис запускается в контейнере, а брокером сообщений является «белый кролик» — RabbitMQ. Эта система доставила нам самые неожиданные неприятности.

И первая проблема не заставила себя долго ждать, когда мы попытались подключить к серверу дополнительный том.

Cinder API наотрез отказался выполнять эту задачу.

Точнее, если верить самому OpenStack, соединение установлено, но дискового устройства внутри виртуального сервера нет.

История создания облачного сервиса, сдобренная киберпанком

Мы решили пойти в обход и запросили то же действие у Nova API. В результате устройство подключается правильно и доступно на сервере.

Похоже, проблема возникает, когда блочное хранилище не отвечает на Cinder. Еще одна трудность ждала нас при работе с дисками.

Системный том не удалось отключить от сервера.

Опять же сам OpenStack «ругается», что разрушил соединение и теперь можно корректно работать с томом отдельно.

Но API категорически не хотел выполнять операции с диском.



История создания облачного сервиса, сдобренная киберпанком

Здесь мы решили особо не воевать, а изменить взгляд на логику сервиса.

Если есть экземпляр, должен быть также системный том.

Поэтому пользователь пока не может удалить или отключить системный «диск», не удалив «сервер».

OpenStack — это довольно сложный набор систем со своей логикой взаимодействия и витиеватым API. Нам помогает достаточно подробная документация и, конечно же, метод проб и ошибок (куда бы мы без него).



Тестовый забег

Тестовый запуск мы провели в декабре прошлого года.

Основной задачей было протестировать наш проект в боевом режиме с технической стороны и со стороны UX. Зрителей приглашали выборочно и тестирование было закрытым.

Однако мы также оставили возможность запрашивать доступ к тестированию на нашем сайте.

Само испытание, конечно, не обошлось без забавных моментов, ведь здесь наши приключения только начинаются.

Во-первых, мы несколько неправильно оценили интерес к проекту и пришлось оперативно добавлять вычислительные узлы прямо во время теста.

Обычный случай для кластера, но и здесь были свои нюансы.

В документации конкретной версии TF указана конкретная версия ядра, на которой тестировалась работа с vRouter. Мы решили запускать ноды с более свежими ядрами.

В результате TF не получил маршруты от узлов.

Пришлось срочно откатывать ядра.



История создания облачного сервиса, сдобренная киберпанком

Еще один курьез связан с функционалом кнопки «сменить пароль» в личном кабинете.

Мы решили использовать JWT для организации доступа к личному кабинету, чтобы не работать с сессиями.

Поскольку системы разнообразны и широко разбросаны, мы управляем собственным токеном, в который «заворачиваем» сессии от биллинга и токена от OpenStack. При смене пароля токен, естественно, «испортится», так как данные пользователя перестают быть действительными и его необходимо перевыпустить.



История создания облачного сервиса, сдобренная киберпанком

Мы упустили этот момент из виду, и ресурсов, чтобы быстро закончить этот кусок, просто не хватило.

Нам пришлось вырезать функционал непосредственно перед запуском теста.

В настоящее время мы выходим из системы, если пароль был изменен.

Несмотря на эти нюансы, тестирование прошло хорошо.

За пару недель заглянуло около 300 человек.

Нам удалось посмотреть на продукт глазами пользователей, протестировать его в действии и собрать качественные отзывы.



Продолжение следует

Для многих из нас это первый проект такого масштаба.

Мы усвоили ряд ценных уроков о том, как работать в команде и принимать архитектурные и дизайнерские решения.

Как интегрировать сложные системы с небольшими ресурсами и запустить их в производство.

Конечно, есть над чем работать как в плане кода, так и над интерфейсами системной интеграции.

Проект достаточно молодой, но мы полны амбиций вырастить из него надежный и удобный сервис.

Нам уже удалось убедить системы.

Билл послушно занимается подсчетом, выставлением счетов и запросами пользователей в своем шкафу.

«Магия» вольфрамовых полей обеспечивает нам стабильную связь.

И только OpenStack иногда капризничает, крича что-то вроде «WSREP еще не подготовил узел для использования приложения».

Но это совсем другая история.

Недавно мы запустили эту услугу.

Все подробности вы можете узнать на нашем Веб-сайт .



История создания облачного сервиса, сдобренная киберпанком

команда разработчиков CLO Полезные ссылки OpenStack

Вольфрамовая ткань Теги: #Хостинг #облака #облачные сервисы #Киберпанк #разработка сервисов
Вместе с данным постом часто просматривают: