#всратость
Приходят ко мне недавно
Грубо говоря ситуация такая:
2 Пода в кубере.
Они/через них организуют 1 голосовой звонок.
2 пода - просто реплика. Можно сделать и 1, не принципиально.
Звонок идёт - всё ок.
Разработчики запилили релиз.
Во время релиза в кубер у нас rolling update strategy.
Когда новый под поднялся, старый завершился.
И звонок прервался.
Звонок не должен прерываться.
Это и есть проблема.
У меня очень плохо с многими областями в айти.
Чуток почитал про фреймворки, воип, сип и многое другое с голосом
Ну как почитал - спросил нейронку "все про войс за 7 абзацев".😁
Да не, вру, я многое про войс и так знал.
Ладно, спрашиваю у чатике кубера, набрасывая этой дичью.
Вдруг есть готовое решение, паттерн или фреймворк.
Ответы разные, от смешных до очень смешных.
В общем и целом мне посоветовали глянуть в стек, а что в кишках.
Кишки привели меня к
- https://docs.livekit.io/
- https://github.com/livekit/python-sdks
Дальнейший совместный поиск привел к такому ОФИЦИАЛЬНОМУ решению
https://docs.livekit.io/home/self-hosting/kubernetes/#graceful-restarts
И самое сладкое❤️
Ставим таску на on-hold, отписываем это как временное решение и трекаем время за траблшутинг.
Какие времена, такой софт и такие решения...😀
Приходят ко мне недавно
"мы тут придумали на коленке в метро и за два дня внедрили AI!AI!AI!AI!AI!-voice сервис, всё уже продали клиентам, уже даже заработали с него,а ты нет(лох), и поняли, что твой кубервсратос всё ломает при деплое/редеплое и связь рвётся, это всё твой кубер виноват, чини скорее, ЕТА на завтра, а то мы клиентов теряем".
Грубо говоря ситуация такая:
2 Пода в кубере.
Они/через них организуют 1 голосовой звонок.
2 пода - просто реплика. Можно сделать и 1, не принципиально.
Звонок идёт - всё ок.
Разработчики запилили релиз.
Во время релиза в кубер у нас rolling update strategy.
Когда новый под поднялся, старый завершился.
И звонок прервался.
Звонок не должен прерываться.
Это и есть проблема.
У меня очень плохо с многими областями в айти.
Чуток почитал про фреймворки, воип, сип и многое другое с голосом
Ну как почитал - спросил нейронку "все про войс за 7 абзацев".
Да не, вру, я многое про войс и так знал.
Ладно, спрашиваю у чатике кубера, набрасывая этой дичью.
Вдруг есть готовое решение, паттерн или фреймворк.
Ответы разные, от смешных до очень смешных.
В общем и целом мне посоветовали глянуть в стек, а что в кишках.
Кишки привели меня к
- https://docs.livekit.io/
- https://github.com/livekit/python-sdks
Дальнейший совместный поиск привел к такому ОФИЦИАЛЬНОМУ решению
https://docs.livekit.io/home/self-hosting/kubernetes/#graceful-restarts
During an upgrade deployment, older pods will need to be terminated. This could be extremely disruptive if there are active sessions running on those pods. LiveKit handles this by allowing that instance to drain prior to shutting down.
И самое сладкое
We also set terminationGracePeriodSeconds to 5 hours in the helm chart, ensuring Kubernetes gives sufficient time for the pod to gracefully shut down.
Ставим таску на on-hold, отписываем это как временное решение и трекаем время за траблшутинг.
Какие времена, такой софт и такие решения...
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18😁7
FROM debian:trixie
Тихо и незаметно вышел стабильный релиз Debian 13 Trixie.
https://www.debian.org/releases/trixie/release-notes/
Особых ожиданий от него не было, кроме желания обновить множество базовых имиджей для устранения накопившегося технического долга по CVE.
Сразу протестировал на нескольких проблемных сервисах - Trivy пока не выявил уязвимостей. Отлично.
Пока базы данных уязвимостей не обновились новыми теоретическими сценариями взлома, можно ненадолго забыть об этой головной боли.
👍7❤4
#devops #sql #index
Индексы.
Сегодня слишком жарко и погулять не удалось.
А значит надонакидаться алкоголем и играть в стимдеку сделать что-то полезное для разминки ума.
Открыл в браузере папку с закладками "Почитать на потом" (думаю, она есть у каждого) и выбрал случайную ссылку:
https://use-the-index-luke.com
Думал, почитаю минут 10-15, но зачитался надолго с большим интересом.
По ощущениям, закрыл целый пласт знаний: от понимания, что такое индексы и как они устроены, до более сложных тем, вроде оптимизации запросов.
На сайте масса информации, я читал выборочно то, что было полезно для работы.
Особенно понравились разделы про структуру индексов и их использование в
Рекомендация всем, кто:
- не знает, что такое индексы
- слышал, что "если БД тормозит - смотри индексы", но не понимает, как это работает (как я😁 )
- хочет укрепить знания или закрыть пробелы
Ресурс подходит всем инженерам, независимо от роли - администратора баз данных, DevOps или разработчика.
Текст доступен даже новичкам, можно читать на английском или через автопереводчик браузера.
Разделов много, можно изучать всё подряд или выборочно, как я.
Обязательно к прочтению, если хочется разобраться в индексах.
Рекомендация💯 .
* предполагаю, что впереди меня ждет не одна всратая история, связанная с обновлёнными знаниями по индексам и анализу "что у меня на работе у коллег"😀
Индексы.
Сегодня слишком жарко и погулять не удалось.
А значит надо
Открыл в браузере папку с закладками "Почитать на потом" (думаю, она есть у каждого) и выбрал случайную ссылку:
https://use-the-index-luke.com
Думал, почитаю минут 10-15, но зачитался надолго с большим интересом.
По ощущениям, закрыл целый пласт знаний: от понимания, что такое индексы и как они устроены, до более сложных тем, вроде оптимизации запросов.
На сайте масса информации, я читал выборочно то, что было полезно для работы.
Особенно понравились разделы про структуру индексов и их использование в
"WHERE".Рекомендация всем, кто:
- не знает, что такое индексы
- слышал, что "если БД тормозит - смотри индексы", но не понимает, как это работает (как я
- хочет укрепить знания или закрыть пробелы
Ресурс подходит всем инженерам, независимо от роли - администратора баз данных, DevOps или разработчика.
Текст доступен даже новичкам, можно читать на английском или через автопереводчик браузера.
Разделов много, можно изучать всё подряд или выборочно, как я.
Обязательно к прочтению, если хочется разобраться в индексах.
Рекомендация
* предполагаю, что впереди меня ждет не одна всратая история, связанная с обновлёнными знаниями по индексам и анализу "что у меня на работе у коллег"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤4👌1
Tell me this is a joke. Please. 😢
awk -F'@' '/^is-/ {print $1}' yarn.lock | sort -u
is-alphabetical
is-alphanumerical
is-arguments
is-array-buffer
is-arrayish
is-async-function
is-bigint
is-binary-path
is-boolean-object
is-buffer
is-bun-module
is-callable
is-ci
is-core-module
is-data-view
is-date-object
is-decimal
is-docker
is-extglob
is-finalizationregistry
is-fullwidth-code-point
is-function
is-generator-fn
is-generator-function
is-glob
is-hexadecimal
is-interactive
is-lambda
is-map
is-node-process
is-number
is-number-object
is-obj
is-path-inside
is-plain-obj
is-potential-custom-element-name
is-regex
is-retina
is-set
is-shared-array-buffer
is-stream
is-string
is-symbol
is-typed-array
is-unicode-supported
is-weakmap
is-weakref
is-weakset
is-wslPlease open Telegram to view this post
VIEW IN TELEGRAM
😁16
#AI #opensearch #всратость
Прилетает алерт - "нет места на опенсёрче".
По ссылке в алерте захожу в Grafana - да, места почти нет, трешхолд в 20 гигабайт остатка.
Как так-то, там илонмасколлион стораджа, как он может закончится + ретеншн полиси 14 дней?
Захожу в UI OpenSearch в индекс менеджмент.
Последние дни индексы по 100-300 гигабайт в день.😬
Мысленно кричу"ВЫ ТУДА СРЁТЕ ЧТОЛИ????" ах, какая досадность".
Ок, логов много, дискавери мне ничем не поможет в идентификации аппликейшн сорса.
Иду в Visualizations, выстраиваю фильтры, ставлю top сообщений по имени апп.
Вижу какой-то новый сервис. Назовём его
Естественно он в топе, отрыв в 220 раз от второго места. Неплохо.
Отлично, негодяя мы нашли.
Что же ты пишешь, чудо ты наше.
Discovery по фильтру
А там ВСЁ. Ребята, там, бл, вообще ВСЁ. Вселенная текстов и диалогов!
Ленинская библиотека не содержит в себе столько информации, как в логах этих подов.
Сразу же прилетает алёрт "места осталось 0.0001%", а в Spotify играет припев песни
Гиеной ржу с трека и ситуации, но не расслабляюсь, а бегу в developer console и удаляю индекс самый старый.
А затем сразу же ещё один. Та они всего по 85 гигабайт были. Каждый.
С такой скоростью, пока буду траблшутить, снова места не станет.
Смотрю в git репозитории этого проекта, выбираю топ 2 коммитящих, а значит шарящих, инженеров.
Иду в oncall чат, вызываю обоих, пришёл только один, спрашиваю вежливо что за сервис, что делает, кхто начальник штаба ?
Получаю детальное пояснение.
Вернемся двумя неделями ранее.
Разработчики запилили некий агент. Чат бот. Чат-ассистент. Не важно.
Кастомерам этого продукта понравилось, они начали своим саб-кастомерам впаривать это.
Честно говоря, я не знал и не знаю всю бизнес-структуру и как вообще проект зарабатывает с этого, но это и не важно.
В общем процесс идёт, все всем довольны.
Фича работает и развивается.
Денежки идут в карман владельцам.
Однако всё(!) общение в чат ботах пишется в stdout
То есть не логи самого приложения, а логи общения внутри чатбота попадает в stdout.🤡
И в нашу систему логирования.
Вся переписка, приватные данные, вообще всё.
Даже специально искал киворды типа token/password/phone - там есть всё!
Итоги:
- все, даже я, получили по шапке, логи общения выключили(пока не сделают фичу на фильтр того, что надо).
- разработчикам всё равно на все PCI-DSS, SOC2 и прочий аудит. Срать в логи приватными данными? Изи!
- я добавил Europe - Final Countdown в любимые треки, буду включать при повторах ситуации😁
* История давнишняя, просто вспомнил сейчас.
Прилетает алерт - "нет места на опенсёрче".
По ссылке в алерте захожу в Grafana - да, места почти нет, трешхолд в 20 гигабайт остатка.
Как так-то, там илонмасколлион стораджа, как он может закончится + ретеншн полиси 14 дней?
Захожу в UI OpenSearch в индекс менеджмент.
Последние дни индексы по 100-300 гигабайт в день.
Мысленно кричу
Ок, логов много, дискавери мне ничем не поможет в идентификации аппликейшн сорса.
Иду в Visualizations, выстраиваю фильтры, ставлю top сообщений по имени апп.
Вижу какой-то новый сервис. Назовём его
chatbot.Естественно он в топе, отрыв в 220 раз от второго места. Неплохо.
Отлично, негодяя мы нашли.
Что же ты пишешь, чудо ты наше.
Discovery по фильтру
appname=chatbot у меня подвис от количества сообщений, окно браузера само аннигилируется от потока, плюю на зависшее, иду в сам Kubernetes POD, смотреть по k logs -f podname.А там ВСЁ. Ребята, там, бл, вообще ВСЁ. Вселенная текстов и диалогов!
Ленинская библиотека не содержит в себе столько информации, как в логах этих подов.
Сразу же прилетает алёрт "места осталось 0.0001%", а в Spotify играет припев песни
Final Countdown.Гиеной ржу с трека и ситуации, но не расслабляюсь, а бегу в developer console и удаляю индекс самый старый.
А затем сразу же ещё один. Та они всего по 85 гигабайт были. Каждый.
С такой скоростью, пока буду траблшутить, снова места не станет.
Смотрю в git репозитории этого проекта, выбираю топ 2 коммитящих, а значит шарящих, инженеров.
Иду в oncall чат, вызываю обоих, пришёл только один, спрашиваю вежливо что за сервис, что делает
Получаю детальное пояснение.
Вернемся двумя неделями ранее.
Разработчики запилили некий агент. Чат бот. Чат-ассистент. Не важно.
Кастомерам этого продукта понравилось, они начали своим саб-кастомерам впаривать это.
Честно говоря, я не знал и не знаю всю бизнес-структуру и как вообще проект зарабатывает с этого, но это и не важно.
В общем процесс идёт, все всем довольны.
Фича работает и развивается.
Денежки идут в карман владельцам.
Однако всё(!) общение в чат ботах пишется в stdout
То есть не логи самого приложения, а логи общения внутри чатбота попадает в stdout.
И в нашу систему логирования.
Вся переписка, приватные данные, вообще всё.
Даже специально искал киворды типа token/password/phone - там есть всё!
Итоги:
- все, даже я, получили по шапке, логи общения выключили(пока не сделают фичу на фильтр того, что надо).
- разработчикам всё равно на все PCI-DSS, SOC2 и прочий аудит. Срать в логи приватными данными? Изи!
- я добавил Europe - Final Countdown в любимые треки, буду включать при повторах ситуации
* История давнишняя, просто вспомнил сейчас.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁34🔥4🤡3
#пятница
Репозитории в 2018
Репозитории в 2022
Репозитории в 2026
Репозитории в 2018
projectdir
projectfiles
Репозитории в 2022
projectdir
projectfiles
IDEA
.gitignore
.dockeringnore
.helmignore
.gitattributes
.pre-commit-config.yaml
.yamllint
.editorconfig
Репозитории в 2026
projectdir...
projectfiles...
CLAUDE.md
.kiro/steering/product.md
.kiro/steering/structure.md
.kiro/steering/tech.md
.cursor/rules/general_rules.mdc
PERPLEXITY_AI.md
.perplexity/settings.yml
.perplexity/guides/how_to_talk_to_ai.md
README_PYTHON_CHATBOT.md
AI_instructions/do_not_argue_with_robot.txt
.grok_instructions.md
notion_ai_policy.md
consensus/verification.md
midjourney/picture_rules.mdc
kill_all_humans.bender
mintlify_update_all_the_documentation_cause_im_lazy_ass.yml
1😢14😁6✍2🤯1
Впервые в своей жизни отправил первый
Пока присвоили severity high 8.4/10, хоть я и не согласен(а кто меня спрашивает).
На многое искренне не рассчитываю, это лишь мой первый опыт, но если дадут хоть 500 баксов, то все равно буду рад.
Жена рассчитывает на все $30000, когда рассказал про суть уязвимости😁
Никаких подробностей уязвимости пока не будет, думаю все понимают почему.
Потом полазил там на сайте, почитал разное, удивился как много можно поднять денег на critical и, иногда, high уязвимостях.
Причем часть из них уровня моих унылых знаний 2020-2022 года и из инструментов chrome developer tool.
Это я, а не тот репортер, мог получить $20.000 и $35.000.👿👿👿
Даже пришла в голову мысль, что в целом можно же и не работать, если бекграунд и знания позволяют 1-3 раза в год находить critical уязвимости у крупных вендоров, получать выплаты и просто чиллить: сидеть дома, читать книги и играть во все игоры.
Возможно это лучше, чем вот эти вот все овертаймы проклятые и бесконечные синки в попытке поймать коллег по всему свету, от Таиланда до США.
Если заплатит, то полусерьёзно посмотрю в эту сторону.
Опыта мне может хватить, база у меня хорошая.
Северити понимаю как никто другой, сколько всратого в своей жизни видел.😀
bug bounty report через https://hackerone.comПока присвоили severity high 8.4/10, хоть я и не согласен(а кто меня спрашивает).
На многое искренне не рассчитываю, это лишь мой первый опыт, но если дадут хоть 500 баксов, то все равно буду рад.
Жена рассчитывает на все $30000, когда рассказал про суть уязвимости
Никаких подробностей уязвимости пока не будет, думаю все понимают почему.
Потом полазил там на сайте, почитал разное, удивился как много можно поднять денег на critical и, иногда, high уязвимостях.
Причем часть из них уровня моих унылых знаний 2020-2022 года и из инструментов chrome developer tool.
Это я, а не тот репортер, мог получить $20.000 и $35.000.👿👿👿
Даже пришла в голову мысль, что в целом можно же и не работать, если бекграунд и знания позволяют 1-3 раза в год находить critical уязвимости у крупных вендоров, получать выплаты и просто чиллить: сидеть дома, читать книги и играть во все игоры.
Возможно это лучше, чем вот эти вот все овертаймы проклятые и бесконечные синки в попытке поймать коллег по всему свету, от Таиланда до США.
Если заплатит, то полусерьёзно посмотрю в эту сторону.
Опыта мне может хватить, база у меня хорошая.
Северити понимаю как никто другой, сколько всратого в своей жизни видел.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍21❤4
#terraform #aws
Самая нелюбимая часть работы - terraform hell dependency и AnyCloudProvider(в данном примере AWS) deprecated resources/versions.
Вишенка на торте - вкупе с публичными модулями.
То есть "что-то скоро перестанет работать - обнови версию".
Просто обнови и всё!😀
Простой пример: прилетает письмо от AWS "скоро python9 станет депрекейтед в AWS"
Никаких возражений, я полностью согласен с такой позицией. 100% верно.
Пилим таску "обновить версию рантайма везде", иначе через 180 дней превратимся в тыкву.
Проверяем есть ли у нас лямбды 3.8/3.9.
Увы, есть. Находим один аж с 3.8. С него и начнём.
Казалось бы - в чём сложность? Версию апдейтни.
Попытка обновить версию самого модуля - получаю ошибку, что террраформ версии 1.5.3 не подходит, тут нужно минимум 1.5.7. Просто так указать ему версию рантайма не прокатывает - он не в курсе про такой параметр в этой старой версии.
Хорошо, везде обновляем терраформ на 1.5.7, но теперь ругается на провайдеры, terraform/aws. Их тоже надо обновить.
Обновляем и их повсеместно. Прогоняем план - последовательно находим 4 бага - в github issues, обновляем раз за разом разные версии, вроде прошли к какой-то, в котором багов нет. Появляются даже какие-то костыли с lifecycle.
В двадцатый раз уже terraform plan - появились обязательные поля у части ресурсов, а они не указаны.
И так по кругу. Хистори показало печаль😭
И вот что тут делать?
- либо дальше повышать версию за версией, добавлять/убавлять параметры, чтобы стейт с кодом был идентичным, пока это говно не заработает
- сделать роллбек всех сделанных изменений кода с версиями, повесить техдолг
Потрачено уже немалое количество времени и принимаю решение - делаю роллбек.
Нужен рабочий и код и стейт. А роллбек ничего и не дал.🚶♀
В лямбде версия рантайма уже 3.12 и откатить обратно к 3.8 не даёт - нет даже такого поля(а скоро и не станет 3.9).
Да что же такое. Значит ни первое и ни второе решение, предложенное выше.
В итоге просто иду на страницу модуля старой версии, копирую все ресурсы as is, пишу свой модуль и свои версии зависимостей. Убираю несколько лишних ресурсов и прав к ним.
Запускаю лямбду - ошибка питон кода, ведь он был написан для 3.8, а у меня 3.12.
Переписываю питон скрипт, проверка - всё работает.
Обновляю сразу все зависимости до последнего актуального, чтобы оно дольше проработало.
Выпиливаю публичный модуль, документирую свой модуль, план, фиксирую версии, терраформ апплай - всё работает.
Вот так, попытка "просто сделать апдейт версии питон рантайм лямбды" вышло в 5 часов абсолютно глупой работы. Итог плохой:
- мне он не нравится
- технический долг немного вырос
Из хорошего
- выпили ещё один сомнительный модуль, который своими зависимостями ломает вообще всё к херам.
- не поломали код и стейт
- обновили все лямбды до 3.12 (не только от старого паблик модуля, а везде)
Мне кажется, тут нет правых, виноватых. Хороших и плохих решений.
Эта ситуация возникала не раз, уж слишком у нас много зависимостей в нашем коде, инфраструктуре и работе. Особенно сторонних модулях.
Можно сколь угодно обвинять "а чо ты раньше не обновился?", "а чо ты на 1.5.3 сидишь как сыч?" и многое другое.
Не хватает ресурсов, чтобы всё держать в обновлённом состоянии. Увы.
Самая нелюбимая часть работы - terraform hell dependency и AnyCloudProvider(в данном примере AWS) deprecated resources/versions.
Вишенка на торте - вкупе с публичными модулями.
То есть "что-то скоро перестанет работать - обнови версию".
Просто обнови и всё!
Простой пример: прилетает письмо от AWS "скоро python9 станет депрекейтед в AWS"
Никаких возражений, я полностью согласен с такой позицией. 100% верно.
Пилим таску "обновить версию рантайма везде", иначе через 180 дней превратимся в тыкву.
Проверяем есть ли у нас лямбды 3.8/3.9.
aws lambda list-functions --region us-east-1 --output text --query "Functions[?Runtime=='python3.8'].FunctionArn"
aws lambda list-functions --region us-east-1 --output text --query "Functions[?Runtime=='python3.9'].FunctionArn"
Увы, есть. Находим один аж с 3.8. С него и начнём.
Казалось бы - в чём сложность? Версию апдейтни.
Попытка обновить версию самого модуля - получаю ошибку, что террраформ версии 1.5.3 не подходит, тут нужно минимум 1.5.7. Просто так указать ему версию рантайма не прокатывает - он не в курсе про такой параметр в этой старой версии.
Хорошо, везде обновляем терраформ на 1.5.7, но теперь ругается на провайдеры, terraform/aws. Их тоже надо обновить.
Обновляем и их повсеместно. Прогоняем план - последовательно находим 4 бага - в github issues, обновляем раз за разом разные версии, вроде прошли к какой-то, в котором багов нет. Появляются даже какие-то костыли с lifecycle.
В двадцатый раз уже terraform plan - появились обязательные поля у части ресурсов, а они не указаны.
И так по кругу. Хистори показало печаль
history | tail -n 200 | grep plan | wc -l
59
И вот что тут делать?
- либо дальше повышать версию за версией, добавлять/убавлять параметры, чтобы стейт с кодом был идентичным, пока это говно не заработает
- сделать роллбек всех сделанных изменений кода с версиями, повесить техдолг
Потрачено уже немалое количество времени и принимаю решение - делаю роллбек.
Нужен рабочий и код и стейт. А роллбек ничего и не дал.
В лямбде версия рантайма уже 3.12 и откатить обратно к 3.8 не даёт - нет даже такого поля(а скоро и не станет 3.9).
Да что же такое. Значит ни первое и ни второе решение, предложенное выше.
В итоге просто иду на страницу модуля старой версии, копирую все ресурсы as is, пишу свой модуль и свои версии зависимостей. Убираю несколько лишних ресурсов и прав к ним.
Запускаю лямбду - ошибка питон кода, ведь он был написан для 3.8, а у меня 3.12.
Переписываю питон скрипт, проверка - всё работает.
Обновляю сразу все зависимости до последнего актуального, чтобы оно дольше проработало.
Выпиливаю публичный модуль, документирую свой модуль, план, фиксирую версии, терраформ апплай - всё работает.
Вот так, попытка "просто сделать апдейт версии питон рантайм лямбды" вышло в 5 часов абсолютно глупой работы. Итог плохой:
- мне он не нравится
- технический долг немного вырос
Из хорошего
- выпили ещё один сомнительный модуль, который своими зависимостями ломает вообще всё к херам.
- не поломали код и стейт
- обновили все лямбды до 3.12 (не только от старого паблик модуля, а везде)
Мне кажется, тут нет правых, виноватых. Хороших и плохих решений.
Эта ситуация возникала не раз, уж слишком у нас много зависимостей в нашем коде, инфраструктуре и работе. Особенно сторонних модулях.
Можно сколь угодно обвинять "а чо ты раньше не обновился?", "а чо ты на 1.5.3 сидишь как сыч?" и многое другое.
Не хватает ресурсов, чтобы всё держать в обновлённом состоянии. Увы.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍16😁1
#gitlab #github #secrets #security
Спустили с небес на землю.
Недавно я решил, что я мамкин хакер(нет), даже отправил несколько репортов, от medium до high severity.
Вот буквально сегодня в ночи получил ответ. Вкратце: "спасибо, мы знаем, тикет закрыт, пробуйте ещё".
Основная суть всех моих репортов - "пользователь с привилегированным(не админ)/с ограниченным доступом(не админ)/со специальными не частыми у всех условиями, может получить доступ к секретам".
Расставлю сразу свою позицию - я никого ни в чём не обвиняю, мне позиция ясна, ответы понравились, я со всем согласен. Никаких интриг, просто общение между инженером и представителями компаний.
История в 3 частях.
Часть первая, GitLab.
Однажды мне надо было достать значения секрета, помеченного Masked and Hidden*.
У меня были права reporter в этом репозитории.
Базовые вещи
Я просто сделал
скопировал значение и локально выполнил команду
Сам себя поздравляю - я могу прочитать значение секрета, помеченного Masked and Hidden в 2 команды.
Отмечаю, что это работает для приватных моих репозиториев, а так же для всех проектов/репозиториях, куда меня добавили - то есть во всех для организации. Проверено на SelfHosted/Cloud.
То есть прямо сейчас ВСЕ ваши коллеги не девопсы/админы с ограниченными правами могут прочитать ВСЕ секреты в тех проектах/репозиториях, где у них есть ограниченные доступы. Даже к OpenAI и тратить токены компании или PAT к другими репозиториям с привилегированными правами(например CICD процессы GitOps между репозиториями)
На данный репорт я получаю ответ от https://hackerone.com/
According to current program policy, this reported finding is considered out-of-scope;
CI/CD Variable Disclosure - as it stands, we currently see our guidance to use external secret storage as sufficient for addressing reports that rely on disclosing Masked CI/CD variables to prove impact.
It is a known security rick, based on the official document https://docs.gitlab.com/ci/variables/#cicd-variable-security
As a result, I'm closing this report as Informative. Your effort is nonetheless appreciated, and we wish that you'll continue to research and submit any future security issues you find.
Идем по линку и там
Masking a CI/CD variable is not a guaranteed way to prevent malicious users from accessing variable values. To ensure security of sensitive information, consider using external secrets and file type variables to prevent commands such as env/printenv from printing secret variables.
Gitlab.com сотрудничает с https://hackerone.com/ и значит их ответ = ответ GitLab.com.
Записываем себе - гитлаб не гарантирует ничего по сохранности секретов.
* В целом данная уязвимость не новая - опытные инженеры её и так знали и пользуются втихую.
Возможно даже на других CICD😉
Спустили с небес на землю.
Недавно я решил, что я мамкин хакер(нет), даже отправил несколько репортов, от medium до high severity.
Вот буквально сегодня в ночи получил ответ. Вкратце: "спасибо, мы знаем, тикет закрыт, пробуйте ещё".
Основная суть всех моих репортов - "пользователь с привилегированным(не админ)/с ограниченным доступом(не админ)/со специальными не частыми у всех условиями, может получить доступ к секретам".
Расставлю сразу свою позицию - я никого ни в чём не обвиняю, мне позиция ясна, ответы понравились, я со всем согласен. Никаких интриг, просто общение между инженером и представителями компаний.
История в 3 частях.
Часть первая, GitLab.
Однажды мне надо было достать значения секрета, помеченного Masked and Hidden*.
У меня были права reporter в этом репозитории.
Базовые вещи
echo $secret не давали результата, там было [MASKED] в аутпуте.Я просто сделал
script:
- echo "$password" | base64 > /tmp/password.txt
- cat /tmp/password.txt
скопировал значение и локально выполнил команду
echo Wml4TjRUbVdpRDAxbjdoCg== | base64 -d
ZixN4TmWiD01n7h (естесственно это пароль для статьи, вы чо, думали я реальный напишу?)
Сам себя поздравляю - я могу прочитать значение секрета, помеченного Masked and Hidden в 2 команды.
Отмечаю, что это работает для приватных моих репозиториев, а так же для всех проектов/репозиториях, куда меня добавили - то есть во всех для организации. Проверено на SelfHosted/Cloud.
То есть прямо сейчас ВСЕ ваши коллеги не девопсы/админы с ограниченными правами могут прочитать ВСЕ секреты в тех проектах/репозиториях, где у них есть ограниченные доступы. Даже к OpenAI и тратить токены компании или PAT к другими репозиториям с привилегированными правами(например CICD процессы GitOps между репозиториями)
На данный репорт я получаю ответ от https://hackerone.com/
According to current program policy, this reported finding is considered out-of-scope;
CI/CD Variable Disclosure - as it stands, we currently see our guidance to use external secret storage as sufficient for addressing reports that rely on disclosing Masked CI/CD variables to prove impact.
It is a known security rick, based on the official document https://docs.gitlab.com/ci/variables/#cicd-variable-security
As a result, I'm closing this report as Informative. Your effort is nonetheless appreciated, and we wish that you'll continue to research and submit any future security issues you find.
Идем по линку и там
Masking a CI/CD variable is not a guaranteed way to prevent malicious users from accessing variable values. To ensure security of sensitive information, consider using external secrets and file type variables to prevent commands such as env/printenv from printing secret variables.
Gitlab.com сотрудничает с https://hackerone.com/ и значит их ответ = ответ GitLab.com.
Записываем себе - гитлаб не гарантирует ничего по сохранности секретов.
* В целом данная уязвимость не новая - опытные инженеры её и так знали и пользуются втихую.
Возможно даже на других CICD
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍8🔥4❤2😨1
#gitlab #github #secrets #security
История вторая. GitHub.
Однажды мне надо было в моём личном репозитории кое-чего вывести в лог текстом. Ну буквально
В логах же я увидел
Не сразу понял, пришлось сделать несколько тестов. Оказалось, что GirtHub при совпадении ЛЮБОЙ части ЛЮБОГО доступного(это важно) секрета маскирует символы звёздочкой.
То есть если у нас есть какой-то секрет, внутри которого есть
Любопытство вязло вверх и я написал простой воркфлоу.
Сам скрипт простой, как три копейки.
https://gist.github.com/kruchkov-alexandr/241bb761b183800e2220c10878089214
Что делает скрипт? Берёт на вход название секрета, печатает символы из чарсета, ожидает * при совпадении часть секрета, идёт дальше.
В логе это выглядит буквально
За 0.0001мс мы "расшифровываем" любой секрет. Просто заходим в артефакты, качаем файл и забираем значение секрета). Алгоритм простой, как три копейки - гитхаб нам сам показывает, какие и где символы он маскирует.
А количество звёздочек - длина секрета)
На самом деле у GitHub работает и через base64, как в первой истории, но со скриптом мне было просто интересно повозиться 😀
Прикольная же идея!
Я зарепортил и это, отметив, что это работает на личных репозиториях и в репозиториях организации с сильно ограниченным доступом. То есть любой ваш коллега может расшифровать любой доступный ему секрет.
Получаю ответ:
Thanks for your submission! As noted at https://developer.github.com/v3/actions/secrets/#create-or-update-a-secret-for-a-repository ... "Anyone with write access to the repository can use this endpoint". It is intentional that write-access to a repository grants both read and write access to secrets. Naturally, write-access users can read all secrets. Likewise, write-access users are intended to be able to create/edit secrets because they should be able to edit/create workflows and would need to be able to configure secrets to do so. GitHub is aware that there may be some discrepancies between the API and what is apparently accessible from the web UI. GitHub is tracking several issues related to this feature and Actions generally. There may be modifications or more strict enforcement in the future, but we have nothing to announce at the moment.
Записываем себе - гитхаб не гарантирует ничего по сохранности секретов(когда мы же сами даём права в репозиторию*).
Никакой иронии - мне понятна позиция в целом.
История вторая. GitHub.
Однажды мне надо было в моём личном репозитории кое-чего вывести в лог текстом. Ну буквально
echo "hello Barbie!"В логах же я увидел
"hello ***bie!"Не сразу понял, пришлось сделать несколько тестов. Оказалось, что GirtHub при совпадении ЛЮБОЙ части ЛЮБОГО доступного(это важно) секрета маскирует символы звёздочкой.
То есть если у нас есть какой-то секрет, внутри которого есть
"Bar" то при попытке напечатать Barbie GitHub будет маскировать Bar.Любопытство вязло вверх и я написал простой воркфлоу.
jobs:
...
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: "3.x"
- name: Run print_secret script
run: python scripts/print_secret.py
env:
SUPERSECRET: ${{ secrets.AWS_ACCESS_KEY_ID }}
- name: Upload found secret artifact
uses: actions/upload-artifact@v4
with:
name: found-secret
path: found_secret.txt
if-no-files-found: error
Сам скрипт простой, как три копейки.
https://gist.github.com/kruchkov-alexandr/241bb761b183800e2220c10878089214
Что делает скрипт? Берёт на вход название секрета, печатает символы из чарсета, ожидает * при совпадении часть секрета, идёт дальше.
В логе это выглядит буквально
Run python scripts/print_secret.py
*???????????????????
**??????????????????
***?????????????????
****????????????????
*****???????????????
******??????????????
*******?????????????
********????????????
*********???????????
**********??????????
***********?????????
************????????
*************???????
**************??????
***************?????
****************????
*****************???
******************??
*******************?
********************
За 0.0001мс мы "расшифровываем" любой секрет. Просто заходим в артефакты, качаем файл и забираем значение секрета). Алгоритм простой, как три копейки - гитхаб нам сам показывает, какие и где символы он маскирует.
А количество звёздочек - длина секрета)
Прикольная же идея!
Я зарепортил и это, отметив, что это работает на личных репозиториях и в репозиториях организации с сильно ограниченным доступом. То есть любой ваш коллега может расшифровать любой доступный ему секрет.
Получаю ответ:
Thanks for your submission! As noted at https://developer.github.com/v3/actions/secrets/#create-or-update-a-secret-for-a-repository ... "Anyone with write access to the repository can use this endpoint". It is intentional that write-access to a repository grants both read and write access to secrets. Naturally, write-access users can read all secrets. Likewise, write-access users are intended to be able to create/edit secrets because they should be able to edit/create workflows and would need to be able to configure secrets to do so. GitHub is aware that there may be some discrepancies between the API and what is apparently accessible from the web UI. GitHub is tracking several issues related to this feature and Actions generally. There may be modifications or more strict enforcement in the future, but we have nothing to announce at the moment.
Записываем себе - гитхаб не гарантирует ничего по сохранности секретов(когда мы же сами даём права в репозиторию*).
Никакой иронии - мне понятна позиция в целом.
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥7❤6👍1
#gitlab #github #secrets #security
История третья. GitHub.
Третья история это не баг репорт, а собственное исследование в целях повышения опыта и экспертизы в вопросах безопасности.
НЕ ПОВТОРЯТЬ, ЭТО ПРОТИВОЗАКОННО, НЕЛЬЗЯ ПОВТОРЯТЬ
История лишь для ознакомления, повторять абсолютно запрещено, заметка исключительно в целях сокрытия СВОИХ проектов от глупых действий.
Все эти игрища были лишь в организации, где изначально у меня были хоть какие-то, но минимальные права.
Будет ли это работать при публичных репозиториях?
Как мне проверить это и защитить свои публичные репозитории от хакеров?
Немного теории. Выжимка для самых маленьких - вы ведь не хотите читать всю документацию GitHub.
1) Когда я запускаю у себя(личный репо, репо организации) воркфлоу - это МОЙ секьюрити контекст.
Мой securitycontext = мне доступны все секреты.
Если я сделаю форк от любого публичного репозитория, затем "что-то подменяю" в коде и отправлю pull request - это Fork а значит недоступен SecurityContext и секреты. То есть при любом форке - секреты недоступны, только если автор репозитория специально руками не сделает это(по умолчанию выключено).
Однако есть директива
https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#pull_request_target
Если в каком-то репозитории есть такая директива = при форке и пулл реквесте мы получаем доступ к SecurityContext.
2)GitHub не дурак и отслеживает любые изменения файлов воркфлоу.
Даже если у нас есть
Это всё теория, а что насчёт практики.
Чтобы "взломать все интернеты" нам надо соблюдение таких условий
- чтобы была опасная директива
- чтобы директория была -
- чтобы мы могли как-то где-то что-то запустить, НЕ изменяя файл воркфлоу, но заинжектить свой вредоносный код, а точнее защититься от такой ситуации в своих публичных репозиториях.
Как мы можем заинжектить, не меняя ничего в воркфлоу?
Нам надо найти куски кода, где в run есть:
- нечто типа
-
-
- всё подобное, что выше, но для других языков/утилит
В двух словах поиск будет типа
В общем и целом это помогает злоумышленнику получить доступ к вашим секретам через форк и пулл реквест.
Однако когда я начал писать об этом репорт, я уже решил почитать документацию и везде написано, что такие действия опасные.
То есть тот, кто включил у себя
Та же ситуация с запуском скриптов из всех примеров выше.
Вероятно от https://hackerone.com/ я получу такой же ответ.
Репорт не стал писать. И слишком много условий и в документации есть миллионы ворнингов.
Итоги.
Первые две истории - это реальные репорты с реальным ответом. Все семь репортов мне закрыли с
Informative (Closed). Само собой без каких-либо выплат. Остальные пять репортов я тут публиковать не буду - их них ещё можно протянуть дальше кейсы и попробовать дальше эволюционировать в реальную уязвимость (они уровнем выше, чем эти истории на мой взгляд).
Третья же история это самостоятельное погружение "а как это работает".
Для себя же стоит запомнить:
- никогда не использовать в своих публичных репозиториях
- нникогда не использовать в своих публичных репозиториях запуск сторонник скриптов типа
- не рассчитывать на сохранность всех секретов GitLab
- я ещё поиграю в хакера и попробую заработать на других потенциальных уязвимостях
И да - я опять поленился писать лонгрид в один пост, сорян.
История третья. GitHub.
Третья история это не баг репорт, а собственное исследование в целях повышения опыта и экспертизы в вопросах безопасности.
НЕ ПОВТОРЯТЬ, ЭТО ПРОТИВОЗАКОННО, НЕЛЬЗЯ ПОВТОРЯТЬ
История лишь для ознакомления, повторять абсолютно запрещено, заметка исключительно в целях сокрытия СВОИХ проектов от глупых действий.
Все эти игрища были лишь в организации, где изначально у меня были хоть какие-то, но минимальные права.
Будет ли это работать при публичных репозиториях?
Как мне проверить это и защитить свои публичные репозитории от хакеров?
Немного теории. Выжимка для самых маленьких - вы ведь не хотите читать всю документацию GitHub.
1) Когда я запускаю у себя(личный репо, репо организации) воркфлоу - это МОЙ секьюрити контекст.
Мой securitycontext = мне доступны все секреты.
Если я сделаю форк от любого публичного репозитория, затем "что-то подменяю" в коде и отправлю pull request - это Fork а значит недоступен SecurityContext и секреты. То есть при любом форке - секреты недоступны, только если автор репозитория специально руками не сделает это(по умолчанию выключено).
Однако есть директива
pull_request_targethttps://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#pull_request_target
Если в каком-то репозитории есть такая директива = при форке и пулл реквесте мы получаем доступ к SecurityContext.
2)GitHub не дурак и отслеживает любые изменения файлов воркфлоу.
Даже если у нас есть
pull_request_target, но мы взяли и подменили workflow файл, добавив туда нечто типа run: python scripts/print_secret.py - этих изменений не будет в воркфлоу - есть дифф между оригиналомЭто всё теория, а что насчёт практики.
Чтобы "взломать все интернеты" нам надо соблюдение таких условий
- чтобы была опасная директива
pull_request_target - "pull_request_target"- чтобы директория была -
path:.github/workflows/- чтобы мы могли как-то где-то что-то запустить, НЕ изменяя файл воркфлоу, но заинжектить свой вредоносный код, а точнее защититься от такой ситуации в своих публичных репозиториях.
Как мы можем заинжектить, не меняя ничего в воркфлоу?
Нам надо найти куски кода, где в run есть:
- нечто типа
python script.py (подменяем сам скрипт и он выполняется, извлекая секреты)-
pip install (в setup.py инжектим pre-install и выполнение нашего кода, получаем доступ к секретам) -
npm install/command (ну тут понятно - лепи что хочешь)- всё подобное, что выше, но для других языков/утилит
В двух словах поиск будет типа
org:***** path:.github/workflows/ "pull_request_target" "${{ secrets." "install"В общем и целом это помогает злоумышленнику получить доступ к вашим секретам через форк и пулл реквест.
Однако когда я начал писать об этом репорт, я уже решил почитать документацию и везде написано, что такие действия опасные.
То есть тот, кто включил у себя
pull_request_target - сам себе злобный буратино.Та же ситуация с запуском скриптов из всех примеров выше.
Вероятно от https://hackerone.com/ я получу такой же ответ.
Репорт не стал писать. И слишком много условий и в документации есть миллионы ворнингов.
Итоги.
Первые две истории - это реальные репорты с реальным ответом. Все семь репортов мне закрыли с
Informative (Closed). Само собой без каких-либо выплат. Остальные пять репортов я тут публиковать не буду - их них ещё можно протянуть дальше кейсы и попробовать дальше эволюционировать в реальную уязвимость (они уровнем выше, чем эти истории на мой взгляд).
Третья же история это самостоятельное погружение "а как это работает".
Для себя же стоит запомнить:
- никогда не использовать в своих публичных репозиториях
pull_request_target - при форке идёт передача SecurityContext и все секреты отдаются публично.- нникогда не использовать в своих публичных репозиториях запуск сторонник скриптов типа
python script.py- не рассчитывать на сохранность всех секретов GitLab
- я ещё поиграю в хакера и попробую заработать на других потенциальных уязвимостях
И да - я опять поленился писать лонгрид в один пост, сорян.
1👍17❤3🔥2😴1
#zalando #kubernetes #troubleshooting
"Алекс, у нас там проблемы с БД, которая у вас в кубере - приложение не подключается к нему, пишет всякое".
Не в первой диагностировать что-либо, но сперва вводные:
все базы у нас в кубернетисе, всё через оператора. в аргосиди репо в приложениях мы просто клеймим бд/юзера и приложением забирает адрес, логин и пароль из секретов кубера. Всё достаточно просто.
Лезу в тикет джиры, тред в слаке - коллеги разработчики жалуются, что в случайное время бизнес приложением не может писать в базу. Где-то ошибка, что не возможно подключится, где-то пишет, что база данных находится в ридонли.
Читаю поверхностно логи приложения, оператора, кластера БД - всё вроде ок.
Через разрешение рестартую приложение - проблема уходит.
Закрываю тикет, с лицом Дукалиса-солнышко объясняю деткам-разработчикам, что магии не бывает - у вас приложение говно, раз рестарт POD-a с бизнесовым приложением помогает. БД я не трогаю вообще.
Спустя несколько дней ситуация повторяется, но я, как умный синёр самоуверенный помидор, делаю рестарт пода приложения и снова снисходительно поясняю неразумным коллегам - проблема на вашей стороне.
Не, ну правда - если я вообще не трогаю БД и рестарт бизнес апп помогает - как я мог решить, что виновата инфра?
И потом ситуация ещё пару раз.
А при повторе на другом стеке, другого бизнес приложения подобной ошибки, у нас в команде начинают появляться подозрения, что мы не такие уж и синёры, а обычные мартышки.
В команде всего двое, кто любит нырять глубоко в траблшутинг, ныряю я.
Логи логи логи. Не буду тратить время на описание, но я бессмысленно потратил несколько дней - и ничего не нашёл. Не зная, что искать - ничего и не находишь.
Жалобы время от времени всё поступали и мы совсем сникли.
Для помощи самому себе так же подняли, не моими силами, сбор метрик не только PostgreSQL, но и Patroni.
Однако метрики ничем не помогли.
Просветление было однажды, когда я поймал и саму проблему и сумел увидеть в логе
Это была первая зацепка, и следом начал цепляться за всякое типа
Зацепка, отписываем промежуточное мнение:
кластер делает свичовер но НЕ переключает на реплику(мы это видим по IP при ресолвинге)
наши бизнес приложения продолжают сидеть в том же пуле, их не выкидывает и не переключают на мастера
появляются новые пиды, у которых лайфсайкл времени идёт от времени свичовера.
Складывая в пул все найденные логи, какие-то новые для себя слова, я прихожу к
https://patroni.readthedocs.io/en/master/dcs_failsafe_mode.html
О, как это было похоже на то, что у нас происходило.
Не буду пояснять тут, в документации отлично всё расписано.
Проверяем: а есть ли у нас эта алупа:
Бл, а оно у нас и не включено.
Иду у чарт
https://github.com/zalando/postgres-operator/blob/master/docs/reference/operator_parameters.md#patroni-options
https://github.com/zalando/postgres-operator/blob/master/manifests/configmap.yaml#L52
В общем обосратушки, в операторе это выключено.
Для теста включаю в чарте в отдельном теге.
Затем в dev контуре перевожу все аппликейшны на новый чарт.
Проверяем применилось ли это:
и
Где не применилось, там спасибо оператору, пилим костыль
Пару недель тестов - ошибка больше не повторялось. Ура, победа!
"Алекс, у нас там проблемы с БД, которая у вас в кубере - приложение не подключается к нему, пишет всякое".
Не в первой диагностировать что-либо, но сперва вводные:
все базы у нас в кубернетисе, всё через оператора. в аргосиди репо в приложениях мы просто клеймим бд/юзера и приложением забирает адрес, логин и пароль из секретов кубера. Всё достаточно просто.
Лезу в тикет джиры, тред в слаке - коллеги разработчики жалуются, что в случайное время бизнес приложением не может писать в базу. Где-то ошибка, что не возможно подключится, где-то пишет, что база данных находится в ридонли.
Читаю поверхностно логи приложения, оператора, кластера БД - всё вроде ок.
Через разрешение рестартую приложение - проблема уходит.
Закрываю тикет, с лицом Дукалиса-солнышко объясняю деткам-разработчикам, что магии не бывает - у вас приложение говно, раз рестарт POD-a с бизнесовым приложением помогает. БД я не трогаю вообще.
Спустя несколько дней ситуация повторяется, но я, как умный синёр самоуверенный помидор, делаю рестарт пода приложения и снова снисходительно поясняю неразумным коллегам - проблема на вашей стороне.
Не, ну правда - если я вообще не трогаю БД и рестарт бизнес апп помогает - как я мог решить, что виновата инфра?
И потом ситуация ещё пару раз.
А при повторе на другом стеке, другого бизнес приложения подобной ошибки, у нас в команде начинают появляться подозрения, что мы не такие уж и синёры, а обычные мартышки.
В команде всего двое, кто любит нырять глубоко в траблшутинг, ныряю я.
Логи логи логи. Не буду тратить время на описание, но я бессмысленно потратил несколько дней - и ничего не нашёл. Не зная, что искать - ничего и не находишь.
Жалобы время от времени всё поступали и мы совсем сникли.
Для помощи самому себе так же подняли, не моими силами, сбор метрик не только PostgreSQL, но и Patroni.
Однако метрики ничем не помогли.
Просветление было однажды, когда я поймал и саму проблему и сумел увидеть в логе
demoting self because DCS is not accessible and I was a leader
Это была первая зацепка, и следом начал цепляться за всякое типа
20**/12/06 11:30:18 main.go:127: Connection stats - max: 200, used: 12, available: 185 (6.0% used)
20**/12/06 11:30:18 main.go:130: Connection states - active: 3, idle: 6, idle in transaction: 0
20**/12/06 11:30:18 main.go:274: Database in recovery mode: true
Зацепка, отписываем промежуточное мнение:
кластер делает свичовер но НЕ переключает на реплику(мы это видим по IP при ресолвинге)
наши бизнес приложения продолжают сидеть в том же пуле, их не выкидывает и не переключают на мастера
появляются новые пиды, у которых лайфсайкл времени идёт от времени свичовера.
Складывая в пул все найденные логи, какие-то новые для себя слова, я прихожу к
https://patroni.readthedocs.io/en/master/dcs_failsafe_mode.html
О, как это было похоже на то, что у нас происходило.
Не буду пояснять тут, в документации отлично всё расписано.
Проверяем: а есть ли у нас эта алупа:
root@test-db-2:/home/postgres# curl http://localhost:8008/config | jq
...
{
"failsafe_mode": false,
...
Бл, а оно у нас и не включено.
Иду у чарт
https://github.com/zalando/postgres-operator/blob/master/docs/reference/operator_parameters.md#patroni-options
https://github.com/zalando/postgres-operator/blob/master/manifests/configmap.yaml#L52
В общем обосратушки, в операторе это выключено.
Для теста включаю в чарте в отдельном теге.
Затем в dev контуре перевожу все аппликейшны на новый чарт.
Проверяем применилось ли это:
kubectl exec -it test-db-0 -- curl http://localhost:8008/config | jq .failsafe_mode
true
и
kubectl get postgresql test-db -o yaml | grep -A 2 patroni
patroni:
failsafe_mode: true
Где не применилось, там спасибо оператору, пилим костыль
kubectl rollout restart statefulset test-db
Пару недель тестов - ошибка больше не повторялось. Ура, победа!
1👍14👎1
Итоги:
- zalando operator так себе, это далеко не первый баг/моя претензия к нему
- я узнал о новых для себя вещах типа Distributed Configuration Store (DCS)
- не всегда ситуация "делаем рестарт бизнес пода = помогает" это проблема приложения. иногда мартышки это мы🐒
- CNPG - лучший❤️, не используйте никогда zalando
- zalando operator так себе, это далеко не первый баг/моя претензия к нему
- я узнал о новых для себя вещах типа Distributed Configuration Store (DCS)
- не всегда ситуация "делаем рестарт бизнес пода = помогает" это проблема приложения. иногда мартышки это мы
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍11👎1
Скоро обновлять подписку JetBrains.
Немного расстроен.
Всегда любил продукты JetBrains.
Много и часто использовал/использую IDEA, DataGrip, PyCharm, Goland(когда пытался в голанг учиться), Aqua, немного DataSpell и другие.
Мне нравится их программа поощрения, когда при продлении подписки All Products Pack дают 20% скидки.
При поиске промокода вообще недорого выходит продление и у меня есть доступ сразу к десятками инструментов.
Однако это было в 2020-2024 годах.
В 2024-2025 ситуация поменялась и последние годы у нас есть невероятно стабильный, скоростной и бесплатный VSCode с кучей крутых экстеншнов.
Появились AI-based IDE (кто-то любит, кто-то хейтит, речь не об этом) - Cursor, Windsurf и тысячи их.
Появились MCP агенты, чаты и даже нейронки, умеющие в мульти контекст.
Баги правятся оперативно(возможно даже благодаря вайб-патч-кодингу).
А JetBrains остались в стороне. Не буду ругать за AI ассистента - он терпимый, работает на современном уровне, даже на gpt4o. Сами ответы ок, хоть и интерфейс/взаимодействие полный треш.
Меня больше расстроило, что долго исправляют баги и часто ломают своими релизами примерно всё.
DataGrip за последний год у меня ломался 8 раз.
Каждый сраный релиз новые болезни:
- открываешь БД, раскрываешь каталоги/таблицы/схемы - он крутится-крутится и потом херак - схлопывается. А он просто не показывает что есть внутри. Либо рестарт приложения, либо рефреш, пока он не покажет все таблицы снова.
- запускаешь кверю через едитор в монгу - а он просто терминейтит окошко, ну что такое
- подключаешься к трино, а он при больших кверях отжирает много CPU. Локально. Алё! Это воркеры, а не клиентская часть выполняет аналитический запрос! откуда нагрузка??
И так постоянно.
IDEA (и другие на самом деле IDE) тоже постоянно с багами.
- проблема с плагинами повсеместно - то YAML стандарт нарушает, то схему не так читает
- то плагины просто сломаны и месяцами(!) не фиксятся
Например в этом/том году месяцев 8 вроде ждал исправления.
Воркэраунд был такой
Ну не песец, а? (они исправили и потом через несколько месяцев снова сломали по терраформу).
Writerside стал не актуальным с появлением context-based утилит и автогенерации документации, но и он пару раз какую-то херню выдавал, не помню уже.
В общем количество багов, неповоротливые долго запускающиеся (на wsl, на маке терпимо ок) IDE меня утомили.
Думаю не смогу продлить в этом году подписку, потеряю все последующие скидки, но я правда в этом году не вижу ни одного плюса у jetbrains. Мне кажется они перестали успевать за рынком и требованиями пользователей.
Жаль, IDEA была для меня легендарной IDE.❤️
Похоже время попрощаться со всем набором ПО от этих ребят, держаться за них лишь за скидки наверное ну такое, странное.😔
Немного расстроен.
Всегда любил продукты JetBrains.
Много и часто использовал/использую IDEA, DataGrip, PyCharm, Goland(когда пытался в голанг учиться), Aqua, немного DataSpell и другие.
Мне нравится их программа поощрения, когда при продлении подписки All Products Pack дают 20% скидки.
При поиске промокода вообще недорого выходит продление и у меня есть доступ сразу к десятками инструментов.
Однако это было в 2020-2024 годах.
В 2024-2025 ситуация поменялась и последние годы у нас есть невероятно стабильный, скоростной и бесплатный VSCode с кучей крутых экстеншнов.
Появились AI-based IDE (кто-то любит, кто-то хейтит, речь не об этом) - Cursor, Windsurf и тысячи их.
Появились MCP агенты, чаты и даже нейронки, умеющие в мульти контекст.
Баги правятся оперативно(возможно даже благодаря вайб-патч-кодингу).
А JetBrains остались в стороне. Не буду ругать за AI ассистента - он терпимый, работает на современном уровне, даже на gpt4o. Сами ответы ок, хоть и интерфейс/взаимодействие полный треш.
Меня больше расстроило, что долго исправляют баги и часто ломают своими релизами примерно всё.
DataGrip за последний год у меня ломался 8 раз.
Каждый сраный релиз новые болезни:
- открываешь БД, раскрываешь каталоги/таблицы/схемы - он крутится-крутится и потом херак - схлопывается. А он просто не показывает что есть внутри. Либо рестарт приложения, либо рефреш, пока он не покажет все таблицы снова.
- запускаешь кверю через едитор в монгу - а он просто терминейтит окошко, ну что такое
- подключаешься к трино, а он при больших кверях отжирает много CPU. Локально. Алё! Это воркеры, а не клиентская часть выполняет аналитический запрос! откуда нагрузка??
И так постоянно.
IDEA (и другие на самом деле IDE) тоже постоянно с багами.
- проблема с плагинами повсеместно - то YAML стандарт нарушает, то схему не так читает
- то плагины просто сломаны и месяцами(!) не фиксятся
Например в этом/том году месяцев 8 вроде ждал исправления.
Воркэраунд был такой
Дальнейший поиск вывел на чудесные комментарии к плагину
https://plugins.jetbrains.com/plugin/7808-terraform-and-hcl/reviews
и решение в виде
Settings -> Tools -> External tools
- add new
- name: "terraform fmt"
- program: "/path/to/terraform/binary"
- arguments: "fmt $FilePath$"
- save
Теперь ctrl+alt+L форматирует корректно.
Ну не песец, а? (они исправили и потом через несколько месяцев снова сломали по терраформу).
Writerside стал не актуальным с появлением context-based утилит и автогенерации документации, но и он пару раз какую-то херню выдавал, не помню уже.
В общем количество багов, неповоротливые долго запускающиеся (на wsl, на маке терпимо ок) IDE меня утомили.
Думаю не смогу продлить в этом году подписку, потеряю все последующие скидки, но я правда в этом году не вижу ни одного плюса у jetbrains. Мне кажется они перестали успевать за рынком и требованиями пользователей.
Жаль, IDEA была для меня легендарной IDE.❤️
Похоже время попрощаться со всем набором ПО от этих ребят, держаться за них лишь за скидки наверное ну такое, странное.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2😢2
#kubernetes #azure #aks #troubleshooting #argo #dapr #api
Ныряем в Azure AKS API.
Часть 1 из 2.
У нас болел кубернетис апи.
Болел долго, со вкусом.
Словно мужчина 30+ лет с температурой 37.2, с опекой рядом кудахтающей супруги.
Мы честно хотели его вылечить, но у меня лично никогда не было глубокого опыта дебага апи, часть команды было просто пофиг. Вроде работает? Хорошо. Бизнес, само собой, такими вещами и не интересуется.
Это вызывало массу сайд эффектов: 4 или 5 из моих историй это следствие загрузки K8S API.
Работа операторов, работа кеды и dcs демоушн.
Однажды мненадо было списать много времени по трекеру интересно разобраться с причиной.
Путь первый. Невежественность.
В кластере много компонентов, которые работают с кубернетес апи.
ArgoCD, Kyverno, десятки операторов. Много всего.
Первый мой шаг - поэтапно вырубать контроллеры
То есть я тупо один за одним вырубал какие-то компоненты.
и ждал. 30-60 минут, есть ли эффект.
Конечно же предупреждая коллег, и в случае необходимости тут же скейлил вверх.
Эта идея была тупая, я убил несколько часов/дней.
Никакого результата.
Путь второй. Наивность.
Дальше я выбрал путь наивности - ходил по приложениям, операторам и где мог, подкручивал параметры, чтобы обращения к АПИ был реже. Всякие реконсилейшн у арго, демоушн патрони, частота запросов кеда оператора и так далее.
Помогло ли это? Нет. Стало ли лучше? Глобально - да, ведь я просто оттюнил к лучшему.
К пункту наивности я бы добавил все мои попытки разобраться "что не так с апи по метрикам".
Метрики никак и никогда не дают информации кто же даёт основную нагрузку.
Путь третий. Просветление.
Очевидно предыдущие попытки были унылы и тупы.
Почитал интернет, нейронки, документацию.
Первым делом включаю аудит-лог.
Azure-Kubernetes-Monitoring-Diagnostic settings.
Дальше включаю для Kubernetes API и сохранение в Log Analytics workspace.
Сохраняю, иду в
Там выбираю Logs и ищу сперва все ошибки.
Вижу кучу ошибок.
Ок, начнем с рандом частой ошибки:
Не заостряю внимание на продукте, мне он знаком (можно почитать на https://github.com/dapr/dapr/).
По ошибке проблема сервиса(хоть и странный адрес), а есть ли он?
Он есть.
Почему возникает эта ошибка?Сперва смотрю валуес
Нет ничего интересно, как и в нашем values файле.
Иду в чарт и качаю его к себе https://github.com/dapr/helm-charts/blob/master/dapr-1.14.2.tgz
Вижу кучу темплейтов, хелперсов, CRD.
В CRD указано, что сам оператор реплейсит CRD.
То есть оператор время от времени должен реплейсить неймспейс внутри CRD с
А он не реплейсит. Хорошо, меняю сам руками, смотрю результат.
Радуюсь, иду в логи - а там снова ошибка.
Непонятно. Возвращаюсь обратно а там
Да камон.
Ныряем в Azure AKS API.
Часть 1 из 2.
У нас болел кубернетис апи.
Болел долго, со вкусом.
Словно мужчина 30+ лет с температурой 37.2, с опекой рядом кудахтающей супруги.
Мы честно хотели его вылечить, но у меня лично никогда не было глубокого опыта дебага апи, часть команды было просто пофиг. Вроде работает? Хорошо. Бизнес, само собой, такими вещами и не интересуется.
Это вызывало массу сайд эффектов: 4 или 5 из моих историй это следствие загрузки K8S API.
Работа операторов, работа кеды и dcs демоушн.
Однажды мне
Путь первый. Невежественность.
В кластере много компонентов, которые работают с кубернетес апи.
ArgoCD, Kyverno, десятки операторов. Много всего.
Первый мой шаг - поэтапно вырубать контроллеры
То есть я тупо один за одним вырубал какие-то компоненты.
kubectl scale --replicas 0 sts/name
kubectl scale --replicas 0 deploy/name
и ждал. 30-60 минут, есть ли эффект.
Конечно же предупреждая коллег, и в случае необходимости тут же скейлил вверх.
Эта идея была тупая, я убил несколько часов/дней.
Никакого результата.
Путь второй. Наивность.
Дальше я выбрал путь наивности - ходил по приложениям, операторам и где мог, подкручивал параметры, чтобы обращения к АПИ был реже. Всякие реконсилейшн у арго, демоушн патрони, частота запросов кеда оператора и так далее.
Помогло ли это? Нет. Стало ли лучше? Глобально - да, ведь я просто оттюнил к лучшему.
К пункту наивности я бы добавил все мои попытки разобраться "что не так с апи по метрикам".
Метрики никак и никогда не дают информации кто же даёт основную нагрузку.
Путь третий. Просветление.
Очевидно предыдущие попытки были унылы и тупы.
Почитал интернет, нейронки, документацию.
Первым делом включаю аудит-лог.
Azure-Kubernetes-Monitoring-Diagnostic settings.
Дальше включаю для Kubernetes API и сохранение в Log Analytics workspace.
Сохраняю, иду в
Log Analytics workspace.Там выбираю Logs и ищу сперва все ошибки.
AKSControlPlane
| where Category == "kube-apiserver" and Level == "ERROR"
| limit 40
| project TimeGenerated, Level, Message
Вижу кучу ошибок.
Ок, начнем с рандом частой ошибки:
cacher (subscriptions.dapr.io): unexpected ListAndWatch error: failed to list dapr.io/v1alpha1, Kind=Subscription: conversion webhook for dapr.io/v2alpha1, Kind=Subscription failed: Post "https://dapr-webhook.replaceme.svc:443/convert?timeout=30s": service "dapr-webhook" not found; reinitializing...
Не заостряю внимание на продукте, мне он знаком (можно почитать на https://github.com/dapr/dapr/).
По ошибке проблема сервиса(хоть и странный адрес), а есть ли он?
kubectl get svc -n dapr-system | grep webhook
dapr-webhook ClusterIP 10.0.12.141 <none> 443/TCP
Он есть.
Почему возникает эта ошибка?Сперва смотрю валуес
helm show values dapr/dapr --version 1.14.2
Нет ничего интересно, как и в нашем values файле.
Иду в чарт и качаю его к себе https://github.com/dapr/helm-charts/blob/master/dapr-1.14.2.tgz
Вижу кучу темплейтов, хелперсов, CRD.
В CRD указано, что сам оператор реплейсит CRD.
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
...
spec:
group: dapr.io
conversion:
strategy: Webhook
webhook:
clientConfig:
service:
namespace: replaceme # Patched by post-install webhook
То есть оператор время от времени должен реплейсить неймспейс внутри CRD с
replaceme на реальный dapr-system.А он не реплейсит. Хорошо, меняю сам руками, смотрю результат.
kubectl edit crd subscriptions.dapr.io
customresourcedefinition.apiextensions.k8s.io/subscriptions.dapr.io edited
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: dapr-system
Радуюсь, иду в логи - а там снова ошибка.
Непонятно. Возвращаюсь обратно а там
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: replaceme
Да камон.
👍8
#kubernetes #azure #aks #troubleshooting #argo #dapr #api
Часть 2 из 2.
Думаю ну может я дурак, Меняю снова, уже не иду в логи, А проверяю на месте.
И картина там такая:
Бррр, как такое возможно.
Иду в гугл, нейронку, мне говорят "а ты посмотри - кто последний то меняет объект?".
Смотрю
Пффф, а арго то тут причем?
Снова меняю, снова смотрю - да, арго меняет обратно неймспейс на дефолт.
Иду в репозиторий арго, но там просто
Ну и
А больше мы ничего не меняем.
Снова документация, гугл.
Оказалось вот что:
- арго выкачивает ВЕСЬ чарт, внутри есть директория CRD и там внутри дефолт(путь к чарту был выше, внутри есть CRD директория с манифестами).
Промежуточное описание проблемы:
каждый N период времени оператор DAPR меняет namespace в CRD, тут же сам applicationset DAPR переходит в OutOfSync, арго начинает резко синкать, подтягивает весь чарт, видит, что поменялся CRD и меняет на дефолт. И так по кругу. Насилие ради насилия.
Я и коллега начали фиксить это несколькими вариантами через
Затем снова руками меняю неймспейс, смотрю - ура.
Неймспейс больше не ревратится, в аудит логе АПИ ошибки(этой) больше нет.
Да, арго больше не меняет.
Нагрузку снизили на ... на 4%. Мало, но уже что-то.
Выключаю аудит лог(он оооооооооочень дорогой), закрываю одну из саб-тасок касательно АПИ.
Ещё раз описание ишшуи:
- задеплоили арго аппликейшнсет через сторонний чарт с DAPR
- арго создаёт все сущности через хелмп темплейт (даже те, о которых мы в явном виде не знали)
- затем вебхук от оператора дапр переписывает CRD
- арго при синке видит дифф по CRD и переписывыает его снова
- и так по кругу
Пока не глянешь в кишки и не добавишь в игнор - насилие над апи кубера, так как весь функционал арго и дапра - через кубер апи.
Итог:
- я научился смотреть в логи аудита по Azure AKS API
- сгорел от дурости DAPR оператора и ArgoCD оператора в попытках переписать друг за другом CRD
- узнал про игноры в арго (вообще есть и иные решения для проблемы, но игнор самый простой)
- снизил нагрузку на 4% лишь с одним фиксом
Впереди ещё несколько подходов к апи, есть десятки других ошибок, буду с каждой разбираться отдельно.
Это оказалось интересно.
Часть 2 из 2.
Думаю ну может я дурак, Меняю снова, уже не иду в логи, А проверяю на месте.
И картина там такая:
kubectl edit crd subscriptions.dapr.io
customresourcedefinition.apiextensions.k8s.io/subscriptions.dapr.io edited
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: dapr-system
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: replaceme
Бррр, как такое возможно.
Иду в гугл, нейронку, мне говорят "а ты посмотри - кто последний то меняет объект?".
Смотрю
kubectl get crd subscriptions.dapr.io -o jsonpath='{.metadata.managedFields[*].manager}' | tr ' ' '\n' | sort | uniq -c
1 argocd-controller
1 kube-apiserver
1 kubectl-edit
1 operatorПффф, а арго то тут причем?
Снова меняю, снова смотрю - да, арго меняет обратно неймспейс на дефолт.
Иду в репозиторий арго, но там просто
---
name: dapr
namespace: dapr-system
repoURL: https://dapr.github.io/helm-charts/
targetRevision: 1.14.2
chart: dapr
Ну и
applicationset есть.А больше мы ничего не меняем.
Снова документация, гугл.
Оказалось вот что:
- арго выкачивает ВЕСЬ чарт, внутри есть директория CRD и там внутри дефолт(путь к чарту был выше, внутри есть CRD директория с манифестами).
Промежуточное описание проблемы:
каждый N период времени оператор DAPR меняет namespace в CRD, тут же сам applicationset DAPR переходит в OutOfSync, арго начинает резко синкать, подтягивает весь чарт, видит, что поменялся CRD и меняет на дефолт. И так по кругу. Насилие ради насилия.
Я и коллега начали фиксить это несколькими вариантами через
applicationset, типа---
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
...
template:
...
spec:
...
ignoreDifferences:
...
- group: apiextensions.k8s.io
kind: CustomResourceDefinition
name: subscriptions.dapr.io
jqPathExpressions:
- .spec.conversion.webhook.clientConfig.service.namespace
Затем снова руками меняю неймспейс, смотрю - ура.
Неймспейс больше не ревратится, в аудит логе АПИ ошибки(этой) больше нет.
Да, арго больше не меняет.
Нагрузку снизили на ... на 4%. Мало, но уже что-то.
Выключаю аудит лог(он оооооооооочень дорогой), закрываю одну из саб-тасок касательно АПИ.
Ещё раз описание ишшуи:
- задеплоили арго аппликейшнсет через сторонний чарт с DAPR
- арго создаёт все сущности через хелмп темплейт (даже те, о которых мы в явном виде не знали)
- затем вебхук от оператора дапр переписывает CRD
- арго при синке видит дифф по CRD и переписывыает его снова
- и так по кругу
Пока не глянешь в кишки и не добавишь в игнор - насилие над апи кубера, так как весь функционал арго и дапра - через кубер апи.
Итог:
- я научился смотреть в логи аудита по Azure AKS API
- сгорел от дурости DAPR оператора и ArgoCD оператора в попытках переписать друг за другом CRD
- узнал про игноры в арго (вообще есть и иные решения для проблемы, но игнор самый простой)
- снизил нагрузку на 4% лишь с одним фиксом
Впереди ещё несколько подходов к апи, есть десятки других ошибок, буду с каждой разбираться отдельно.
Это оказалось интересно.
1❤10👍7🔥5
#kubernetes
Тупости и лени пост.
Иногда бывает такое, что кластер обновился, развалился, автоматически секьюрити апдейтнулся(аригато, Azure), руками апгрейднулся(аригато, AWS, за принудительно-добровольные апгрейды, иначе денег-денег-денег дай).
Всё тоже самое, но с релизами приложений.
Выбрать любое.
После этого события у нас иногда сразу многое не работает и прилетает куча разных алёртов, ошибок, миллион ивентов.
Побуду бесплатным адвокатом AWS, такое крайне редко, чаще в Azure проблемы.
Проблема: в моменте не очень понятно - а куда вообще смотреть, чего чинить первым?
1) Я сразу по заранее сохранённой ссылке в
Фильтр
Ссылка формата
+ есть аналог дашборда в графане, но по привычке лезу сразу в
Grafana красивее, нагляднее и удобнее, но привычка дело такое.
Тут ничего для всех нового, но алертов СЛИШКОМ много. Надо как-отфильтровать последнее.
2) Иду в кластер(ы) и одним махом очищаю всё, что мне помешает Быстрой диагностике.
Да, я знаю потенциальные последствия, на 100% их понимаю, что делают команды.
У меня есть алиасы формата
Я прям иногда ввожу
Что это даёт мне:
- все подвисшие/unknown/комплетед/файлед и так далее поды уходят в небытие и мне просто глазами визуально удобнее следить/чинить то, что надо, а не что исторически не релевантно
- все файлед джобы от кронджобов подчищаются и перестают лететь тонны алертов о незавершенных джобах.
Цель: быстро избавить визуальное пространство от "мусорных" исторических алертов и failed объектов, чтобы быстрее найти и починить главное и актуальное.
3) При необходимости смотрю ивенты, с фильтром по времени и не нормал северити
4) Снова иду в графану/алертменеджер, смотрю, что осталось(обычно 90-95% шума улетает сразу) и чиню релевантное оставшееся.
Минусы подхода должны быть очевидны опытным инженерам и совсем не очевидны для начинаюших специалистов.
Для никому не нужной интриги минусы под спойлер.
- если у нас не собираются где-то все ивенты и логи, то мы теряем историю и причины, почему был failed, unknown, crashloopback etc. Если всё логируется, то пофиг, разве что exit code/reason мы не увидим(а оно нам надо? итак видно, что кластер обновился).
- если у нас есть velero ( https://velero.io/ ), то есть не иллюзорный шанс проетерять потенциальные бекапы. Например POD velero висел в pending, ожидая ресурсов(или иная причина), а я его убиваю.
Значит бекап, который должен был запуститься, будет запущен при следующем расписании. А сейчас его не будет.
В пендинге он может висеть, например, потому что разом запустилось по расписанию 100500 подов бекапа и упираемся(временно) в количество PVC/disk на ноде/нехватка нод во время апдейта.
Спустя время это проходит, но мои действия потенциально убивают штатный бекап.
С велеро я беру все риски на себя, осознавая, что он скоро (пере)запуститься и бекап будет готов. Так же у нас есть алерты по велеро, так что мне ок.
Возможно стоит переделать алиасы, добавив xargs и добавив в игнор велеро, но пока руки не дошли.
Да и не так часто такие ситуации бывают.
Тупости и лени пост.
Иногда бывает такое, что кластер обновился, развалился, автоматически секьюрити апдейтнулся(аригато, Azure), руками апгрейднулся(аригато, AWS, за принудительно-добровольные апгрейды, иначе денег-денег-денег дай).
Всё тоже самое, но с релизами приложений.
Выбрать любое.
После этого события у нас иногда сразу многое не работает и прилетает куча разных алёртов, ошибок, миллион ивентов.
Побуду бесплатным адвокатом AWS, такое крайне редко, чаще в Azure проблемы.
Проблема: в моменте не очень понятно - а куда вообще смотреть, чего чинить первым?
1) Я сразу по заранее сохранённой ссылке в
alertmanager, где стоит фильтр по кластеру(ам) и, иногда severity.Фильтр
cluster=~".*prod.*"Ссылка формата
+ есть аналог дашборда в графане, но по привычке лезу сразу в
alertmanager.Grafana красивее, нагляднее и удобнее, но привычка дело такое.
Тут ничего для всех нового, но алертов СЛИШКОМ много. Надо как-отфильтровать последнее.
2) Иду в кластер(ы) и одним махом очищаю всё, что мне помешает Быстрой диагностике.
Да, я знаю потенциальные последствия, на 100% их понимаю, что делают команды.
У меня есть алиасы формата
alias kkndp="k delete pod --field-selector 'status.phase!=Running' -A --force"
alias kkndj="kubectl delete jobs --all-namespaces --field-selector status.successful=0"
Я прям иногда ввожу
kkndp && kkndj в шелле.Что это даёт мне:
- все подвисшие/unknown/комплетед/файлед и так далее поды уходят в небытие и мне просто глазами визуально удобнее следить/чинить то, что надо, а не что исторически не релевантно
- все файлед джобы от кронджобов подчищаются и перестают лететь тонны алертов о незавершенных джобах.
Цель: быстро избавить визуальное пространство от "мусорных" исторических алертов и failed объектов, чтобы быстрее найти и починить главное и актуальное.
3) При необходимости смотрю ивенты, с фильтром по времени и не нормал северити
alias kwe="k get events -A --sort-by='.metadata.creationTimestamp' | grep -v Normal"
4) Снова иду в графану/алертменеджер, смотрю, что осталось(обычно 90-95% шума улетает сразу) и чиню релевантное оставшееся.
Минусы подхода должны быть очевидны опытным инженерам и совсем не очевидны для начинаюших специалистов.
Для никому не нужной интриги минусы под спойлер.
- если у нас есть velero (
Значит бекап, который должен был запуститься, будет запущен при следующем расписании. А сейчас его не будет.
В пендинге он может висеть, например, потому что разом запустилось по расписанию 100500 подов бекапа и упираемся(временно) в количество PVC/disk на ноде/нехватка нод во время апдейта.
Спустя время это проходит, но мои действия потенциально убивают штатный бекап.
С велеро я беру все риски на себя, осознавая, что он скоро (пере)запуститься и бекап будет готов. Так же у нас есть алерты по велеро, так что мне ок.
Возможно стоит переделать алиасы, добавив xargs и добавив в игнор велеро, но пока руки не дошли.
Да и не так часто такие ситуации бывают.
1👍11❤2
#ocr #ats #cv #ai #ASCII #PDF
Возможно кто-то из инженеров сейчас сидит и не может найти работу, потому что его CV в PDF файле не могут распарсить AI боты и ATS. Банальный баг и невнимательность.
Внезапно узнал, что если вы, как и я, создаёте шаблон CV в MS Word, а потом сохраняете как PDF, то есть бага.
Word -> print as PDF = ❌ non-ASCII characters
Word -> save as PDF = ✅ всё ок (кроме сраных длинных типографских тире)
С печатью в PDF, например, вместо сочетания
Ровно как и все типы минусов/дефис/тире (их вроде около 5-6 типов).
Быстро советы:
- НЕ используйте печать как PDF для сохранения документа
- сделал PDF(любым способом) - открыл PDF - выделил всё ctrl+A - скопировал ctrl+c - вставил на странице https://pages.cs.wisc.edu/~markm/ascii.html - и так до тех пор, пока не будет спецсимволов.
Сейчас всё обрабатывают роботы при первичном скрининге.
Дайте роботам шанс дотащить ваш CV хотя бы до HR, сделайте его читаемым.❤️
Ссылки на почитать(опционально):
- https://pages.cs.wisc.edu/~markm/ascii.html
- https://my.onu.edu/sites/default/files/applicant_tracking_system_resume_guide.pdf
- https://careerservices.uic.edu/wp-content/uploads/sites/26/2017/08/Ensure-Your-Resume-Is-Read-ATS.pdf
- https://drive.google.com/file/d/1X5pOmi-s_ZIKPkKsVVElWhSjv80ihyS5/view
Возможно кто-то из инженеров сейчас сидит и не может найти работу, потому что его CV в PDF файле не могут распарсить AI боты и ATS. Банальный баг и невнимательность.
Внезапно узнал, что если вы, как и я, создаёте шаблон CV в MS Word, а потом сохраняете как PDF, то есть бага.
Word -> print as PDF = ❌ non-ASCII characters
Word -> save as PDF = ✅ всё ок (кроме сраных длинных типографских тире)
С печатью в PDF, например, вместо сочетания
TI/ti будет спецсимвол.documenta�on, suppor�ng, GitHub Ac�ons
Ровно как и все типы минусов/дефис/тире (их вроде около 5-6 типов).
Быстро советы:
- НЕ используйте печать как PDF для сохранения документа
- сделал PDF(любым способом) - открыл PDF - выделил всё ctrl+A - скопировал ctrl+c - вставил на странице https://pages.cs.wisc.edu/~markm/ascii.html - и так до тех пор, пока не будет спецсимволов.
Сейчас всё обрабатывают роботы при первичном скрининге.
Дайте роботам шанс дотащить ваш CV хотя бы до HR, сделайте его читаемым.❤️
Ссылки на почитать(опционально):
- https://pages.cs.wisc.edu/~markm/ascii.html
- https://my.onu.edu/sites/default/files/applicant_tracking_system_resume_guide.pdf
- https://careerservices.uic.edu/wp-content/uploads/sites/26/2017/08/Ensure-Your-Resume-Is-Read-ATS.pdf
- https://drive.google.com/file/d/1X5pOmi-s_ZIKPkKsVVElWhSjv80ihyS5/view
5❤15👍7👾3🔥2
#argocd #gitops
В рамках самостоятельной профессиональной регулярной переподготовки поработал пару ночей над ArgoCD https://argo-cd.readthedocs.io/
Вообще я с ним давно работаю, всё умею, вношу правки, добавляю новые аппликейшны/аппликейшнсеты, траблшутю и вообще всё понятно.
Но что, если всё поднять с нуля и не подглядывать за ранее написанным кодом?
Насколько сильно обделаюсь в свои портки за 40 грошей?
Задача простая: есть тестовая организация в GitHub, внутри 3 тестовых репозитория с 3 микросервисами, 1 репозиторий с универсальным helm chart, который подходит всем 3 тестовым микросервисам, 1 репозиторий argocd с манифестами Application + Application Set. Всё сделать сперва на мастер ветке, потом по тегам докер имиджа.
Мы стильные молодёжные, так что сразу с SSO авторизацией.
Есть тестовый(студенческий) аккаунт MS Azure + MS Entra.
Финишем добавить пару общий хелмчартов, ну не знаю, допустим прометиус стек, так же через арго.
Признаюсь, первые часа два я дичайше тупил.🚬
Сперва долго тупил с SSO. Потом орнул с разделения админ центра/enterprise applications/app service.
Ок, авторизацию прикрутил и это хорошо.
Потом долго пытался понять а как вообще цеплять репозитории к арго серверу.
Все валуес файлы делать в каждом репозитории? Или все валуес файлы хранить в репах с аппликейшнсетами?
Аппликейшн или аппликейшнсеты пилить? С учётом на рост(теории).
Если валуес хранить в репозиториях микросервисах, получается мне надо каждый из них внести по отдельности вместе с кредами? А как лучше - через https или git? А как проходит авторизация с гитом?
В итоге сделал через PAT GitHub и логин git (внезапно).
Ладно, репы подключил, но что если я всё ещё хочу валуес файлы хранить в репе с сервисам, а не в арго репе - мне все репы отдельно подключать надо?? Это же бред. Потом прочитал(и спросил у коллеги) про креденшл темплейт, что облегчило мою задачу, ведь всё в одной организации гитхаба. Не надо каждый подключать, очень удобно.
С репами вроде закончил.
Затем я перечитал десятки страниц документации, всякие how to/get started etc.
А у меня ничего не получалось.
Просто не было понимания как стартовать с нуля.
Вроде вот всё понятно: вот репы, вот чарт, вот аппликейшнсет, сейчас будет
Не хватало какого-то краеугольного куска гранита для понимания что не так.
В общем просто "изначальный" аппликешйн, который должен играть роль init/controller/bootstrap/App-of-Apps/mainapp (назвать как удобно), который и указывает аргохе куда смотреть на основные аппликейшнсеты...надо создавать руками через
Я не нашёл иных способов, как изначальную инициацию сделать без разового ввода команды.
Ок, это заработало, засинкалось. Появились аппликейшн сеты, пробовал добавить ещё, новые репы и так далее. Всё заработало.
Потом я ковырялся в реконселейшн арго, так как k8s кластер тестовый, free tier и его апишку просто ломало полностью от 8 приложений(+5 от чартов).
Вернулся к ролевой модели, поковырялся кто может видеть логи, кто может делать рестарт подов и удалять ресурсы, тоже потратил время.
В общем и целом задача закрыта - поднял всё с нуля. Не удивлюсь, что где-то сделал глупо, но идеально и не стояло задачи.
Увлекательное время.
Закрыл несколько пробелов в знаниях, освежил старые знаний.
Всё же одно дело работать с инструментом, который я либо настроил давно, либо вообще делали без меня, другое дело поднять всё с нуля.
В рамках самостоятельной профессиональной регулярной переподготовки поработал пару ночей над ArgoCD https://argo-cd.readthedocs.io/
Вообще я с ним давно работаю, всё умею, вношу правки, добавляю новые аппликейшны/аппликейшнсеты, траблшутю и вообще всё понятно.
Но что, если всё поднять с нуля и не подглядывать за ранее написанным кодом?
Насколько сильно обделаюсь в свои портки за 40 грошей?
Задача простая: есть тестовая организация в GitHub, внутри 3 тестовых репозитория с 3 микросервисами, 1 репозиторий с универсальным helm chart, который подходит всем 3 тестовым микросервисам, 1 репозиторий argocd с манифестами Application + Application Set. Всё сделать сперва на мастер ветке, потом по тегам докер имиджа.
Мы стильные молодёжные, так что сразу с SSO авторизацией.
Есть тестовый(студенческий) аккаунт MS Azure + MS Entra.
Финишем добавить пару общий хелмчартов, ну не знаю, допустим прометиус стек, так же через арго.
Признаюсь, первые часа два я дичайше тупил.
Сперва долго тупил с SSO. Потом орнул с разделения админ центра/enterprise applications/app service.
Ок, авторизацию прикрутил и это хорошо.
Потом долго пытался понять а как вообще цеплять репозитории к арго серверу.
Все валуес файлы делать в каждом репозитории? Или все валуес файлы хранить в репах с аппликейшнсетами?
Аппликейшн или аппликейшнсеты пилить? С учётом на рост(теории).
Если валуес хранить в репозиториях микросервисах, получается мне надо каждый из них внести по отдельности вместе с кредами? А как лучше - через https или git? А как проходит авторизация с гитом?
В итоге сделал через PAT GitHub и логин git (внезапно).
Ладно, репы подключил, но что если я всё ещё хочу валуес файлы хранить в репе с сервисам, а не в арго репе - мне все репы отдельно подключать надо?? Это же бред. Потом прочитал(и спросил у коллеги) про креденшл темплейт, что облегчило мою задачу, ведь всё в одной организации гитхаба. Не надо каждый подключать, очень удобно.
С репами вроде закончил.
Затем я перечитал десятки страниц документации, всякие how to/get started etc.
А у меня ничего не получалось.
Просто не было понимания как стартовать с нуля.
Вроде вот всё понятно: вот репы, вот чарт, вот аппликейшнсет, сейчас будет
????? и ???? и всё заработает.Не хватало какого-то краеугольного куска гранита для понимания что не так.
В общем просто "изначальный" аппликешйн, который должен играть роль init/controller/bootstrap/App-of-Apps/mainapp (назвать как удобно), который и указывает аргохе куда смотреть на основные аппликейшнсеты...надо создавать руками через
kubectl apply -f init.yamlЯ не нашёл иных способов, как изначальную инициацию сделать без разового ввода команды.
Ок, это заработало, засинкалось. Появились аппликейшн сеты, пробовал добавить ещё, новые репы и так далее. Всё заработало.
Потом я ковырялся в реконселейшн арго, так как k8s кластер тестовый, free tier и его апишку просто ломало полностью от 8 приложений(+5 от чартов).
Вернулся к ролевой модели, поковырялся кто может видеть логи, кто может делать рестарт подов и удалять ресурсы, тоже потратил время.
В общем и целом задача закрыта - поднял всё с нуля. Не удивлюсь, что где-то сделал глупо, но идеально и не стояло задачи.
Увлекательное время.
Закрыл несколько пробелов в знаниях, освежил старые знаний.
Всё же одно дело работать с инструментом, который я либо настроил давно, либо вообще делали без меня, другое дело поднять всё с нуля.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍17