Make. Build. Break. Reflect.
908 subscribers
115 photos
1 video
119 links
Полезные советы, всратые истории, странные шутки и заметки на полях от @kruchkov_alexandr
Download Telegram
#пятница

Три темы писем, которые боюсь получать:
- Urgent: cloud cost anomaly detected
-
⚠️Prod is down. Last email alert. Slack is unavailable.
- 🎉
🚀2025 Performance Review. 🎉🚀

Бл, лучше бы сейчас пришло второе
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9
Снова terragrunt.

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

Иногда приходим к подобным структурам(это лишь пример, это не бест практис):
infrastructure/
├── terragrunt.hcl
├── modules/
│ ├── networking/
│ ├── database/
│ ├── kubernetes/
│ ├── monitoring/
│ ├── security/
│ ├── storage/
│ ├── compute/
│ ├── iam/
│ ├── logging/
│ └── dns/
└── environments/
├── dev/
│ ├── terragrunt.hcl
│ ├── networking/
│ │ └── terragrunt.hcl
│ ├── database/
│ │ └── terragrunt.hcl
│ ├── kubernetes/
│ │ └── terragrunt.hcl
│ └── ...
├── staging/
│ ├── terragrunt.hcl
│ ├── networking/
│ │ └── terragrunt.hcl
│ ├── database/
│ │ └── terragrunt.hcl
│ └── ...
└── prod/
├── terragrunt.hcl
├── networking/
│ └── terragrunt.hcl
├── database/
│ └── terragrunt.hcl
└── ...

При работе с такой структурой все красиво, удобно и замечательно происходит кроме одной вещи.
Неиспользование кеша провайдеров.
При запуске terragrunt plan в каждой из директорий по сути качает в эту директорию и провайдер и копию модуля.
При запуске terragrunt run-all и вовсе может занять десятки минут и сожрать много места на вашем диске( у меня однажды было порядка 200 гигабайт).

На помощь нам приходит простая переменная.
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
mkdir -p $HOME/.terraform.d/plugin-cache

У меня это просто в башрс лежит
>cat ~/.bashrc |grep -i terra
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"

В этом случае у нас идёт пере использование бинарного файла.

В кратких тезисах это работает внутри:
- в директории ~/.terraform.d/plugin-cache хранятся только бинарные файлы провайдеров
- в .terragrunt-cache хранится рабочая копия нашего кода (модулей Terraform)
- "тяжелые" бинари в .terragrunt-cache имеют симлинк в ~/.terraform.d/plugin-cache
Пример
environments/dev/networking/
├── terragrunt.hcl
└── .terragrunt-cache/
└── AbCdEfGh12345/
└── XyZaBcDe67890/ # хеш-директория
├── main.tf # копия нашего модуля терраформа
├── variables.tf
├── outputs.tf
├── .terraform/
│ └── providers/
│ └── registry.terraform.io/
│ └── hashicorp/
│ └── aws/
│ └── 4.67.0/
│ └── linux_amd64 -> ~/.terraform.d/plugin-cache/registry.terraform.io/hashicorp/aws/4.67.0/linux_amd64 # симлинк на провайдер в директории с кешем
└── ...


Насколько мне известно нельзя полностью перетащить файлы модуля терраформа к бинарям, так как
- разные модули могут требовать разные версии одного и того же кода
- при параллельном выполнении, например terragrunt run-all нужны изолированные рабочие каталоги

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

* Эта переменная НЕ избавит вас полностью от создания директории .terragrunt-cache/ ибо это невозможно насколько мне известно.

** Так же рекомендую добавить эту директорию в gitignore, для работа гита она не нужна.
>cat .gitignore |grep -i terra
.terragrunt-cache/


#terragrunt #terraform
🔥4👍3
Slack приуныл по всему миру.
Алёрты не приходят(во всяком случае ко мне не все).

TODO: продублировать критикал алёрты через почту телеграм при недоступности слака.

https://slack-status.com/

ну так себе алёртинг я сделал
👀1
"Busy busy busy busy, need a vacation"

Чертовски обожаю эту фразу из фильма Константин 2005 года
https://youtu.be/xoD44rohrtU?si=YFBoQT1OATUEP2z-&t=103

Эта фраза и выражение его лица описывает моё состояние, когда считаю чего у нас по тратам.
Как говорит моя супруга - не важно сколько ты зарабатываешь, важно понимать, сколько ты тратишь, девопс херов🤣.

Каждые 6 месяцев я провожу ревизию "а куда уходят деньги".
Сперва я хотел написать, что 2024 и 2025 были самыми затратными годами - эпоха ИИ, эра автоматизации и век подписок, но потом поднял записи за 2019-2021, когда я с ноги вкатывался в айти и убивал тонны денег на курсы и книги, там тоже траты невероятно огромные.
Отус, Скиллфактори и Слёрм выпивал все наши семейные деньги с кредитки подчистую.

Итак 2025 год:
- $477 в год - https://learning.oreilly.com/
Самый лучший сборник книг, курсов и планов развития
Например этот курс самый лучший курс в мире про линукс
https://learning.oreilly.com/course/red-hat-certified/9780137931521/
- $218 в год - https://account.jetbrains.com/ All Products Pack
Пользуюсь 6 софтинами(datagrip my love, idea, goland, dataspell, pycharm и writerside)из всего пака, остальные не зашли.
- $216 в год - https://claude.ai// PRO
ИИ номер два
- $300 в год https://grok.com/ SUPERGROK
ИИ номер ноль
- около $300-350 в год уходит на курсы с разных источников
Это не подписка, но в среднем так и выходит в год.
Например в августе 2024 года приобрёл прекрасный пак ALL THE THINGS на https://learn.cantrill.io/ за $200. Прошёл 35 часов пока.
Или в январе 2024 оплатил $89 за год подписки, качал себе навык https://www.educative.io/courses/grokking-the-system-design-interview .
Прошёл весь, правда не понял половины, придётся пересматривать.
- $99 в год MS office family 365 (5 юзеров из 6 используется)
Лучший софт для офиса, великолепное решение для облачного хранилища.
5 человек получают по 1терабайту с очень отличной скоростью. То есть каждому и пакет офис и каждому по 1 терабайту.
Выгодно всем, но плачу один я🤣
* когда платил в рублях до 2021 было вообще копейки, практически 4000 рублей в год, покупал на яндекс маркете.
- $40 в год на https://medium.com/
Вот сейчас пишу это и понимаю, что надо вырубить нафиг.
- 2600 рублей в год https://music.yandex.ru/home family на 4 человека
музыка русских исполнителей (не всё есть в спотифай)

- $20 в месяц https://www.perplexity.ai/
ИИ номер один
- $10 в месяц на дешёвые VPS
под VPN в разные направления. Этот мир стал не так прост без VPN.
- около $5-50 в месяц на работу с https://openai.com
Но тут скоро уже не буду платить, наигрался, брал для локальных игр с текстовыми моделями
- 360 рублей в месяц на VoIP в/из России с личным московским номеров https://www.telphin.ru/
увы, мой отец очень не молод и не смог в смартфоны, с его кнопочного можно звонить только на обычные номера, никаких вайбер/телеграм/ватсап
- ~$25-45 в месяц https://cloud.linode.com/
два моих пет-проекта, которые раньше приносили денег, а сейчас не приносят и я всё ещё надеюсь, что стрельнёт и всё плачу :(
- 30 евро в месяц - интернет 500/500
- 279 рублей в месяц esim RU
- 3 евро в месяц esim RS
- 360 рублей в месяц esim UZ
- $1.7 https://www.spotify.com/
не вся музыка есть на Яндекс музыке
- 3,5 евро в месяц на приложение wolt+
Доставка еды и товаров из магазинов. За счёт бесплатной доставки, частых заказов и промоцен - выгодно.
- 0.9-9 евро в месяц на https://www.amazon.de/amazonprime
Ну тут тоже из-за доставки быстрый/бесплатной/без обязательного минимума. Цена плавающая - купоны, скидки, спецпредложения.
- $15 в месяц https://codeium.com/
топовый ИИ IDE. Но я их часто меняю, был copilot+vscode, потом Cursor, теперь этот. Но в целом они вроде все в среднем так стоят.
Может через полгода переключусь на что-то другое.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥1
- 20.000 рублей в месяц каждому родителю, итого 80.000 рублей в месяц(+тесть и тёща).
Помощь пенсионерам. Сперва нас на ноги ставили и очень сильно помогали, теперь пора и нам.
Начинал с 10.000, как понял, что тяну такую помощь, постепенно поднял до 15к и в 2025 году уже могу тянуть такую невероятно огромную сумму. Сумма невероятно большая, но моя любовь больше.

Все траты указаны с учётом всех скидок, купонов, непрерывного продления(jetbtains) и низких региональных цен по карте оплаты.
Траты на коммуналку, еду, такси, игры в стим, разовые походы в бассейн, футболки, общественный транспорт и прочее не считаю, так как это у всех разное и часть трат нерегулярные.

P.S. на фотке - я
😁53
Иногда я сам горю от своей тупости детских ошибок.

Ну как вообще так можно было сделать?
Пилил дашборд графаны, в котором помимо привычных данных(CPU usage, memory, workers, queries etc) отображается ещё и данные напрямую из trino.
Прям внутри графаны SQL запрос.
SELECT
date_format(started, '%H:%i:%s') as time,
date_diff('second', started, last_heartbeat) as duration_seconds,
state,
query
FROM system.runtime.queries
WHERE (state = 'RUNNING' AND date_diff('second', started, last_heartbeat) > 10)
OR (state = 'FINISHED' AND date_diff('second', started, last_heartbeat) > 10)
ORDER BY duration_seconds DESC
LIMIT 15

И он строит таблицу с временем, длительности запросов, статусом и квери(обрезано на скрине).
Таким образом можно отслеживать подвисшие запросы или неоптимизированные (например join 1000*1000*1000 от мастеров fatality-гениалити).
Потом это трансформирую графаной и вывожу.
Получил алерт - побежал в графану - увидел детальную инфу.

Как можно допускать такие ошибки?
Что такое 1.83 минуты? Что такое 2.95 минут?
Как это интерпретировать?
Стыдоба, инженер-олень🤦‍♂️.

#trino #grafana
😁2
#бытовое #всратость

История в нескольких частях.

Полосочки.
Сломался у меня телефон. Сперва я думал это я сел на экран, но оказалось это проблема всех гугл пикселей выше 8 серии.
Полоска на экране, цвета зелёные, чёрные, глаза печальные.
Аригато, что за 800+ евро такие охрененные девайсы пилят.
Какое-то время то работало, то нет, а потом и вовсе умерло.
Как только почти умерло я тут же во все(!) сайты/утилиты заново сделал логаут, логин с MFA(MS authenticator) и радостно побежал в сервис. Ну типа если во время ремонта что-то случится, а у меня новые сессии.

Сервисмод.
В сервисе смотрели на меня как на умалишённого деда, в запале желающего и телефон починить, но и не отдавать врагам свои данные банк клиентов, пять десятков мультифакторных авторизаций и драгоценную переписку с братом и общие мемы про его лысину.
Оказалось всё придумали до нас, есть такая штука, во всяком случае в андроиде - сервис мод.
Я из деревни, мне можно было такое не знать.
Включаешь режим, вводишь пин-код, телефон перезагружается - в нем только дефолт приложения и доступа к моим данным типа нет. Возврат аналогично через пин и рестарт.
В сервисе у меня забрали телефон, я вышел из здания и остался без рук.
Как клоун с Bluetooth наушниками на голове, которые никуда не подключены уже🤣,

Инвалид.
Ровно тогда, когда я сдал телефон я вспомнил, что мне надо порешать несколько дел в городе.
Привыкший в расписанию общественного транспорта в приложении, вызову такси и картам с расположениями ключевых мест я оказался словно инвалид посреди города.
Меня спас дед, который проснулся во мне.
Нет приложения такси? Ну так куча вариантов:
- иди на остановку таксистов и там садись в свободное за наличные
- поймай на руку
- иди к ближайшему отелю, к ним часто такси подъезжает и 99%, что после высадки он будет свободным
Нет расписания автобусов?
- у нас карты на остановке отменили? Со схемами и маршрутами.
- расписание на останове тоже отменили?
Там хоть и написяли маркером поганая молодёжь, но что-то да можно разобрать.

Штаны.
Конечно же я наложил в штаны со всем этим планом.
Ровно через 0.0001ms после того, как я вернулся домой, у меня слетели 95% авторизаций во все рабочие порталы: GitLab, office 365(в том числе и личный), Teams(ну да и хер с ним на самом деле), куберы, ажур, конфлюенс с джирой и вообще я мог только в слаке трындеть. В общем не продуктивный вышел день.
Впрочем непродуктивный вышел день и последующий, ведь вовремя телефоны чинят только в сказках и Москве, ровно к 10 утра я его не смог забрать из сервиса.

Детокс.
Всё это время, без телефона, я ощущал себя как будто в новом непривычном мире.
Удача обошла меня стороной, я даже в телеграм зайти не смог, провайдер сменил IP и даже почта и телеграм захотели получить аппрув, а его я предоставить не мог.
Даааа, угадайте что со стимом и играми. Даааа, всё так.
Чем же я занимался? - ходил нюхал воздух, трогал траву, смотрел в стену, гладил кота.
Благо дома amazon kindle меня не подвёл и я прекрасно перечитал за полтора вечера весь восхитительный цикл Пехова - Страж.


Увы, без мульти факторной авторизации мы подвергаем себя риску, но и без своевременных аппрувов я буквально остался без рук, ни для личных задач, ни для работы.
Мы слишком сильно привязаны к нашим смартфонам и это не только тиктоки, да инстаграммы.
Без техники мы возвращаемся во времена мезозоя.
Во мне хоть и проснулось брутальное воспитание союза, в котором нас учили ориентироваться на местности, читать карты и стоять в очереди за сахаром разбираться с проблемами самостоятельно, но я ни в коем случае не желаю таких навыков всему современному поколению.
Мир крутой, зачем всё усложнять.
Если телефон с миллиардом приложений помогает жить, то почему нет.
Главное при этом не выходите из дома, а иначе заблудитесь 🤣
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74😁3🔥1
Алертменеджер.
Больше применимо к стеку VM (привет чату @VictoriaMetrics_ru1 ✌🏼)

Полезные ссылки, которыми часто пользуюсь.
1) https://prometheus.io/webtools/alerting/routing-tree-editor/
Проверка алёртов и рутов.
- вставил конфигурацию Алертменеджер (!!!БЕЗ КРЕДОВ РЕСИВЕРОВ!!!)
- он отрисовал дерево всех ресиверов
- вставил интересующий тебя лейбл для рутов с матч/матчерс
- понял в какой/какие ресиверы пойдет (или нет) твой Алерт по роуту
То есть прям визуально можно понять туда или не туда пойдёт алёрт.
Актуально при большом количестве ресиверов, при первом ресивере null и при большом количестве routes.
2) https://samber.github.io/awesome-prometheus-alerts/rules
Огромный список алёртов по многим областям - базы данных, кубернетис, ингрессы и так далее.
Актуально для тех, кто не знает с чего начать.
3) https://github.com/monitoring-mixins/website/tree/master/assets
Тоже самое, что и второе, но примеров заметно больше.
4) https://github.com/prometheus/alertmanager
В самом алёртменеджере есть утилита amtool, в CICD можно запилить валидацию конфигурации.
Актуально не для всех флоу. Скорее всего не будет работать для терраформа с хелмом и гитопса.
5) https://promlabs.com/promql-cheat-sheet/
Куча трюков и подсказок. Обычный cheat sheet.
Часто отсюда ворую, когда идеи заканчиваются.
6) https://github.com/prymitive/karma
Для тех, кого бесит ущербный интерфейс алёртменеджера родом из 2001 года с птушным дизайном клоунов дизайнеров.
Я на самом деле поел два не критикал бага, прям на 100% не рекомендовал бы, но визуально он, конечно же, красив, чертяга.
7) https://chaostoolkit.org/
Хаос-фронтенд-манки тулза
Напрямую не связан с алертменеджером, но я при его помощи тестирую все алёрты, разламывая к херам кластера тестовые.

Ок, ссылками разобрались.

Типичные траблшутинги.
1) "а чего у меня сообщение не уходит в телеграм с алёртом"
- есть ли из кластера доступ до апи телеги? (от ноды до интернетов телеги)
kubectl run telegram-test --image=curlimages/curl --restart=Never --rm -i --tty -- \
curl --max-time 10 --connect-timeout 10 https://api.telegram.org

- правильный ли токен? (можно и локально)
нечто типа
curl -s "https://api.telegram.org/bot<ваш_токен>/getMe"

- создаётся ли сам алёрт на алёрт менеджере (локально, попросите ИИ сгенерить от вашего алерта вам джейсон для вас по аналогии). У алертменеджера 2 версии апи, смотрите какая версия у вас и под неё спрашивайте нейронку запрос.
curl -X POST https://*********/api/v1/alerts \
-H "Content-Type: application/json" \
-d '[
{
"labels": {
...
},
"annotations": {
...
},
"startsAt": "'"$(date -u +"%Y-%m-%dT%H:%M:%SZ")"'",
"endsAt": "'"$(date -u -d "+3 minutes" +"%Y-%m-%dT%H:%M:%SZ")"'"
}
]'


- если всё выше проверено, всё ок, то смотреть нет ли у тебя вшивого оператора алёртменеджера?
Если есть, то уходи от идеи нескольких и пихай всё в один.
Он при мерже какую-то ересь делает и оно перестаёт работать.
На момент марта 2025 года я строго НЕ рекомендую использовать несколько их.
Только один. пилите всё в одном.
Чекаем, если больше 2, то у меня плохие новости(на момент написания материала)
kubectl get VMAlertmanagerConfig -A |wc -l

- проверяем руты - в тот ли ресивер(ы) идёт ваш алёрт?
Первая ссылка с деревом, вставляем конфиг, лейблы и чекаем.
- чего в логах алёртменеджера?
- ну и сам конфиг ресивера хоть верный?
https://prometheus.io/docs/alerting/latest/configuration/#telegram_config

#alertmanager
5🔥4👍1
2) "как дебажить vmrule?"
Например чтобы отправить собственную метрику для проверки каких-то кондишнов
- коннектимся к vmagent
>k port-forward svc/vmagent-tratata-prod-aks-us-1 8429

- отправляем придуманное событие в vmagent
curl -X POST http://localhost:8429/api/v1/import/prometheus \
-d 'kube_pod_status_phase{phase="Pending",exported_namespace="test-namespace",pod="logical-backup-pgsql-test-pod",cluster="test-prod-cluster"} 1'

- проверяем что этот алёрт ок в виктории метрикс, например нам важно какой северити у него стал/есть (этот кусок прям в Prometheus/VM/Grafana explore вводить)
ALERTS{alertname="KubernetesPodNotHealthy", pod="logical-backup-pgsql-test-pod"}
- не забываем потушить алёрт, иначе он будет висеть вечно
curl -X POST http://localhost:8429/api/v1/import/prometheus \
-d 'kube_pod_status_phase{phase="Pending",exported_namespace="test-namespace",pod="logical-backup-pgsql-test-pod",cluster="test-prod-cluster"} 0'

Удаление нужно в том случае, когда вы не хотите, чтобы это попало в алёртменеджер. Вам же просто протестировать vmrules.
vmalert происходит ДО попадания в alertmanager.

3) "как проверить рулесы алертменеджера"
отправить курл запрос типа
curl -X POST https://alertmanager.domain.com/api/v1/alerts \
-H "Content-Type: application/json" \
-d '[
{
"labels": {
"alertname": "KubernetesPodNotHealthy",
"cluster": "test-prod-cluster",
"exported_namespace": "test-namespace",
"pod": "logical-backup-pgsql-test-pod",
"phase": "Pending",
"emoji": "🔥",
"incident_type": "outage"
},
"annotations": {
"summary": "POD'"'"'s state is `Pending` for `test-prod-cluster`/`test-namespace`/`logical-backup-pgsql-test-pod`",
"description": "Pod test-namespace/logical-backup-pgsql-test-pod has been in a non-running state for longer than 15 minutes.\n VALUE = 1\n LABELS = map[cluster:test-prod-cluster exported_namespace:test-namespace phase:Pending pod:logical-backup-pgsql-test-pod]"
},
"startsAt": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'",
"endsAt": "'$(date -u -d "+3 minutes" +"%Y-%m-%dT%H:%M:%SZ")'"
}
]'

#alertmanager
4
Bottlerocket, storage.

Ну а куда без боттлрокета.
Допустим вы решили перейти на боттлрокет после моих постов - https://xn--r1a.website/makebreakreflect/35
Сразу споткнувшись про пустой дефолтный конфиг кублета читаете и тут
https://xn--r1a.website/makebreakreflect/38

Готово.
У вас и кластер AWS EKS и нод группа(ы) и лаунчтемплейт.
Всё работает, всё круто, но спустя время вы замечаете, что у вас участились алёрты DiskPressure.
Так же в ивентах у вас нечто типа
The node had condition: [DiskPressure].
The node was low on resource: ephemeral-storage. Threshold quantity: 4281126156, available: 3438556Ki

"Какого х*ра рожна" думаете вы, ведь у меня диск как был 200 гигабайт, так и остался.
Смотрите свой код, видите там нечто типа
resource "aws_launch_template" "node-launch-template" {
...
block_device_mappings {
device_name = "/dev/xvda"
ebs {
volume_size = 200
volume_type = "gp3"
}
}
...

"ну да, двести гигов" говорите вы вслух самому себе и идёте проверять терраформ/террагрант план.
Всё ок. Никаких
  lifecycle {
ignore_changes

Лезете в кубер, смотрите а чо там рили.
kubectl get nodes -o yaml | grep -i -A6 ephemeral-storage

Внезапно там ну вообще ни 200 гигов, там 20.
Начинаете перепроверять код, лаунчемплейт, ласт вершн и issue github.
А нет ничего.
У вас желаемое 200 гигов, а реально видно 20.


И тут подстава, откуда вы не ждали.
У bottlerocket не совсем типичный подход к монтированию томов.

Чтобы ноде под поды выделить больше места дефолта с 20 гигами, вам надо выдать отдельный маунт на побольше.
resource "aws_launch_template" "node-launch-template" {
...
# !!! вот тут много не надо, это для самой ноды, операционка, можно хоть 10
block_device_mappings {
device_name = "/dev/xvda"
ebs {
volume_size = 20
volume_type = "gp3"
}
}
# !!! вот это добавляем, для POD-ов
block_device_mappings {
device_name = "/dev/xvdb"
ebs {
volume_size = 200
volume_type = "gp3"
}
}

Терраформ план, терраформ апплай, проверяем
kubectl get nodes -o yaml | grep -i -A6 ephemeral-storage

Отлично, теперь под эфемерку у нас 200 гигов, а не дефолтные 20(или 30, я не помню если честно) гигабайт.
Разуемся, алёрты пропадают, эфемерки всем хватает, кластер снова сладкий как яблочки с огорода у бабушки.

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

#aws #eks #bottlerocket
👍6
#начинающим #docker

Контекст(context).

Мне понадобилось некоторое время на этапе моего обучения несколько лет назад, чтобы поесть всякого, чтобы осознать существование контекста.
Основной пример буду пояснять на примере Docker.
Контекст сборки - это архив (по сути tar-файл), который Docker создаёт из указанной директории и отправляет демону для обработки.
Например, когда вы пишете docker build -t image ., Docker упаковывает все файлы из текущей директории (.) и передаёт их демону😈.

Допустим мы собираем имадж так:
docker build -t image .

Вот точка это и есть контекст. Точка это наша директория нашего проекта.

Что же нам надо знать о контексте?
- нельзя выйти за пределы контекста
Например у нас есть такая структура
/home/user/projects/
├── my_project/
│ ├── Dockerfile
│ ├── app.py
└── shared/
└── library.so

Находясь в директории my_project мы не сможем собрать имадж типа такого
FROM ubuntu:20.04
COPY ../shared/library.so /usr/lib/

Так как shared находится выше по иерархии и не входит в контекст текущей директории "."

- докер(и другие известные мне утилиты) сканирует все файлы контекста( то есть в текущей директории)
То есть условно если у вас есть 50000 файлов по мегабайту или один файл 50 гигабайт в гит репозитории в контексте, то это замедлит сборку
Даже если мы НЕ используем COPY . . , докер всё равно сканирует эти файлы(точнее Docker демон сканирует и упаковывает файлы для передачи) и мы собираем дольше по времени.
Не думаю, что этот случай для всех, с этим можно столкнутся при не совсем корректных воркфлоу и при монолит приложениях.
Например у вас npm build идёт ВНЕ сборки докера, а потом вы копируете файлы(я видел и такое).
Проблема с переполнением контекста решается через .dockerignore файл.
В этом файле мы указываем те директории/файлы, которые НЕ должны попасть в контекст, по аналогии с .gitignore.

- контекст в multi-stage билдах
Контекст доступен для всех этапов сборки, однако при использовании COPY --from=build копирование идет из предыдущего этапа, а не из исходного контекста.

Концепция контекста применима не только к Docker, но и к другим инструментам, например, к Helm - менеджеру пакетов для кубера.
Некоторые инженеры сталкиваются с ситуацией, когда во время деплоя секрет Helm не удаётся сохранить в ETCD, потому что его размер превышает ограничение в 1 МБ(ограничение ETCD).
Чаще всего это происходит из-за того, что в директорию случайно попадают ненужные файлы: логи, бинарники, архивы или другие "левые" данные. Да, прям внутри кубера в секрете хелма по релизу помимо манифестов yaml валяются бинари/файлы, которые мы по незнанию туда засунули.
Чтобы избежать таких проблем, стоит использовать файл .helmignore, который позволяет исключить лишние файлы из контекста чарта - примерно так же, как .dockerignore помогает в Docker.

Контекст - это не просто техническая деталь, а инструмент, который нужно понимать и оптимизировать.
Используйте .dockerignore/.helmignore и следите за содержимым директорий, чтобы сборка была быстрой и эффективной.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥7💯2
#aws #eks #sqs #CostOptimization
Материал уровня middle.

Снова про экономию.

У нас есть AWS SQS.
В него прилетает миллион вебхуков с полезным и важным payload.
Бывают пики, бывают нет.
У нас есть AWS EKS и приложение в POD-e, который вычитывает SQS, процессит и всё ок.
Нам надо настроить масштабирование не за счёт CPU/memory usage, а за счёт количества сообщений.
В этом нам помогает KEDA. Опустим этапы установки/настройки/прав и авторизации.
У нас есть готовый манифест scaledobject.
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
cooldownPeriod: 300
maxReplicaCount: 50
minReplicaCount: 2
pollingInterval: 30
scaleTargetRef:
name: application
triggers:
- authenticationRef:
name: keda-aws-credentials
metadata:
awsRegion: us-east-1
identityOwner: operator
queueLength: "500"
queueURL: https://sqs.us-east-1.amazonaws.com/123456789/sqsname
type: aws-sqs-queue

Всё работает, всё скейлится, всё ок.
В HPA некрасиво выглядят цифры, хочется видеть точное количество мессаджем. Добавляем metricType
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
...
metricType: Value

И теперь в kubectl get hpa blablabla видим точное количество мессаджей в TARGETS(а не системы счисления инопланетян).
Этого нам мало, нужна точная подстройка.
Читаем дальше доку, у нас есть адвансед настройки.
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
advanced:
horizontalPodAutoscalerConfig:
behavior:
scaleDown:
policies:
- periodSeconds: 15
type: Pods
value: 1
stabilizationWindowSeconds: 300
scaleUp:
policies:
- periodSeconds: 15
type: Pods
value: 1
selectPolicy: Max
stabilizationWindowSeconds: 60
... (остальное так же)

Теперь у нас всё динамически скейлится, прописаны все триггеры, трешхолды.
Всё отлично и бизнес ликует(не вру, прям ликует, сильно помогло).

Однако меня, как рьяного и верного пса девопс церкви, напрягает, что в период высокой нагрузки всё упирается в максимум реплик. Да, можно поставить не 50, а 100, но я думаю, что настройка неверная.
Углубляемся дальше в доку(вру, я ничо не понял и просто спросил ребят-гуру-AWS-технологий в телеге) и вспоминаем про визибл/анвизибл настройки у sqs.
https://keda.sh/docs/2.14/scalers/aws-sqs/
https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html

Окончательно пилим манифест.
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
...
spec:
advanced:
...(тут тоже самое)
metadata:
...
scaleOnInFlight: "false" << - - вот это вот важное нам
...


Отлично. Теперь самая точная и потрясающая настройка.
🔥5
#aws #eks #sqs #CostOptimization

scaleOnInFlight
- Indication of whether or not to include in-flight messages when calculating the number of SQS messages. (default: true, Optional)

Благодаря точной настройке мы неслабо экономим:
- во время нагрузки мы не скейлим так много реплик
- нет большого лишнего скейла реплик - нет и скейла нод кластера AWS EKS
- нет скейла нод - платим серьёзно меньше

Всего один параметр и в разы снижаем нагрузку и косты.

Прежде чем делать подобное, уточните у девелоперов и бизнеса - подойдёт ли это вам и продукту.
Не все процессинги можно переключить только на инфлайт режим.

Полный пример манифеста(код в телеге неудобно читать).
https://gist.github.com/kruchkov-alexandr/e6328137107e49c6a5e7c05c40851680
👍8
#aws #opensearch
Как положить кластер опенсёрча при помощи AI помошников и фич IDE

"Алекс, у нас какая-то штука, логи в OpenSearch недоступны. да просто белая страница крутится и всё. Да, мы помним, что ты давно говорил перейти на локи, но пока нет бюджета. Глянь, пожалуйста, что там может быть, да, прайс почасовой такой же."


Да блин, я так себе мастер с опенсёрче, на этом проекте он просто дефолтный.
Файлбит собирает с кубера с дефолт конфигом и пушит в опенсёрч.
У опенсёрча 2 инстанса в кластере на продакшне.

Ок, деньги не пахнут, а за спасибо супруге новую сумку не купить🤣
Заходим в веб - да, тормозит, белая страница по дискавери.
Но статус кластер - грин, всё ок по мнению амазона😂.
Смотрим в дашборды графаны - видим 100% нагрузка CPU и она началась 15 числа (ага, можно поклянчить денег на новые алёрты ЦПУ юсадж опенсёрча).

Пробуем делать рестарт нод/дашбордов.
Получаем неожиданную ошибку
Operation disabled for domains with less than three nodes.

Ну спасибо, амазон, ну молодцы. Лллллллогика железная.

Заходим в dev tools и смотрим "а чо там".
GET _tasks?detailed=true

Ого, все запросы в среднем по 180 секунд висят.
Видим что всё упирается в опендистро ISM
Пробуем не глядя (а что вы мне сделаете?)
POST .opendistro-ism-config/_forcemerge?max_num_segments=1

{
"_shards" : {
"total" : 10,
"successful" : 10,
"failed" : 0
}
}

Ждём 10 минут и.. и лучше не стало.
Запуливаем снова что там с процессами - там всё ещё всё висит.
Ок. Логи то нужны девелоперам.
Спрашиваем лида проекта "могу ли всё хард ресетнуть?". Ничего не понимая он с лицом осла из Шрека кивает и мы пуляем
PUT .opendistro-ism-config-optimized
{
"settings": {
"index.number_of_shards": 1,
"index.number_of_replicas": 1
}
}
POST _reindex
{
"source": {"index": ".opendistro-ism-config"},
"dest": {"index": ".opendistro-ism-config-optimized"}
}

Ждём 10 минут и ничего.
Ладно.
Ищем мануалы типа
https://repost.aws/knowledge-center/opensearch-troubleshoot-high-cpu
Проходим всё, и вот эта шабола показывает нам всякое
GET _tasks?actions=*search&detailed

по 50 и 52 часов пользовательские (игнорируем системные).
Ну а какие варианты - Kill 'Em All
POST _tasks/bDFfq7RrRyGGnzfHPBy14g:794713665/_cancel
POST _tasks/bDFfq7RrRyGGnzfHPBy14g:817036855/_cancel

Ии.. и ничего не происходит.
Опенсёрч ставит в очередь на удаление и всё.
Ждём ещё полчаса и нет результата.
Пробуем точечно и родительские и дочерние процессы кильнуть - ноль на массу.

Ну то есть по моему личному мнению по анализу запросов, дебагу и прочему я понимаю, что "подвисли" запросы по 50+ часов с 15 числа.
Убить их не удаётся. Нет, не так описал: то есть их убивает, при повторной попытке убить он пишет "already deleted" но всё равно тратит память и такты ЦПУ. Очередь на удаление на часы.

Пишем тикет в саппорт "дяденьки спасити памагити", ставим system impaired.

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

Оставил его всем на сладенькое.
https://gist.githubusercontent.com/kruchkov-alexandr/3d28e37918dbf6c844c020b286a062df/raw/28a6ac4b2a5b6584c1f77ed51d2d9b3189f2344c/parasha.json
Да, я вот так же это читал и реагировал 🤣🤣🤣🤣🤣
Слегка заорал чайкой от multi_match на 200+ вэльюсов, я отправляю коллегам с текстом are you okhueli there?!!?
Получаю ответ
- "used Cursor AI and multi cursor to build it up lol"
😂😂😂
и взвизгнул гиеной на весь город, это в мемы.
Ну то есть девелопер выполнил буквально такой запрос:
https://gist.github.com/kruchkov-alexandr/bb6b2bb2ce46828e26b9c5feb6af878d
Собственно этот запроси был причиной проблемы.

Спустя 45-60 минут этот цирк заканчивается, все квери удалены, нагрузка на CPU снижается, интерфейс оживает для девелоперов.
Трекаем время (Не, ну я же ждал всё это время, да? Ждал же? Трекаем!🤣) и закрываем таску.

Закрываем таску в саппорт амазона, на 3 часа так и не ответили ничего, даже ассайна не было с систем импайрд, ну ладно.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9👍3🔥2
#aws #aurora #terraform #finops
Материал уровня senior

Мы умеем определять тип инстанса - по нагрузке на CPU/Memory и другим факторам.
Но насколько эффективно мы выбрали Cluster storage configuration Авроры вашего проекта?
Эффективно ли это спустя год или два?
А никто не знает, давайте разбираться.

- сперва пилим Dashboard к нашему существующему кластеру
https://gist.github.com/kruchkov-alexandr/d9335d7927e58d06557b994dc9f194de
- применяем, видим панель в CloudWatch
Сверху у нас панель чтения/записи хранилища, снизу размер базы данных (+снепшоты?).
Разделение нужно из-за разницы масштабов и удобства экспорта.
- выбираем период три месяца и кликаем на трех точках у обоих панелей и выбираем Download as .csv и качаем оба файла
- заходим в cost explorer и экспортируем дату за три месяца по кластеру
- заходим в вашу любимую AI(я спрашивал у клаудии, перплексити и грок3, все платные) и пилим промт нечто типа(можете писать свой, если мой вам кажется тупым):
"Help me decide if we should switch to Amazon Aurora I/O-Optimized. Use the attached billing screenshot/csv, three-month IOPS data from the CSV, and the IOPS/storage graphs to analyze our costs. Calculate our current I/O expenses, compare them to I/O-Optimized costs and check if our I/O costs exceed AWS’s 25% threshold for switching. Look at IOPS and storage trends, then recommend whether to switch, including specific cost figures. I’ve attached all files (billing, CSV, graphs).
based on this article
https://aws.amazon.com/blogs/database/estimate-cost-savings-for-the-amazon-aurora-i-o-optimized-feature-using-amazon-cloudwatch/"

- ждём ответа и все 4 нейронки мне выдали на 95% одинаковый подробнейший расчёт ответ. Вкратце "Переходить пока рано".
- пишем менеджеру/боссу
I've analyzed our infrastructure costs over the last three months billing and IOPS data, to see if switching to Amazon Aurora I/O-Optimized makes sense. Right now, it's not cost-effective. Our I/O costs an average of $******* monthly (************ I/Os at $**** per million). Moving to I/O-Optimized would increase instance costs by ***%, from $******* to $******* - a $******* jump, which is $415.21 more than our current I/O expenses.
Our IOPS trends show peaks up to *** but no major growth, averaging ~** Write and ~**** Read IOPS hourly in February. Storage usage is growing at *** GB/month, but that doesn't impact the I/O-Optimized cost comparison. AWS suggests I/O-Optimized when I/O costs exceed **% of total Aurora spend, but ours ($******) are only **% of the $******* total, so we're below that threshold.
I recommend sticking with our standard configuration for now. We should keep monitoring I/O activity -if it exceeds **** I/Os monthly or I/O costs reach **% of our Aurora spend, we can revisit I/O-Optimized.

Прикладываем все файлы,скрины,расчёты.
- закрываем таску и трекаем время

Всё вышеописанное заняло у меня минут 15, а вот подготовительные работы(чтение про фичу, особенности, лимиты, как считать, написание борды, особенности биллинга и тп) почти половину дня.
* Если не верите ИИ, можете пересчитать вручную🐒

Дополнительные полезные ссылки(а вдруг вы мне не верите):
- анонс фичи
https://aws.amazon.com/about-aws/whats-new/2023/05/amazon-aurora-i-o-optimized/
- обзор менеджер уровня
https://aws.amazon.com/awstv/watch/b9bfc040ac5/
- пример расчётов (там руками считают, без ИИ)
https://aws.amazon.com/blogs/database/estimate-cost-savings-for-the-amazon-aurora-i-o-optimized-feature-using-amazon-cloudwatch/
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😁1