По мере своего карьерного роста я все чаще и чаще испытываю чувство дежавю. Во время личной или деловой встречи моему собеседнику достаточно упомянуть какой-то малозначительный факт — и я сразу же вспоминаю о событии, которое произошло со мной несколько лет (или даже «работ») назад. Чаще всего это касается неверно принятых мною решений, последствия которых пришлось расхлебывать долгие месяцы. Такие флешбеки настолько сильны, что я едва сдерживаюсь, чтобы не закричать человеку в лицо: «Ни в коем случае не делай X!». Почему сдерживаюсь? Всё просто: моих коллег не было в том месте и в то время и они попросту не поймут, каких ужасов я натерпелся в подобной же ситуации.

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

Не торопитесь переносить приложения из ЦОДа в облако

Ох уж эти облачные сервисы, в последние годы никуда от них не скроешься. Шучу, конечно. Я и сам большой поклонник облаков. Тем не менее, зачастую огульная миграция в облако приложений, написанных для физической инфраструктуры, оборачивается проблемами.

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

Это я напоролся на рифы, пытаясь мигрировать из физического центра обработки данных в облако
Это я напоролся на рифы, пытаясь мигрировать из физического центра обработки данных в облако

По мере написания и тестирования приложений у разработчиков формируется представление о том, как оно будет вести себя в продуктивной среде. Сюда относится то, как работают серверы, какую производительность показывает приложение на конкретном «железе», насколько надежна сеть и как велики задержки. Всё это приводит к тому, что приложения, особенно старые, после переноса в новую инфраструктуру начинают вести себя очень странно. Всплывают новые, неожиданные ошибки, и вы буквально вынуждены на месте решать их самыми причудливыми путями.

Вскоре оказывается, что ошибки и ограничения, с которыми вы столкнулись в новой среде, практически нивелируют ценность миграции. Что-то переносится с ошибками, что-то нельзя переносить вовсе — и вот вы уже оказались между Сциллой и Харибдой. С одной стороны — дата-центр, который приходится продолжать поддерживать. С другой — новая облачная среда.

Вместо этого...

Не переносите просто так — портируйте приложение в облачную среду. Пусть разработчики получат доступ к новым ресурсам, как следует их изучат, внесут в приложение доработки и определят, насколько целесообразна миграция. Обязательно запланируйте даунтайм на 4-8 часов, в течение которых приложение будет простаивать. И не пытайтесь экономить на времени простоя. Делайте всё спокойно, уверенно и с расстановкой.

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

Не пишите собственную систему управления секретами

Честно говоря, я не знаю, почему до сих пор я раз за разом сталкиваюсь с подобной ситуацией. Компаниям очень нравится делать собственные системы управления секретами. Я лично стал жертвой подобной идеи, подумав: «Хм, ну разве тут могут возникнуть сложности?».

Я то ли встал не с той ноги, то ли сошел с ума — в тот злополучный день я решил, что управление секретами будет происходить через PostgrREST. Я написал утилиту, которая генерировала и отправляла приложениям JWT (JSON Web Token) на основе ряда критериев. Таким образом, думал я, приложения будут иметь доступ к своим секретам совершенно безопасным образом.

В защиту PostgrREST я могу сказать, что он достойно справился со своей частью функциональности. Проблема в том, что управление секретами в реальности немного сложнее, чем кажется на первый взгляд. Взять хотя бы кеширование: как избежать обращения к службе по миллиону раз в час, при этом сохраняя концепцию «сервер —источник истины»? Мне удалось решить проблему через конфигурацию Nginx, но это заняло какое-то время.

А потом мне в лоб прилетели смачные грабли ротации: обновить версию легко, но секреты, как правило, не передаются на клиентскую сторону. Поэтому во время ротации существуют сразу два верных секрета. Звучит вполне очевидно и ожидаемо, но во время разработки я не предусмотрел этот нюанс. Опять же, сделать быстрый фикс труда не составило, но со временем обнаруживались все новые и новые проблемы. Я понял, что совершил огромную ошибку, взвалив на себя самостоятельную разработку системы.

Реальность такова, что управление секретами — это классический пример сервиса с высокими рисками и низкой отдачей. Задачи клиентов он не решает, руководителей не впечатляет, а для его разработки требуются уйма времени и набор специфических знаний. Мне пришлось переделать заново едва ли не все аспекты своей изначальной программы.

Вместо этого...

Просто используйте AWS Secrets Manager или Vault. Я лично предпочитаю Secrets Manager, но тут выбор за вами. Только, заклинаю, не пишите свои собственные системы. В их разработке слишком много нюансов и сложностей, а на выходе вы получите крайне сомнительные преимущества. Экономия средств минимальна, но именно из-за вашего излишнего усердия все приложения в один прекрасный день перестанут работать.

Не запускайте собственный кластер Kubernetes

Да-да, у вас достаточно технических знаний и навыков. Может быть, вы вообще фанат etcd и настройки множества сертификатов. Но вот вам коротенькое дерево решений на случай, если вы решите запустить собственный кластер k8s:

1. Моя компания находится в списке Fortune 100?

Да: запускайте кракена кластер смело!

Нет: не стоит этого делать.

Лучше пусть кто-нибудь другой запустит этот кластер, а вы будете пользоваться его преимуществами. Например, у AWS EKS есть масса потрясающих функций, от AWS SSO в вашем kubeconfig-файле до возможности использовать роли IAM внутри ServiceAccounts для доступа модулей к ресурсам AWS. Вдобавок ко всему, меньше чем за 1000 долларов в год AWS возьмет на себя административные функции.

Я до сих пор не понимаю, почему эта проблема не на слуху. Да, вы можете самостоятельно и притом успешно запустить собственный кластер k8s, но — зачем? В случае с AWS буквально десятки тысяч бета-тестеров вперед меня убеждаются, что обновления EKS работают. Куча инженеров заняты поддержкой продукта. Если я и так размещаю в AWS свою инфраструктуру, с какой стати разворачивать собственный кластер? Разве что для поддержания иллюзии того, что в будущем я не буду привязан к одному провайдеру. Но об этом мы поговорим чуть ниже.

Вместо этого…

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

Не цельтесь сразу в нескольких облачных провайдеров

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

Я попался на эту удочку и оказался в так называемой «команде преждевременных оптимизаторов».

Через некоторое время я решил провести аудит новых сервисов на предмет совместимости с несколькими облачными платформами. Вместо SDK от AWS мы использовали свои собственные, чтобы без проблем переключиться, если придется выбрать нового провайдера. С учетом того, что текущее облако нас устраивало, переехать или расшириться мы могли только в случае экспансивного роста бизнеса — чего в ближайшие годы явно не предвиделось.

Следующий пассаж я хотел бы адресовать в первую очередь провайдерам облачных услуг: не делайте вид, что клиенту на самом деле может потребоваться развернуть свои приложения в нескольких разных облаках. Экстренная надобность в этом может возникнуть только в том случае, если вы, провайдер, закроетесь одним днем. Все остальные сценарии миграции подразумевают, что у клиента найдется время на полноценную подготовку и переезд.

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

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

Вместо этого...

Если кто-то говорит, что вы не должны быть привязаны к единственному поставщику облачных услуг, ответьте прямо: этот поезд ушел в момент регистрации, я остаюсь тут. Как и в случае миграции из ЦОДа в облако, приложение, разработанное и протестированное на совместимость с конкретной инфраструктурой, может начать чудить в новом облаке.

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

Облачные провайдеры — это как язык программирования. Нельзя просто так взять и переключиться с одного на другой. Поэтому всегда оценивайте риски и преимущества — и, самое главное, не мешайте клиентам пользоваться вашими сервисами, если всё и так корректно работает.

Не допускайте роста количества бессмысленных оповещений

Я уверен, что вы лично не раз сталкивались с подобной ситуацией: где-то в офисе установлен экран, подключенный к системе мониторинга. Периодически на нем загорается какое-то предупреждение, но никто не торопится с ним разбираться. Мол, «это мелочь, мы просто следим, чтобы такая ерунда не происходила слишком уж часто».

В конечном итоге, прямо как в сказке про мальчика, который слишком часто кричал «Волк!», произойдет действительно серьезный сбой — все из-за того, что дежурный инженер машинально проигнорирует важное оповещение из-за большого потока «мусорных».

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

Вместо этого...

Не допускайте «замусоривания» системы предупреждениями о всякой ерунде и не стесняйтесь избавляться от чужих «хвостов» и ошибок. Если система присылает вам alert-email 600 раз на дню, она бесполезна.

Не пишите внутренние инструменты cli на Python

Коротенький и простой совет.

Никто не знает, как правильно устанавливать и упаковывать Python-приложения. Если вы пишете внутренний инструмент, он должен быть либо полностью переносимым, либо написанным на Go или Rust. Избавьте себя и пользователя от страданий с приложениями, которые не хотят корректно устанавливаться.

Комментарии (14)


  1. sherbacov
    10.12.2021 21:00
    +18

    Не используйте BillManager от ispsystem, ведь цена может вырасти на 100%.

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


    1. ISPsystem_software
      10.12.2021 23:21
      -3

      Нам жаль, что у вас сложилось такое впечатление о сервисе. Тарифы BILLmanager не менялись, а баги и ошибки продуктов оперативно устраняются. Так, 10 сентября мы обнаружили уязвимость платформы VMmanager, которую исправили в релизе 2021.09.1-1 от того же дня. Кроме того, каждый пользователь может стать участником программы выплат за сообщения о выявленных ошибках, сделать продукт безопаснее и удобнее, получив вознаграждение. По вопросам работы и тарификации продуктов компании вы можете в любой момент обратиться в службу поддержки: по телефону, через Telegram, онлайн-чаты или по электронной почте, а также через заявку в личном кабинете. Все доступные контакты размещены на нашем сайте в разделе «Центр Помощи»: https://www.ispsystem.ru/support. Спасибо за интерес к нашему продукту!


      1. sherbacov
        10.12.2021 23:43
        +11

        Сейчас вы подписаны на тариф BILLmanager Corporate, стоимость которого — 48 € в месяц, без учета персональных скидок. С 1 мая стоимость лицензионного вознаграждения увеличивается до 150 € в месяц. Это первое обновление стоимости с момента запуска продукта, которое состоялось 7 лет назад.

        Да. Был не прав. не на 100%, а на 300%

        Так, 10 сентября мы обнаружили уязвимость платформы VMmanager

        Так в чем она заключалась? Где детали?

        По вопросам работы и тарификации продуктов компании

        Не можете. любой вопрос, кроме как потратить у вас деньги => пишите на емайл => это не ошибка, это вы криворукие => через 2 недели => да это ошибка, мы ее когда нибудить исправим (нет - уже год прошел)


      1. levchick
        11.12.2021 00:05
        +6

        А как же прекращение возможности продления лицензий ISPManager 5 версии и форсирование перехода на 6-ую, которая существенно дороже?


  1. MentalBlood
    10.12.2021 21:07
    +5

    Никто не знает, как правильно устанавливать и упаковывать Python-приложения

    Извините, что?

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

    pip install something

    Или вы про такие Python-приложения которые содержат код на C, например?


    1. Roman2dot0
      11.12.2021 01:21
      +1

      Сюда можно добавить и сборку в один бинарник, со всеми зависимостями.


    1. 13werwolf13
      13.12.2021 10:04

      думаю речь шла о том что упаковывать и устанавливать правильно в виде deb/rpm/ebuild/etc а не pip

      и тут я пожалуй бы согласилься если речь идёт про софт живущий в хостовой ОС а не в контейнере

      но тоже не понимаю в чём проблема пнуть одной командой py2pack и покурить пока он шуршит


    1. gecube
      13.12.2021 18:00

      и там дичь в setup.py и приплыли... не надо pip install :-)

      А еще pip до последнего времени буквально ничего нормально не резолвил, если два пакета требовали две разные версии зависимости

      @13werwolf13

      думаю речь шла о том что упаковывать и устанавливать правильно в виде deb/rpm/ebuild/etc а не pip

      тоже хороший вариант, но он не очень подходит для среды разработки... И вот этот переход - из мира python (с pip install) в мир пакетного менеджера операционки и назад - очень больной


  1. sundmoon
    10.12.2021 23:05
    +3

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

    Таковы вообще все инфраструктурные сервисы.


  1. johnfound
    11.12.2021 12:08
    +3

    Не цельтесь сразу в нескольких облачных провайдеров

    Parler с этим категорически не согласен.


  1. olku
    11.12.2021 16:21
    +2

    Хорошо бы еще знать модель угроз для бизнеса, в рамках которых даны эти рекомендации. Решение о принятии, скажем, vendor-lock риска не может приниматься на уровне девопс или в угоду разработчикам. Погоны не те. В рунете есть переведенные стандарты ISO по управлению рисками. Совсем не обязательно реализовывать их целиком, достаточно не изобретать свои. Главное, структурировать подход для оценки и выбора мер.


  1. relgames
    12.12.2021 03:37
    +1

    Ха, мы совершили все эти ошибки. С выводами согласен полностью. Особая боль это собственный k8s. Брр.. Но вот самое интересное, даже если бы я эту статью прочитал лет 5 назад, уверен, что проигнорировал бы. Подумал бы - со мной такого не случится, это просто другие люди глупые, а я молодец, у меня такого не будет. К сожалению, опыт подобных ошибок не всегда можно передать кому-то, кто сам не попробовал.


    1. vp7
      12.12.2021 04:03

      Пишите статью со списком граблей, которые вы словили с собственным k8s ;)


    1. Antiscer
      13.12.2021 16:35

      Да, грабли k8s интересны. Тоже грешным делом думаю завести себе такие, вот ищу причину чтобы этого не делать.