<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@happydevops</title><author><name>@happydevops</name></author><id>https://teletype.in/atom/happydevops</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/happydevops?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@happydevops?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=happydevops"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/happydevops?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-23T09:23:09.462Z</updated><entry><id>happydevops:release-checklist</id><link rel="alternate" type="text/html" href="https://teletype.in/@happydevops/release-checklist?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=happydevops"></link><title>Чеклист релиза</title><published>2021-11-25T12:28:56.003Z</published><updated>2021-11-25T21:08:19.852Z</updated><summary type="html">1. Убедитесь, что составляющие релиза подготовлены: все задачи проверены и подготовлены к релизу, слиты в релизную ветку, все необходимые артефакты (архивы с кодом готовы к доставке, докер-образы собраны и залиты в registry, helm-чарты подготовлены и соответствуют действительности) проверены и готовы</summary><content type="html">
  &lt;p id=&quot;Dr0d&quot;&gt;1. Убедитесь, что составляющие релиза подготовлены: все задачи проверены и подготовлены к релизу, слиты в релизную ветку, все необходимые артефакты (архивы с кодом готовы к доставке, докер-образы собраны и залиты в registry, helm-чарты подготовлены и соответствуют действительности) проверены и готовы&lt;/p&gt;
  &lt;p id=&quot;S9eM&quot;&gt;2. Убедитесь, что прописаны все &lt;a href=&quot;https://www.agilealliance.org/glossary/definition-of-done/&quot; target=&quot;_blank&quot;&gt;Definitions of Done&lt;/a&gt; (я, честно говоря, не фанат всей этой Agile-истерии, но некоторыми принципами оттуда с удовольствием пользуюсь)&lt;/p&gt;
  &lt;p id=&quot;fYzj&quot;&gt;3. Тестирование&lt;br /&gt; - код покрыт юнит-тестами и они были запущены в процессе CI или вручную&lt;br /&gt; - выполнено регрессионное тестирование&lt;br /&gt; - выполнены smoke-тесты&lt;br /&gt; - выполнено нагрузочное  тестирование&lt;br /&gt; - очень важно: выполнено интеграционное тестирование, это отдельная большая тема для разговора&lt;br /&gt; - Выполнен статический анализ кода, код прошел линтеры и security-инструменты&lt;br /&gt; - Технический долг, выплаченный в рамках релиза, задокументирован&lt;br /&gt;Все артефакты, полученные в ходе тестирования, помещены в хранилище, все отчеты по тестированию подготовлены и доступны&lt;/p&gt;
  &lt;p id=&quot;mkqd&quot;&gt;4. Проверяем технические детали&lt;br /&gt; - Весь код размещен в системе контроля версий, все нужные теги установлены&lt;br /&gt; - Все необходимые изменения в конфигурации production-сервисов сделаны (или готовы к этому)&lt;br /&gt; - Все зависимости (базы данных, кеши, сторонние сервисы) задеплоены и готовы принимать трафик?&lt;br /&gt; - Доступны ли все сетевые и инфраструктурные сервисы? (DNS, LB, VPC и прочие)&lt;br /&gt; &lt;br /&gt;5. &amp;quot;Поведение&amp;quot; нашего релиза под трафиком&lt;br /&gt; - Понимаем ли мы поведение системы под большим трафиком? Настроено и протестировано автомасштабирование?&lt;br /&gt; - Готовы ли мы к изменению (ухудшению) пользовательского опыта? Готовы ли наши инструменты для измерения этого? Понимаем ли мы метрики UX?&lt;br /&gt; - Если мы используем канареечный деплой, то наши метрики для принятия решения о распространении трафика протестированы и готовы?&lt;br /&gt; - Если мы используем A/B-тестирование, то все &lt;a href=&quot;https://martinfowler.com/articles/feature-toggles.html&quot; target=&quot;_blank&quot;&gt;Feature Toggles&lt;/a&gt; настроены и подготовлены?&lt;br /&gt; - Проверены ли все необходимые доступы на всех уровнях? От SRE-инженеров до менеджеров, работающих с самым высоким уровнем приложения&lt;br /&gt; - Готов ли наш мониторинг? Имеем ли мы всю необходимую информацию для observability? Понимаем ли мы собственные технические и продуктовые метрики, чтобы оценить поведение системы после релиза?&lt;br /&gt; - Готовы ли мы к быстрому откату, если что-то пойдет не так? Можем ли мы исправить ситуацию без отката в случае ошибок? (выключить feature toggle, выкатить быстрый патч)&lt;/p&gt;
  &lt;p id=&quot;qLeW&quot;&gt;6. Люди, участвующие в релизе (важно уточнить, что пользователи, получающие новый UX, тоже так или иначе &amp;quot;участвуют&amp;quot; в релизе)&lt;br /&gt; - Есть ли у нас контакты всех необходимых людей, которые имеют компетенции для исправления ошибок в ходе релиза? Они на связи? Они готовы реагировать?&lt;br /&gt; - Понимаем ли мы как изменения повлияют на поведение пользователей? Протестировали ли мы это поведение перед релизом? (Ограниченная группа, A/B-тестирование на реальных пользователях)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;qPh8&quot;&gt;Приходите ко мне в телеграм-канал &lt;a href=&quot;https://t.me/happy_devops&quot; target=&quot;_blank&quot;&gt;@happy_devops&lt;/a&gt;, там еще много интересного :)&lt;/p&gt;

</content></entry><entry><id>happydevops:metabase-debugging</id><link rel="alternate" type="text/html" href="https://teletype.in/@happydevops/metabase-debugging?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=happydevops"></link><title>Как я отлаживал одну очень странную ситуацию</title><published>2021-11-12T21:46:59.935Z</published><updated>2021-11-13T08:48:48.669Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/1b/2f/1b2f94bb-6ede-4659-8b3b-206da27c86b8.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/6e/4a/6e4ad310-fa16-4169-8324-42c67bb51da7.png&quot;&gt;Действующие лица</summary><content type="html">
  &lt;p id=&quot;7pYR&quot;&gt;Действующие лица&lt;/p&gt;
  &lt;p id=&quot;bGII&quot;&gt;&lt;em&gt;Я.Облако&lt;/em&gt;: наш облачный провайдер, в котором и происходит все действие&lt;br /&gt;&lt;em&gt;Metabase&lt;/em&gt;: наш главный герой. Это такая BI-система, которая позволяет делать всякие красивые визуализации в реальном времени. Для получения этих самых данных она умеет подключаться к различным источникам&lt;br /&gt;&lt;em&gt;PostgreSQL&lt;/em&gt;: или просто PG. В представлении не нуждается. В нашей истории представлен как managed-сервис в виде облачного кластера&lt;br /&gt;&lt;em&gt;Kubernetes&lt;/em&gt;: он же k8s. Оркестратор, в котором крутится вышеозначенный метабейс&lt;/p&gt;
  &lt;p id=&quot;gWfK&quot;&gt;Итак, некоторое время назад наши дата-сатанисты попросили меня развернуть метабейс, потому что он им был нужен для каких-то темных дата-ритуалов. Я посмотрел, сложного ничего, говорю, будет сделано.&lt;/p&gt;
  &lt;p id=&quot;NzjD&quot;&gt;А мы, как раз, ввели в эксплуатацию еще один k8s-кластер как раз под всякие подобные штуки. Туда я его и решил затащить.&lt;/p&gt;
  &lt;p id=&quot;uG2S&quot;&gt;Пару слов о сетапе: в одном каталоге (назовем его app) облака расположен источник данных в виде нашего PG, там же есть кубернетес для всяких непродакшеновых нужд. В другом каталоге облака (назовем его infra) расположен еще один кластер k8s, который является целевым для нашего метабейса. Прямой сетевой связности между ними нет, но есть VPN в виде site-to-site ipsec StrongSwan&lt;/p&gt;
  &lt;p id=&quot;1SvF&quot;&gt;Так вот, метабейс умеет хранить свою служебную инфу либо в h2, это такая его встроенная БД на файлах, для продакшена не рекомендуется, либо в mysql или в PG. Для проверки я развернул его на h2 в app-кластере, подключил PG как источник данных, посмотрел, все ок. Отдал дата-сатанистам, они дали добро, все хорошо.&lt;/p&gt;
  &lt;p id=&quot;8OmK&quot;&gt;Ну в общем беру его я, готовлю уже продакшен-сетап, переношу его в infra-кластер, подцепляю к нему его собственный PG для хранения служебной инфы, проверяю коннект к другому каталогу, все отлично. Отдаю ds-команде и с чувством выполненного долга ухожу делать другие задачи&lt;/p&gt;
  &lt;p id=&quot;xkHL&quot;&gt;И буквально вот вчера, за окном пятница, приходят ко мне ребята из DS и говорят: беда, метабейс не видит схему данных. То есть к бд он цепляется нормально, но в ответ на попытку посмотреть схему, говорит буквально следующее:&lt;br /&gt;&lt;/p&gt;
  &lt;figure id=&quot;ffN6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6e/4a/6e4ad310-fa16-4169-8324-42c67bb51da7.png&quot; width=&quot;1182&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7Y34&quot;&gt;Опачки. В понедельник уже должна быть презентация красивых визуализаций, а оно схему не видит.&lt;br /&gt;При этом в метабейсе есть возможность сделать прямой запрос к БД и если там набрать буквально&lt;br /&gt;&lt;code&gt;SELECT * FROM table_name;&lt;/code&gt;&lt;br /&gt;то все работает норм, данные возвращаются, все отлично. То есть таблички он видит, базу он видит, но почему-то не хочет показывать схему.&lt;br /&gt;А надо сказать, что схему он показывает в виде таких больших кнопок с названиями таблиц и с помощью этих кнопок строятся дашборды. То есть без схемы этой совсем никак.&lt;br /&gt;Ну и непонятно, конечно, почему он все-таки говорит, что таблиц нет, хотя они есть и он явно про это в курсе&lt;/p&gt;
  &lt;p id=&quot;KRe7&quot;&gt;Иду в настройки, делаю принудительный синк, одновременно смотрю в логи. Вижу, что синк запускается, но не заканчивается. Ну то есть там несколько этапов, один из них называется &lt;code&gt;sync_metadata&lt;/code&gt; , это вот ровно оно и есть. Все остальные этапы помечены как started и finished, а этот нет.&lt;br /&gt;Примерно минут через 40 это синк падает с ошибкой&lt;br /&gt;&lt;code&gt;PSQLException: An I/O error occured while sending to the backend.&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;x5hB&quot;&gt;Ооооокей&lt;/p&gt;
  &lt;p id=&quot;GxdK&quot;&gt;Несколько часов уходит на извращения с helm-чартом в самых разных вариантах, изменение уровня логирования (я теперь знаю очень много про log4j, я и раньше знал, но там много всего добавилось😁), адское гугление и чтение форумов. Проблема появляется у многих, но все предложенные решения не работают&lt;br /&gt;Так, задета моя профессиональная гордость, оставить это я уже не могу.&lt;/p&gt;
  &lt;p id=&quot;o4Fa&quot;&gt;Ко мне приходит светлая мысль, что что-то не так со служебным PG, так как я вижу, что туда попадает информация о бд (креды, IP и все вот это), но нет информации о схеме. При этом на тестовом сетапе с h2 все работало. Решаю сделать с h2 чтобы проверить. Разворачиваю метабейс в инфра-кластере с h2, и... хрен там, ничего не получается. Схемы нет. Я начинаю чувствовать, что схожу с ума&lt;/p&gt;
  &lt;p id=&quot;0Mon&quot;&gt;8 вечера, пятница, я сижу с блокнотом и прикидываю, что у нас есть: &lt;/p&gt;
  &lt;ol id=&quot;9J5S&quot;&gt;
    &lt;li id=&quot;iNXN&quot;&gt;Все работает как надо, когда приложение и сервис в одном каталоге&lt;/li&gt;
    &lt;li id=&quot;Zn02&quot;&gt;Все не работает как надо, когда они в разных. Но при этом сетевая связность есть в обе стороны и консольный клиент PG работает отлично&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;fkZi&quot;&gt;Внимательно смотрю на кластеры, в чем еще может быть разница? Агашечки, на апп-кластере стоит nginx как ingress-контроллер, а в инфра-кластер мы затащили Istio на посмотреть, насколько он хорош (очень хорош🤗). Так блин, неужели дело в этом? Собираюсь уже затаскивать nginx и в инфра-кластер, но тут решаю на шару прицепить к метабейсу БД из его же каталога как источник данных.&lt;br /&gt;Voilà! Все работает хорошо, схема есть.&lt;/p&gt;
  &lt;p id=&quot;VrUv&quot;&gt;Так, значит дело &lt;s&gt;не в бобине&lt;/s&gt; не в истио, почему-то метабейс не может пробиться в другой каталог. Причем проблема именно в нем, консольный клиент же работает нормально, вы помните? И схему показывает, и селекты дергает. А метабейс, судя по &lt;code&gt;i/o error&lt;/code&gt; просто теряет коннект. Но почему он его теряет?! Почему он не выгребает данные сразу, как это делает &lt;code&gt;psql&lt;/code&gt;?&lt;/p&gt;
  &lt;p id=&quot;DDK9&quot;&gt;Думаю про какие-то перемудренные таймауты постгреса (хотя какие, к херам, таймауты? Эти вмки если не в одной стойке, то в одном ДЦ точно), закапываюсь в доки по постгресу, ничего не помогает 🤷‍♂️ Схемы нет&lt;/p&gt;
  &lt;p id=&quot;iEul&quot;&gt;Так, исключили проблемы с БД, очевидно, что метабейс не пролезает через ipsec, но блин, почему? Консольный клиент пролезает, а этот нет. Пишу тестовое приложение на джаве с тем же драйвером, который использует метабейс. Все ок, все работает. Приложение, в смысле. Метабейс — нет.&lt;/p&gt;
  &lt;p id=&quot;sU25&quot;&gt;&lt;em&gt;За окном очень поздний вечер&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;rnZz&quot;&gt;Пытаюсь понять, в каком еще юзкейсе можно смоделировать поведение, аналогичное метабейсу, но без его участия? Ну конечно, банальный полный дамп данных. Поднимаю jump-pod рядом с метабейсом, запускаю pg_dump ииии....&lt;/p&gt;
  &lt;p id=&quot;bdlt&quot;&gt;Да, детка! pg_dump тоже зависает и падает с таймаутом. При этом таки показав мне, на чем таки оно валится.&lt;br /&gt;Уберите детей от экранов, валится оно вот на этом:&lt;/p&gt;
  &lt;figure id=&quot;OO8T&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a8/a1/a8a16247-bce0-4611-8d10-c8d2da6e15e9.png&quot; width=&quot;3292&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0PTw&quot;&gt;Да.. я бы тоже упал конечно. Подозрение с метабейса снято. Выглядит все это очень страшно, но таки делать с этим что-то надо. Решаю проверить все это добро у себя на локалке (у меня тоже поднят VPN до Яндекса, но уже не StrongSwan s2s, а банальный OpenVPN)&lt;/p&gt;
  &lt;p id=&quot;wtJF&quot;&gt;Опачки...&lt;/p&gt;
  &lt;figure id=&quot;kEd7&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1c/a4/1ca466ee-b221-4493-ae2b-4146a7f000b6.png&quot; width=&quot;1916&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ATNc&quot;&gt;Все пролетает просто прекрасно. Значит дело не в VPN в принципе, а в конкретном ipsec-е, который соединяет наши два каталога. Время 22.30, я провел в этой отладке уже семь с половиной часов.&lt;/p&gt;
  &lt;p id=&quot;6mGs&quot;&gt;Иду прогуляться, чувствую себя идиотом. На пятом круге, навернутом вокруг дома ясно понимаю (💡), что именно надо попробовать! Залетаю домой и не раздеваясь бросаюсь к ноутбуку. Короткая команда на обоих концах туннеля, и...&lt;/p&gt;
  &lt;p id=&quot;IRy4&quot;&gt;Оно заработало!!!!1111&lt;/p&gt;
  &lt;p id=&quot;4DRZ&quot;&gt;Оргазм по сравнению с этим ощущением — жалкая пародия на удовольствие. Меня реально отпустило, гора упала с плеч, профессиональная гордость вернулась к привычным размерам)&lt;/p&gt;
  &lt;p id=&quot;axsl&quot;&gt;Таки чтоже это была за команда?&lt;/p&gt;
  &lt;p id=&quot;VM1b&quot;&gt;&lt;code&gt;ifconfig eth0 mtu 1650 up&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Lv1d&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Maximum_transmission_unit&quot; target=&quot;_blank&quot;&gt;MTU (или maximum transmission unit)&lt;/a&gt; это максимальный размер блока данных в байтах, который может быть передан через сетевой слой без фрагментации. Его чрезмерное увеличение влияет на производительность, а чрезмерное уменьшение вытворяет вот такие штуки с трафиком.&lt;/p&gt;
  &lt;p id=&quot;LmyM&quot;&gt;Дада, друзья :) IPSec откусывает немножко от MTU и в дефолтное свое значение 1500 трафик может и не пролезть. Я задрал с запасом до 1650 и все полетело. Вообще, MTU можно довольно точно рассчитать, но после 8 часов деьага я на это не способен. Я честно скажу, я пока не понимаю, почему именно этот поток данных не пролез в ipsec, почему все остальное работало норм, с этим я разберусь потом :) После 8 часов жесткой отладки я уже не способен на интеллектуальные упражнения&lt;/p&gt;
  &lt;p id=&quot;FRnq&quot;&gt;А сейчас самое главное, что проблема исправлена, можно спокойно закрывать ноут и ложиться спать. По горячим следам я написал эту заметку, потом обязательно дополню более подробным исследованием на тему MTU&lt;/p&gt;
  &lt;p id=&quot;lhFe&quot;&gt;Всем спасибо за внимание! Приходите ко мне в телеграм-канал &lt;a href=&quot;https://t.me/happy_devops&quot; target=&quot;_blank&quot;&gt;@happy_devops&lt;/a&gt;, там еще много интересного :)&lt;/p&gt;

</content></entry><entry><id>happydevops:sef8wATUeDm</id><link rel="alternate" type="text/html" href="https://teletype.in/@happydevops/sef8wATUeDm?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=happydevops"></link><title>Gruntwork собрали свои production-readiness рекомендации в одной статье</title><published>2021-07-31T16:01:53.016Z</published><updated>2021-07-31T16:01:53.016Z</updated><category term="aws" label="AWS"></category><summary type="html">https://blog.gruntwork.io/introducing-the-gruntwork-production-deployment-guides-887b3b037a1</summary><content type="html">
  &lt;p&gt;&lt;a href=&quot;https://blog.gruntwork.io/introducing-the-gruntwork-production-deployment-guides-887b3b037a1&quot; target=&quot;_blank&quot;&gt;https://blog.gruntwork.io/introducing-the-gruntwork-production-deployment-guides-887b3b037a1&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Гайд по:&lt;br /&gt;- AWS EKS&lt;br /&gt;- Созданию AWS акаунта (IAM, Organization, etc.)&lt;br /&gt;- Структура VPC&lt;/p&gt;

</content></entry></feed>