#devops #github
GitHub объявил, что с 24 апреля 2026 года данные взаимодействий Copilot (prompts, ответы, сниппеты и контекст) начинают использоваться для обучения моделей по умолчанию, если пользователь явно не отключит это в настройках для тарифов Copilot Free/Pro/Pro+.
https://github.blog/news-insights/company-news/updates-to-github-copilot-interaction-data-usage-policy/
Как и водится в маленьких инди компаниях, даже сроки они не стали соблюдать, залепили раньше, нарушая сроки объявленого дедлайна. Сейчас 7 апреля и у меня уже стоит эта галочка.
Возможно уже и данные коллектят, кто знает, верить уже тяжело.
Кто-то может, конечно, возразить, что "галочка включена != сбор данных", но я не очень согласен с этим.
Галочка стоит, текст честно написан, значит так оно и есть.
Кто еще боится в век AI утилит лишиться приватности или заставляют условия работы в компаниях, спешите снять галочку:
- Идите по ссылке на свой профиль https://github.com/settings/copilot/features
-
GitHub объявил, что с 24 апреля 2026 года данные взаимодействий Copilot (prompts, ответы, сниппеты и контекст) начинают использоваться для обучения моделей по умолчанию, если пользователь явно не отключит это в настройках для тарифов Copilot Free/Pro/Pro+.
https://github.blog/news-insights/company-news/updates-to-github-copilot-interaction-data-usage-policy/
Как и водится в маленьких инди компаниях, даже сроки они не стали соблюдать, залепили раньше, нарушая сроки объявленого дедлайна. Сейчас 7 апреля и у меня уже стоит эта галочка.
Возможно уже и данные коллектят, кто знает, верить уже тяжело.
Кто-то может, конечно, возразить, что "галочка включена != сбор данных", но я не очень согласен с этим.
Галочка стоит, текст честно написан, значит так оно и есть.
Allow GitHub to collect and use my Inputs, Outputs, and associated context to train and improve AI models.
Кто еще боится в век AI утилит лишиться приватности или заставляют условия работы в компаниях, спешите снять галочку:
- Идите по ссылке на свой профиль https://github.com/settings/copilot/features
-
Settings -> Copilot -> Features -> Privacy -> Allow GitHub to use my data for AI model training,❤9
#opensource #alertmanager #devops
Новости opensource мира.
У продукта Alertmanager есть неприятная недоработка.
Все уведомления в Slack он отправляет двумя сообщениями:
- проблема (firing)🔴
- проблема решена (resolved)🟢
Наверняка видели.
В мире шумных уведомлений даже этого много.
По сути 100 алертов порождают 200 сообщений (после их решения), что не очень удобно.
API самого Slack позволяет изменять сообщения, но алертменеджер не умел в это.
Это происходит прежде всего потому, что алертменеджер не хранит стейт алертов, чтобы "запоминать" куда слать обновление по алерту.
При этом аналоги умеют менять сообщение (меняя красный firing на зелёный resolved):
- grafana oncall / IRM
- pagerduty
С появлением GenAI инструментов я захотел исправить эту досадную оплошность, сделал форк алертменеджера, локально всё потестировал и примерно с полгода гонял у себя - работает идеально. (Март 2025)
Затем осмелился и запилил пулл реквест:
https://github.com/prometheus/alertmanager/pull/4682 (Ноябрь 2025)
Не скрою, пользовался GenAI, но основная идея была моя.
Я на 90% понимаю изменённый код и поведение.
После вялого обсуждения другие, более активные участники, реализовали это в два пулл реквеста:
- https://github.com/prometheus/alertmanager/pull/4899 (Январь 2026)
- https://github.com/prometheus/alertmanager/pull/5007 (Февраль 2026)
Само собой после этого мой PR не имеет смысла, я закрыл его. (Февраль 2026)
Вчера, 8 апреля 2026 выпущен новый релиз v0.32.0.
https://github.com/prometheus/alertmanager/releases/tag/v0.32.0
Теперь алертменеджер умеет хранить стейт алертов для слака и менять сообщения - что очень удобно. 🎉
Всех, кто использует алертменеджер, поздравляю.
Можете обновлять и радоваться меньшему количеству сообщений и меньшему шуму алертов.
---
Но вам же интересно глянуть, как это работает перед обновлением прода?
Нужен Bot Token Slack (
Важно: работает только с токеном, не с webhook URL.
Положить конфиг в
Запустить alertmanager v0.32.0 через Docker:
Стрельнуть алертом:
Подождать ~10–15 секунд - в Slack появится сообщение с 🔴.
Зарезолвить:
Подождать ~10 секунд - то же самое сообщение изменится на 🟢.
Нового сообщения не будет!
Поздравляю всех с таким мелким, но приятным обновлением.
Новости opensource мира.
У продукта Alertmanager есть неприятная недоработка.
Все уведомления в Slack он отправляет двумя сообщениями:
- проблема (firing)🔴
- проблема решена (resolved)🟢
Наверняка видели.
В мире шумных уведомлений даже этого много.
По сути 100 алертов порождают 200 сообщений (после их решения), что не очень удобно.
API самого Slack позволяет изменять сообщения, но алертменеджер не умел в это.
Это происходит прежде всего потому, что алертменеджер не хранит стейт алертов, чтобы "запоминать" куда слать обновление по алерту.
При этом аналоги умеют менять сообщение (меняя красный firing на зелёный resolved):
- grafana oncall / IRM
- pagerduty
С появлением GenAI инструментов я захотел исправить эту досадную оплошность, сделал форк алертменеджера, локально всё потестировал и примерно с полгода гонял у себя - работает идеально. (Март 2025)
Затем осмелился и запилил пулл реквест:
https://github.com/prometheus/alertmanager/pull/4682 (Ноябрь 2025)
Не скрою, пользовался GenAI, но основная идея была моя.
Я на 90% понимаю изменённый код и поведение.
После вялого обсуждения другие, более активные участники, реализовали это в два пулл реквеста:
- https://github.com/prometheus/alertmanager/pull/4899 (Январь 2026)
- https://github.com/prometheus/alertmanager/pull/5007 (Февраль 2026)
Само собой после этого мой PR не имеет смысла, я закрыл его. (Февраль 2026)
Вчера, 8 апреля 2026 выпущен новый релиз v0.32.0.
https://github.com/prometheus/alertmanager/releases/tag/v0.32.0
Теперь алертменеджер умеет хранить стейт алертов для слака и менять сообщения - что очень удобно. 🎉
Всех, кто использует алертменеджер, поздравляю.
Можете обновлять и радоваться меньшему количеству сообщений и меньшему шуму алертов.
---
Но вам же интересно глянуть, как это работает перед обновлением прода?
Нужен Bot Token Slack (
xoxb-...) со скоупами chat:write и chat:update.Важно: работает только с токеном, не с webhook URL.
Положить конфиг в
/tmp/am-test/alertmanager.ymlglobal:
resolve_timeout: 1m
route:
receiver: slack
group_by: [alertname]
group_wait: 10s
group_interval: 10s
repeat_interval: 12h
receivers:
- name: slack
slack_configs:
- send_resolved: true
api_url: https://slack.com/api/chat.postMessage
http_config:
authorization:
credentials: xoxb-YOUR-BOT-TOKEN
channel: '#your-channel'
update_message: true # <-- вот эта опция
title: '{{ .GroupLabels.alertname }} - {{ .Status | toUpper }}'
text: |
{{ if eq .Status "firing" }}🔥 *{{ .Alerts.Firing | len }} alert(s) FIRING*{{ else }}✅ *All alerts RESOLVED*{{ end }}
{{ range .Alerts }}• {{ if .Annotations.summary }}{{ .Annotations.summary }}{{ else }}{{ .Labels.alertname }}{{ end }}
{{ end }}
color: '{{ if eq .Status "firing" }}danger{{ else }}good{{ end }}'
Запустить alertmanager v0.32.0 через Docker:
mkdir -p /tmp/am-test
docker run -d \
--name am-test \
-p 9093:9093 \
-v /tmp/am-test/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
-v /tmp/am-test/data:/alertmanager \
prom/alertmanager:v0.32.0
Стрельнуть алертом:
curl -X POST http://localhost:9093/api/v2/alerts \
-H 'Content-Type: application/json' \
-d '[{
"labels": {"alertname": "TestAlert", "severity": "warning"},
"annotations": {"summary": "This is a test alert - will resolve in the same message"}
}]'
Подождать ~10–15 секунд - в Slack появится сообщение с 🔴.
Зарезолвить:
curl -X POST http://localhost:9093/api/v2/alerts \
-H 'Content-Type: application/json' \
-d '[{
"labels": {"alertname": "TestAlert", "severity": "warning"},
"annotations": {"summary": "This is a test alert - will resolve in the same message"},
"endsAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
}]'
Подождать ~10 секунд - то же самое сообщение изменится на 🟢.
Нового сообщения не будет!
Поздравляю всех с таким мелким, но приятным обновлением.
🔥46❤2
#devops #ai #mcp #skills #troubleshooting
MCP, скиллы, ИИ, *уи.
Последние месяцы отказываюсь от MCP серверов.
Прям вот по минимуму оставляю и только от безысходности.
Slack, Linear, Jira, Grafana, VM (Victoria metrics), VL (victoria logs) и так далее.
Им замены мало, без них сложно.
Все MCP для Kubernetes, GitHub, GitLab - все это очень плохо работает в боевых условиях.
Распишу основные минусы из моего опыта:
- трата токенов
Вопреки описанию "да просто мсп сервер ничего не жрет в фоне", это лукавство.
Жрет токены и это видно по логу и трате их по обычным запросам.
Постоянно включать/выключать их я пробовал, но это банально неудобно даже если повесить скиллы/алиасы на это.
- они навайбкожены
Давайте быть честными - больше половины этих серверов это вайбкод вайбкода и работает он ровно так же.
Никаких гарантий, что ИИ агент идет четко по REST API/gRPC, из моей практики они просто хаотично по всем ендпойнтам лезут в надежде найти ответ на вопрос/задачу.
- функционал обрезан. Самый главный и основной минус.
Очень часто натыкался на то, что CLI утилита продукта имеет 99.9% функционала UI, а MCP от силы 60-70% по моим наблюдениям и оценке.
Пример на скриншоте.
Контекст скриншота: обучаю скилл/агента трабшутить упавшие пайплайны гитлаба, и mcp тут не подходит, он даже не может смотреть лог джобы, лол.😬 Пришлось переписать на
- происхождение сомнительное
Большинство MCP‑реализаций сейчас - сторонние, не от официальных вендоров, и часто не строго следуют контракту API или gRPC.
Я пробовал делать "доверительные списки", даже обращался к https://archestra.ai/mcp-catalog, но результат все равно для меня сомнительный.
Мне этого хватило, чтобы со временем отключить почти все MCP сервера там, где есть альтернатива - CLI tool + Skills.
Есть glab + TOKEN? MCP GitLab не нужен.
Есть gh + TOKEN? MCP GitHub не нужен.
Есть kubectl + auth? MCP Kubernetes не нужен.
И так далее.
Из плюсов подхода Skills +CLI tool:
- трата меньше токенов
- больший функционал, чем у MCP
Я пробовал заменить MCP VM/VL на "cURL + Skills", это работает и работает отлично, но трата токенов выше примерно на 18-22% по моим графикам и данным. Нерационально, поэтому оставил MCP MV/VL.
MCP, скиллы, ИИ, *уи.
Последние месяцы отказываюсь от MCP серверов.
Прям вот по минимуму оставляю и только от безысходности.
Slack, Linear, Jira, Grafana, VM (Victoria metrics), VL (victoria logs) и так далее.
Им замены мало, без них сложно.
Все MCP для Kubernetes, GitHub, GitLab - все это очень плохо работает в боевых условиях.
Распишу основные минусы из моего опыта:
- трата токенов
Вопреки описанию "да просто мсп сервер ничего не жрет в фоне", это лукавство.
Жрет токены и это видно по логу и трате их по обычным запросам.
Постоянно включать/выключать их я пробовал, но это банально неудобно даже если повесить скиллы/алиасы на это.
- они навайбкожены
Давайте быть честными - больше половины этих серверов это вайбкод вайбкода и работает он ровно так же.
Никаких гарантий, что ИИ агент идет четко по REST API/gRPC, из моей практики они просто хаотично по всем ендпойнтам лезут в надежде найти ответ на вопрос/задачу.
- функционал обрезан. Самый главный и основной минус.
Очень часто натыкался на то, что CLI утилита продукта имеет 99.9% функционала UI, а MCP от силы 60-70% по моим наблюдениям и оценке.
Пример на скриншоте.
Контекст скриншота: обучаю скилл/агента трабшутить упавшие пайплайны гитлаба, и mcp тут не подходит, он даже не может смотреть лог джобы, лол.
glab cli.- происхождение сомнительное
Большинство MCP‑реализаций сейчас - сторонние, не от официальных вендоров, и часто не строго следуют контракту API или gRPC.
Я пробовал делать "доверительные списки", даже обращался к https://archestra.ai/mcp-catalog, но результат все равно для меня сомнительный.
Мне этого хватило, чтобы со временем отключить почти все MCP сервера там, где есть альтернатива - CLI tool + Skills.
Тут нет речи о том, что MCP - говно.
Тут речь лишь о том, что если есть CLI tool, то MCP не нужен.
Есть glab + TOKEN? MCP GitLab не нужен.
Есть gh + TOKEN? MCP GitHub не нужен.
Есть kubectl + auth? MCP Kubernetes не нужен.
И так далее.
Из плюсов подхода Skills +CLI tool:
- трата меньше токенов
- больший функционал, чем у MCP
Я пробовал заменить MCP VM/VL на "cURL + Skills", это работает и работает отлично, но трата токенов выше примерно на 18-22% по моим графикам и данным. Нерационально, поэтому оставил MCP MV/VL.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3
#ai #devops
Совершенно ожидаемо и неожиданно одновременно Nvidia выпустила бесплатные эндпойнты к популярным LLM моделям.
https://build.nvidia.com/models?filters=nimType%3Anim_type_preview&orderBy=weightPopular%3ADESC
А давайте-ка глянем, так ли оно.
- прошел регистрацию (мой
- прошел верификацию (номер телефона НЕ РФ, другие страны не проверял само собой) ✅
- выбрал рандомную модель
https://build.nvidia.com/moonshotai/kimi-k2-instruct
- нажал
- нажал в окошке
- скопировал код к себе локально в файл
- установил пакет опенаи (если нет)
- сохранил код и запустил его
Работает! 🎉
Забирайте себе и тренируйтесь с разными моделями бесплатно. ❤️
- - -
Update для самых быстрых и невнимательных.
Не забывайте, что там:
"Privacy. Your input and output will be recorded to provide you with this trial experience and to improve NVIDIA products and services, including AI models, in accordance with our Privacy Policy.
Do not upload any confidential information or personal data unless expressly permitted. Your use is logged for security, fraud or abuse monitoring and shared with third party service providers for this purpose. If the demo necessarily requires the input of personal data, logging for product development purposes will be turned off."
Совершенно ожидаемо и неожиданно одновременно Nvidia выпустила бесплатные эндпойнты к популярным LLM моделям.
https://build.nvidia.com/models?filters=nimType%3Anim_type_preview&orderBy=weightPopular%3ADESC
А давайте-ка глянем, так ли оно.
- прошел регистрацию (мой
gmail аккаунт) ✅- прошел верификацию (номер телефона НЕ РФ, другие страны не проверял само собой) ✅
- выбрал рандомную модель
https://build.nvidia.com/moonshotai/kimi-k2-instruct
- нажал
view code - нажал в окошке
generate API key- скопировал код к себе локально в файл
1.py , добавил context простой вопрос про хоккуfrom openai import OpenAI
client = OpenAI(
base_url = "https://integrate.api.nvidia.com/v1",
api_key = "nvapi-m3_bqO98rY-а-зачем-вам-мой-токен-BAMIGI-tLbz3VQ20MpwyTbU-"
)
completion = client.chat.completions.create(
model="moonshotai/kimi-k2-instruct",
messages=[{"role":"user","content":"Write a haiku about infrastructure as code."}],
temperature=0.6,
top_p=0.9,
max_tokens=4096,
stream=True
)
for chunk in completion:
if not getattr(chunk, "choices", None):
continue
if chunk.choices and chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="")
- установил пакет опенаи (если нет)
pip3 install openai
- сохранил код и запустил его
python3 1.py
Lines of code define
bridges spun from pure intent—
infrastructure breathes.
Работает! 🎉
Забирайте себе и тренируйтесь с разными моделями бесплатно. ❤️
- - -
Update для самых быстрых и невнимательных.
Не забывайте, что там:
"Privacy. Your input and output will be recorded to provide you with this trial experience and to improve NVIDIA products and services, including AI models, in accordance with our Privacy Policy.
Do not upload any confidential information or personal data unless expressly permitted. Your use is logged for security, fraud or abuse monitoring and shared with third party service providers for this purpose. If the demo necessarily requires the input of personal data, logging for product development purposes will be turned off."
❤8
#terraform #AWS #IaC #devops
Все мы живём в привычках.
Как однажды научили - так и делаем, словно котики, повторяющие одно и то же всю жизнь.
Учили поднимать руку, чтобы постучать в дверь.
А можно стучать кистью, не поднимая руку.
Мелочь, но никто не задумывается, потому что "так делается".
Когда у нас с супругой появилась посудомоечная машина, я внимательно читал инструкции - и от самой техники, и от капсул.
Тогда были капсулы со специальным покрытием, которое нужно было срывать перед загрузкой.
Потом она купила новые капсулы с плёнкой, которая растворяется от воды сама, и положила их в старую коробку - удобная была.
Я об этом не знал.
И каждый раз, словно дурачок, аккуратно срывал плёнку перед загрузкой.
Ну скажем сильно больше одного дня я так делал) Сильно больше)
Ведь меня так научили. Да и коробка - та же самая.
Вот так и в нашем айти.
Когда меня учили Terraform и в проекте были накликанные руками ресурсы, объясняли процесс примерно так: пишешь код ресурса, потом идёшь на registry.terraform.io, находишь нужный ресурс, листаешь вниз до секции Import - там написано в каком формате передавать ID (у каждого ресурса свой синтаксис, угадай с первого раза).
Потом идёшь в AWS консоль за нужным ARN или именем ресурса. Возвращаешься, запускаешь команду:
Делаешь план, убираешь дрифт. Следующий ресурс - снова на сайт, снова читаешь синтаксис, снова в консоль за ARN:
И так для каждого накликанного ресурса, по одному.
Ну я как обезьянка и повторял.
IAM роль?
Политика?
Node group?
Пять ресурсов - пять итераций, пять заходов на сайт.
Оказывается, с Terraform 1.5 (лето 2023, и да, я снова не знал🚬 ) есть блок import прямо в коде.
Без отдельных команд.
Без итераций.
Без "а я точно не забыл что-то запустить".
Запускаешь обычный
Это в коде, видно в PR, и при потере стейта не нужно вспоминать, что и как импортировать.
Документация прямо внутри конфига.
Import block не избавляет от необходимости знать ID формат, он просто убирает CLI-танцы.
Важно: import block выполняется только если ресурса нет в state.
После успешного импорта его можно удалить - он больше не нужен.
А если совсем не хочется писать конфиг руками - можно ещё и сгенерировать его через
Так и живём.
Срываем саморастворяющуюся плёнку с капсул, хотя давно этого делать не нужно.
Все мы живём в привычках.
Как однажды научили - так и делаем, словно котики, повторяющие одно и то же всю жизнь.
Учили поднимать руку, чтобы постучать в дверь.
А можно стучать кистью, не поднимая руку.
Мелочь, но никто не задумывается, потому что "так делается".
Когда у нас с супругой появилась посудомоечная машина, я внимательно читал инструкции - и от самой техники, и от капсул.
Тогда были капсулы со специальным покрытием, которое нужно было срывать перед загрузкой.
Потом она купила новые капсулы с плёнкой, которая растворяется от воды сама, и положила их в старую коробку - удобная была.
Я об этом не знал.
И каждый раз, словно дурачок, аккуратно срывал плёнку перед загрузкой.
Ну скажем сильно больше одного дня я так делал) Сильно больше)
Ведь меня так научили. Да и коробка - та же самая.
Вот так и в нашем айти.
Когда меня учили Terraform и в проекте были накликанные руками ресурсы, объясняли процесс примерно так: пишешь код ресурса, потом идёшь на registry.terraform.io, находишь нужный ресурс, листаешь вниз до секции Import - там написано в каком формате передавать ID (у каждого ресурса свой синтаксис, угадай с первого раза).
Потом идёшь в AWS консоль за нужным ARN или именем ресурса. Возвращаешься, запускаешь команду:
terraform import aws_iam_role.eks_node_role eks-node-role-production
Делаешь план, убираешь дрифт. Следующий ресурс - снова на сайт, снова читаешь синтаксис, снова в консоль за ARN:
terraform import aws_iam_role_policy_attachment.eks_worker_node_policy \
eks-node-role-production/arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
И так для каждого накликанного ресурса, по одному.
Ну я как обезьянка и повторял.
IAM роль?
terraform import. Политика?
terraform import. Node group?
terraform import. Пять ресурсов - пять итераций, пять заходов на сайт.
Оказывается, с Terraform 1.5 (лето 2023, и да, я снова не знал
Без отдельных команд.
Без итераций.
Без "а я точно не забыл что-то запустить".
import {
to = aws_iam_role.eks_node_role
id = "eks-node-role-production"
}
resource "aws_iam_role" "eks_node_role" {
name = "eks-node-role-production"
...
}
import {
to = aws_iam_role_policy_attachment.eks_worker_node_policy
id = "eks-node-role-production/arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"
}
resource "aws_iam_role_policy_attachment" "eks_worker_node_policy" {
role = aws_iam_role.eks_node_role.name
policy_arn = "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"
}Запускаешь обычный
terraform apply - он сам всё импортирует. Это в коде, видно в PR, и при потере стейта не нужно вспоминать, что и как импортировать.
Документация прямо внутри конфига.
Import block не избавляет от необходимости знать ID формат, он просто убирает CLI-танцы.
Важно: import block выполняется только если ресурса нет в state.
После успешного импорта его можно удалить - он больше не нужен.
А если совсем не хочется писать конфиг руками - можно ещё и сгенерировать его через
terraform plan -generate-config-out=generated.tf
Так и живём.
Срываем саморастворяющуюся плёнку с капсул, хотя давно этого делать не нужно.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🫡4👍2👏2
Media is too big
VIEW IN TELEGRAM
#aws #всратость
Спасибо тебе,маленькая инди компания Амазон!
Случайная сортировка аккаунтов при каждом входе на страницу SSO это очень удобно!
Спасибо тебе,
Случайная сортировка аккаунтов при каждом входе на страницу SSO это очень удобно!
😁23🤣6🍌1
#пятница #байки #всратость
Давно не было баек.
Когда-то давно я работал в банке синего цвета.
Или красного. Или жёлтого. А уже и не важно, может и не работал вовсе.
В банках всё строго регламентировано: отдельный контур для дева, отдельный для стейджа, препрод и прод. Свои отдельные аккаунты, свои отдельные CI/CD системы, свои раннеры, только под проект. Те, кто работал в банках, наверняка знают, как всё урезано и изолировано.
Однажды сложилась ситуация, когда надо было шарить между командами и библиотеки, и раннеры.
Это был настоящий прорыв: общие раннеры конвейера позволяли получать пакеты из общего реджистри, и больше не надо было страдать с изоляцией на каждый чих.
Спасибо команде поддержки конвейера❤️ .
И вот тут выяснилось кое-что неприятное.
Не все инженеры из продуктовых команд после работы на шаренном раннере чистили за собой кеш и конфиг.
А
И этот конфиг никуда не девается, если явно не выйти.
То есть следующий инженер, который запускал свою джобу на том же раннере, мог просто подобрать чужой опеншифт конфиг и зайти в чужой неймспейс.
А оттуда все секреты кубера, пароли к БД и так далее. Дев, конечно, но тем не менее.
Я писал команде поддержки конвейера - разводили руками. Писал команде поддержки опеншифтов - тоже ничего. Хотя решений было полно: запретить запись этого файла на раннере, чистить конфиг после каждого старта, да хоть просто добавить logout в шаблон джобы. Сотни вариантов. Ни один не взлетел.
Тогда я решил действовать сам. Решение получилось, скажем так, воспитательное.
Я создал пайплайн, который раз в пять минут по крону проверял незавершённые сессии. Если находил, то скейлил все деплойменты и деплойментконфиги в ноль, поднимал десять реплик фейкового пода с говорящим именем и чистил конфиг за нерадивым инженером.
Добавил, так сказать, немного пассивной агрессии в инфраструктуре.😀
Вот примерно так это выглядело:
Помогло ли это? Конечно же нет.😬
Народ просто ходил по чатам и спрашивал, что это такое и откуда взялось.
Поды с говорящим именем, деплойменты в нуле - это не вызывало никаких мыслей, только один вопрос: а это вообще что и зачем здесь.🐒
Я же просто гиенил с ситуации.
Не знаю, как насчёт импортозамещения, возможно сфера влияния поменялась, сейчас уже ничего этого не существует.
А может и существует, и мой пайплайн, словно герой в маске, до сих пор каждые пять минут обнуляет чьи-то деплойменты и пытается научить людей выходить из сессии.
Безуспешно, конечно.🤡
Давно не было баек.
Когда-то давно я работал в банке синего цвета.
Или красного. Или жёлтого. А уже и не важно, может и не работал вовсе.
В банках всё строго регламентировано: отдельный контур для дева, отдельный для стейджа, препрод и прод. Свои отдельные аккаунты, свои отдельные CI/CD системы, свои раннеры, только под проект. Те, кто работал в банках, наверняка знают, как всё урезано и изолировано.
Однажды сложилась ситуация, когда надо было шарить между командами и библиотеки, и раннеры.
Это был настоящий прорыв: общие раннеры конвейера позволяли получать пакеты из общего реджистри, и больше не надо было страдать с изоляцией на каждый чих.
Спасибо команде поддержки конвейера
И вот тут выяснилось кое-что неприятное.
Не все инженеры из продуктовых команд после работы на шаренном раннере чистили за собой кеш и конфиг.
А
oc login, как это принято, пишет конфиг сессии прямо на диск. И этот конфиг никуда не девается, если явно не выйти.
То есть следующий инженер, который запускал свою джобу на том же раннере, мог просто подобрать чужой опеншифт конфиг и зайти в чужой неймспейс.
А оттуда все секреты кубера, пароли к БД и так далее. Дев, конечно, но тем не менее.
Я писал команде поддержки конвейера - разводили руками. Писал команде поддержки опеншифтов - тоже ничего. Хотя решений было полно: запретить запись этого файла на раннере, чистить конфиг после каждого старта, да хоть просто добавить logout в шаблон джобы. Сотни вариантов. Ни один не взлетел.
Тогда я решил действовать сам. Решение получилось, скажем так, воспитательное.
Я создал пайплайн, который раз в пять минут по крону проверял незавершённые сессии. Если находил, то скейлил все деплойменты и деплойментконфиги в ноль, поднимал десять реплик фейкового пода с говорящим именем и чистил конфиг за нерадивым инженером.
Добавил, так сказать, немного пассивной агрессии в инфраструктуре.
Вот примерно так это выглядело:
object CheckOrphanSessions : BuildType({
name = "check-shared-runner-sessions"
steps {
script {
scriptContent = """
#!/usr/bin/env bash
oc=/path/to/oc
whoami=${'$'}(${'$'}oc whoami)
if [[ ${'$'}whoami == *"deploy-sa"* ]]; then
${'$'}oc scale deployment --all --replicas=0
${'$'}oc scale deploymentconfig --all --replicas=0
${'$'}oc new-app \
--name add-oc-logout-command-after-deploy-on-omni-agents \
--docker-image=registry.example.internal/fakeimage:latest \
--allow-missing-images
${'$'}oc scale deployment/add-oc-logout-command-after-deploy-on-omni-agents --replicas=10
${'$'}oc logout
echo "##ci[buildStatus text='caught you. ${'$'}whoami did not logout']"
else
echo "##ci[buildStatus text='agent is clean']"
fi
""".trimIndent()
}
}
triggers {
schedule {
schedulingPolicy = cron {
minutes = "*/5"
}
branchFilter = ""
triggerBuild = always()
withPendingChangesOnly = false
}
}
})Помогло ли это? Конечно же нет.
Народ просто ходил по чатам и спрашивал, что это такое и откуда взялось.
Поды с говорящим именем, деплойменты в нуле - это не вызывало никаких мыслей, только один вопрос: а это вообще что и зачем здесь.
Я же просто гиенил с ситуации.
Не знаю, как насчёт импортозамещения, возможно сфера влияния поменялась, сейчас уже ничего этого не существует.
А может и существует, и мой пайплайн, словно герой в маске, до сих пор каждые пять минут обнуляет чьи-то деплойменты и пытается научить людей выходить из сессии.
Безуспешно, конечно.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁28🤡3
Никаких технических статей и заметок на этой неделе нет по причине моего отпуска.
Могу лишь горячо порекомендовать, в рамках общего развития, прекраснейшую статью-разбор, которую я дочитал лишь на этой неделе.
Раскладки, клавиатуры, "почему так".
Интереснейший квест-погружение в мир раскладок клавиатур.
Читал я для себя, так как планировал попробовать сплит клавиатуру и хотел понять, надо ли оно мне, какие плюсы и минусы несет. Заметка у автора получилась просто огромная, очень интересно.
https://optozorax.github.io/p/my-keyboard-layout/
Могу лишь горячо порекомендовать, в рамках общего развития, прекраснейшую статью-разбор, которую я дочитал лишь на этой неделе.
Раскладки, клавиатуры, "почему так".
Интереснейший квест-погружение в мир раскладок клавиатур.
Читал я для себя, так как планировал попробовать сплит клавиатуру и хотел понять, надо ли оно мне, какие плюсы и минусы несет. Заметка у автора получилась просто огромная, очень интересно.
https://optozorax.github.io/p/my-keyboard-layout/
optozorax.github.io
Раскладка Ильи Шепрута — Блог optozorax'а
Моя раскладка, история прихода к ней и объяснение каждого дизайнерского решения.
❤8👍4💊2
#AWScommunity #troubleshooting #EKS #kubernetes #nodejs #aws #longread #SRE
Пока был в отпуске дописал свой лонгрид по дебаггингу 502 ошибок в приложении, запущенных в кубернетис.
Информация может быть полезна начинающим специалистам и мидлам по направлениям DevOps/SRE/VibeOps.
Более старшим и опытным товарищам заметка может показаться слабой.
Синёры сейчас все умные-преумные, так что, вероятно, они итак всё знают (особенно когда я так всё "разжевал") и без моих пояснений.
https://teletype.in/@kruchkov_alexandr/K-2Mql5Hsok
Пока был в отпуске дописал свой лонгрид по дебаггингу 502 ошибок в приложении, запущенных в кубернетис.
Информация может быть полезна начинающим специалистам и мидлам по направлениям DevOps/SRE/VibeOps.
Более старшим и опытным товарищам заметка может показаться слабой.
Синёры сейчас все умные-преумные, так что, вероятно, они итак всё знают (особенно когда я так всё "разжевал") и без моих пояснений.
https://teletype.in/@kruchkov_alexandr/K-2Mql5Hsok
Teletype
Поправить пятисотки на приложении в кубе - это просто!
Не мог не вставить эту глупую картинку peka face, потому что дебажить пятисотки в кубере в облаках на самом деле не так просто, как...
❤17👍10
This media is not supported in your browser
VIEW IN TELEGRAM
#пятница
Читаю я все эти новости про увольнения конца 2025 - начала 2026:
- оракл 30к
- амазон 30к
- интел 28к+
- ups 30к
- микрософт 18к
- куча менее известных компаний с 5-10к каждая
Что из этого стоит вынести?
Работать по выходным "в надежде на премию/опцион" - проклятая инвестиция.
Из последнего - https://finance.yahoo.com/markets/stocks/articles/oracles-cfo-got-26m-stock-184500098.html
Просто до хруста нагнули ребят и по-борцовски перекинули через себя на пол. Всё, что не успело вестнуться, просто сгорело - у людей улетели десятки и сотни тысяч долларов на бумаге.
Компании оптимизируют расходы быстро и без эмоций. И это норм.
Вчера ты перерабатывал, сегодня - строка в отчёте (сгенерированном ИИ, лол).
Премии могут не случиться, опционы - обесцениться (читайте про Oracle), а вот выгореть - вполне реально.
Мы, трудяги-работяги цифрового мира, у себя одни.
Не будьте оленями.
Завтра выходной - отдыхаем.
Читаю я все эти новости про увольнения конца 2025 - начала 2026:
- оракл 30к
- амазон 30к
- интел 28к+
- ups 30к
- микрософт 18к
- куча менее известных компаний с 5-10к каждая
Что из этого стоит вынести?
Работать по выходным "в надежде на премию/опцион" - проклятая инвестиция.
Из последнего - https://finance.yahoo.com/markets/stocks/articles/oracles-cfo-got-26m-stock-184500098.html
Просто до хруста нагнули ребят и по-борцовски перекинули через себя на пол. Всё, что не успело вестнуться, просто сгорело - у людей улетели десятки и сотни тысяч долларов на бумаге.
Компании оптимизируют расходы быстро и без эмоций. И это норм.
Вчера ты перерабатывал, сегодня - строка в отчёте (сгенерированном ИИ, лол).
Премии могут не случиться, опционы - обесцениться (читайте про Oracle), а вот выгореть - вполне реально.
Мы, трудяги-работяги цифрового мира, у себя одни.
Не будьте оленями.
Завтра выходной - отдыхаем.
👍28❤4😁2
#aws #eks #kubernetes #bottlerocket #troubleshooting #security #linux #CVE
Сорри за частые посты сегодня ☔️
Пока я был в отпуске и спал, снова сломали все интернеты.
В мае 2026 вышла пара свежих уязвимостей ядра linux в ос
- первая: CVE-2026-31431, она же Copy Fail
https://copy.fail
- вторая: Dirty Frag, смежная к первой
https://github.com/V4bel/dirtyfrag
Обе уязвимости это локальное повышение привилегий (LPE).
То есть если кто-то запустил код на вашей ноде, он может стать рутом.
В контексте Kubernetes это означает выход из контейнера на хост.
Первым делом пошёл смотреть, а вообще мы уязвимы или нет.
Способ 1:
Внутри:
Если в ответ получаете:
Вы не уязвимы на практике, даже если версия AMI старая.
Если модуль загрузился без ошибок, уязвимы, читайте дальше.
Способ 2: через SSM напрямую на ноду (только для Bottlerocket)
Это нативный способ для Bottlerocket.
Я писал об этом не раз, искать по тегу #bottlerocket
Подключаемся к ноде и проверяем модули:
Если пусто, модули не загружены.
Пробуем загрузить принудительно:
Если Operation not permitted, не уязвимы.
Почему у нас не сработало, хотя версия ядра старая
У нас EKS с Bottlerocket AMI.
Bottlerocket по умолчанию запускается с
В этом режиме загрузка не подписанных модулей через modprobe из пространства пользователя запрещена.
То есть Copy Fail + Dirty Frag требуют загрузить модуль algif_aead (или esp4/esp6/rxrpc как обход), но lockdown просто не даёт это сделать.
Это не значит, что можно расслабиться.
Это значит, что есть один слой защиты.
Defence-in-depth требует добавить второй явный слой и всё равно обновить ядро.
Что делать в любом случае: явно блокируем модули
Независимо от того уязвимы вы или нет, правильнее явно запретить загрузку этих модулей.
Один lockdown это хорошо, но явный запрет лучше.
Bottlerocket (Terraform, launch template + user data):
Добавляем в bottlerocket.tpl:
Это работает на уровне Bottlerocket API.
Он сам создаст нужные записи в /etc/modprobe.d/ при старте ноды.
Если у вас Karpenter, то добавляете в NodeClass или EC2NodeClass в секцию userData аналогичный блок для вашего distro.
Если у вас самописные Terraform-модули для нод-групп, то смотрите где у вас формируется user_data для launch template.
Добавляете туда блок выше.
Паттерн один и тот же, разница только в синтаксисе шаблона.
Как проверить что всё применилось
Для Bottlerocket есть нативный способ: через apiclient прямо с ноды, без debug подов и без sheltie.
Работает через SSM send-command из любого места где есть aws cli.
Узнаём instance ID:
Запускаем команду через SSM:
Смотрим результат:
Если всё применилось, увидите:
Если патч не применён, только lockdown, без modules:
Это показывает конфиг именно так, как его видит сама OS.
Лучше чем смотреть файлы руками.
Можно спать дальше🛌
Пока я был в отпуске и спал, снова сломали все интернеты.
В мае 2026 вышла пара свежих уязвимостей ядра linux в ос
- первая: CVE-2026-31431, она же Copy Fail
https://copy.fail
- вторая: Dirty Frag, смежная к первой
https://github.com/V4bel/dirtyfrag
Обе уязвимости это локальное повышение привилегий (LPE).
То есть если кто-то запустил код на вашей ноде, он может стать рутом.
В контексте Kubernetes это означает выход из контейнера на хост.
Первым делом пошёл смотреть, а вообще мы уязвимы или нет.
Способ 1:
kubectl debug node/<имя_ноды> -it --image=busybox -- sh
Внутри:
chroot /host modprobe algif_aead
Если в ответ получаете:
modprobe: ERROR: could not insert 'algif_aead': Operation not permitted
Вы не уязвимы на практике, даже если версия AMI старая.
Если модуль загрузился без ошибок, уязвимы, читайте дальше.
Способ 2: через SSM напрямую на ноду (только для Bottlerocket)
Это нативный способ для Bottlerocket.
Я писал об этом не раз, искать по тегу #bottlerocket
Подключаемся к ноде и проверяем модули:
cat /proc/modules | grep -E 'algif_aead|esp4|esp6|rxrpc'
Если пусто, модули не загружены.
Пробуем загрузить принудительно:
modprobe algif_aead
Если Operation not permitted, не уязвимы.
Почему у нас не сработало, хотя версия ядра старая
У нас EKS с Bottlerocket AMI.
Bottlerocket по умолчанию запускается с
kernel.lockdown = integrity.
В этом режиме загрузка не подписанных модулей через modprobe из пространства пользователя запрещена.
То есть Copy Fail + Dirty Frag требуют загрузить модуль algif_aead (или esp4/esp6/rxrpc как обход), но lockdown просто не даёт это сделать.
Это не значит, что можно расслабиться.
Это значит, что есть один слой защиты.
Defence-in-depth требует добавить второй явный слой и всё равно обновить ядро.
Что делать в любом случае: явно блокируем модули
Независимо от того уязвимы вы или нет, правильнее явно запретить загрузку этих модулей.
Один lockdown это хорошо, но явный запрет лучше.
Bottlerocket (Terraform, launch template + user data):
Добавляем в bottlerocket.tpl:
[settings.kernel]
lockdown = "integrity"
[settings.kernel.modules.algif_aead]
allowed = false
[settings.kernel.modules.esp4]
allowed = false
[settings.kernel.modules.esp6]
allowed = false
[settings.kernel.modules.rxrpc]
allowed = false
Это работает на уровне Bottlerocket API.
Он сам создаст нужные записи в /etc/modprobe.d/ при старте ноды.
Если у вас Karpenter, то добавляете в NodeClass или EC2NodeClass в секцию userData аналогичный блок для вашего distro.
Если у вас самописные Terraform-модули для нод-групп, то смотрите где у вас формируется user_data для launch template.
Добавляете туда блок выше.
Паттерн один и тот же, разница только в синтаксисе шаблона.
Как проверить что всё применилось
Для Bottlerocket есть нативный способ: через apiclient прямо с ноды, без debug подов и без sheltie.
Работает через SSM send-command из любого места где есть aws cli.
Узнаём instance ID:
kubectl get node <имя_ноды> -o jsonpath='{.spec.providerID}' | sed 's|.*\/||'Запускаем команду через SSM:
aws ssm send-command \
--instance-ids <instance-id> \
--document-name "AWS-RunShellScript" \
--parameters 'commands=["apiclient get settings.kernel"]' \
--region us-east-1
Смотрим результат:
aws ssm get-command-invocation \
--command-id <command-id> \
--instance-id <instance-id> \
--region us-east-1 \
--query 'StandardOutputContent' \
--output text
Если всё применилось, увидите:
{
"settings": {
"kernel": {
"lockdown": "integrity",
"modules": {
"algif_aead": { "allowed": false },
"esp4": { "allowed": false },
"esp6": { "allowed": false },
"rxrpc": { "allowed": false }
}
}
}
}Если патч не применён, только lockdown, без modules:
{
"settings": {
"kernel": {
"lockdown": "integrity"
}
}
}Это показывает конфиг именно так, как его видит сама OS.
Лучше чем смотреть файлы руками.
Можно спать дальше
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁24
#devops #linux #security
Только-только отгремели два LPE
- https://copy.fail/
- https://github.com/V4bel/dirtyfrag
Не успели донести ещё до продакшна изменения-фиксы, так уже третья проблема прилетела.
- https://github.com/v12-security/pocs/tree/main/fragnesia
Какой ад, если честно🤦♂️ 🤦♂️ 🤦♂️
Чот всё как-то проклято с этими LPE.
Ведь точно не последняя будет с такой-то волной интереса и доступностью AI агентов и ассистентов.
Только-только отгремели два LPE
- https://copy.fail/
- https://github.com/V4bel/dirtyfrag
Не успели донести ещё до продакшна изменения-фиксы, так уже третья проблема прилетела.
- https://github.com/v12-security/pocs/tree/main/fragnesia
Какой ад, если честно
Чот всё как-то проклято с этими LPE.
Ведь точно не последняя будет с такой-то волной интереса и доступностью AI агентов и ассистентов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
внезапная #пятница
В 16.37 упала интеграция со Slack.
Сначала никто не придал значения: не грузятся картинки, не отправляются сообщения - бывает.
Но через несколько минут стало понятно, что вместе со Slack исчезло всё: алерты, уведомления, инциденты, интеграции с джира и другими системами.
Это была.. это была
Alertmanager и Grafana IRM продолжали честно, но грустно, стрелять событиями, но они уходили в пустоту.
Автономные AI-агенты, на которых недавно переложили реагирование на инциденты, перестали работать - им просто неоткуда было читать сигналы и некуда писать решения.
Прод уже начинал сыпаться: росла нагрузка, сервисы деградировали, поды уходили в рестарты.
Но в команде царила странная пауза.
Инженеры сидели в Slack и ждали, когда появится алерт.
Без него никто не понимал, куда смотреть и что именно сломалось.
Слишком многое теперь начиналось с уведомления.
Инженерам пришлось руками, РУКАМИ, писать в чаты Слака и телеги:
- "А у нас вообще есть инцидент?"
- "Кто on-call?"
- "Где это посмотреть, если нет алерта?"
- "А какой агент за это отвечает?"
- "а где хаддл?"
Ответа не было.
И только Валера, простой старый сисадмин, которого держали "на всякий случай", просто открыл Grafana и Прометиус в браузере. Без интеграций, без ботов, без AI.
Через пару минут он уже видел картину целиком.
Он зашёл в Alertmanager UI, сам прочитал алерты, потом пошёл в kubectl и начал разбираться, что происходит в кластере.
Без подсказок, без рекомендаций, без "предложенных действий" и MCP.
Просто как раньше.
Проблема нашлась быстро - кривой rollout положил часть прод-кластера.
Валера пофиксил деплой, проверил состояние, убедился, что метрики возвращаются в норму, и только после этого открыл Slack и сам, своими руками, без агентов, написал:
"Прод падал. Починил. Чекните."
Через несколько минут Slack ожил.
За ним - агенты.
Они прочитали тред, проанализировали данные и сгенерировали отчёт об инциденте.
А потом поставили Валере 👍
Потому что без интеграций они не умеютнихуя ничего.
А Валера - умеет.
В 16.37 упала интеграция со Slack.
Сначала никто не придал значения: не грузятся картинки, не отправляются сообщения - бывает.
Но через несколько минут стало понятно, что вместе со Slack исчезло всё: алерты, уведомления, инциденты, интеграции с джира и другими системами.
Это была.. это была
katastrofa!Alertmanager и Grafana IRM продолжали честно, но грустно, стрелять событиями, но они уходили в пустоту.
Автономные AI-агенты, на которых недавно переложили реагирование на инциденты, перестали работать - им просто неоткуда было читать сигналы и некуда писать решения.
Прод уже начинал сыпаться: росла нагрузка, сервисы деградировали, поды уходили в рестарты.
Но в команде царила странная пауза.
Инженеры сидели в Slack и ждали, когда появится алерт.
Без него никто не понимал, куда смотреть и что именно сломалось.
Слишком многое теперь начиналось с уведомления.
Инженерам пришлось руками, РУКАМИ, писать в чаты Слака и телеги:
- "А у нас вообще есть инцидент?"
- "Кто on-call?"
- "Где это посмотреть, если нет алерта?"
- "А какой агент за это отвечает?"
- "а где хаддл?"
Ответа не было.
И только Валера, простой старый сисадмин, которого держали "на всякий случай", просто открыл Grafana и Прометиус в браузере. Без интеграций, без ботов, без AI.
Через пару минут он уже видел картину целиком.
Он зашёл в Alertmanager UI, сам прочитал алерты, потом пошёл в kubectl и начал разбираться, что происходит в кластере.
Без подсказок, без рекомендаций, без "предложенных действий" и MCP.
Просто как раньше.
Проблема нашлась быстро - кривой rollout положил часть прод-кластера.
Валера пофиксил деплой, проверил состояние, убедился, что метрики возвращаются в норму, и только после этого открыл Slack и сам, своими руками, без агентов, написал:
"Прод падал. Починил. Чекните."
Через несколько минут Slack ожил.
За ним - агенты.
Они прочитали тред, проанализировали данные и сгенерировали отчёт об инциденте.
А потом поставили Валере 👍
Потому что без интеграций они не умеют
А Валера - умеет.
😁47💯11🫡10❤4👍2👏1
#kubernetes #kubelet #devops #observability
Я, конечно, понимаю, что сейчас все вокруг ИИ агент-нейтив супер синёры и все всё знают, так что заметка для обычных инженеров, которые ещё чего-то не знают.
Свежая статья от LearnKube про то, откуда на самом деле берутся метрики в Kubernetes
- https://learnkube.com/kubernetes-metrics-cadvisor-kubelet-cri 🔥🔥🔥
По мне так прям годная разборка пайплайна метрик кубера: kubelet > cAdvisor > CRI.
Не маркетинговая жыжа инфоцыган, а прям пошагово на minikube с containerd, с командами, выводами,
О чём в двух словах:
- как кублет на старте решает, cgroup v1 или v2 у ноды, и какой cgroup driver брать (
- как QoS класс пода (Guaranteed/Burstable/BestEffort) определяет, в какой слайс он улетит. С трейсом от UID пода в API до .scope юнита на диске
- что такое пауз-контейнер и почему у тебя у каждого пода два скоуп юнита, даже если контейнер один
- четыре эндпоинта кублета и чем они отличаются, типа:
- - /metrics/cadvisor - контейнерные метрики в прометей формате от cAdvisor
- - /stats/summary - JSON по нодам/подам/контейнерам/волюмам
- - /metrics/resource - лёгкие cpu/memory, на это сейчас смотрит metrics-server 0.6+
- - /metrics - внутренняя кухня самого кублета (
- зачем ваще сделали фичу
- что произойдёт с твоимпздц контейнерные метрики оттуда исчезнут, останется только machine-level)
- про
Кому полезно:
- SRE/DevOps/SysAdmin, кто прометиусом/викторииметрикс скрейпит😬
- тем, кто сидит на кластерах с cgroup v1 - пора планировать миграцию, иначе 1.35 встретите со сломанным кублетом
- тем, кто хоть раз получал баг репорт "у нас метрик нет на /metrics/cadvisor" и не понимал откуда они вообще должны прилетать
- начинающим, кто хочет понять физику процессов, а не "ну вот стоит прометеус и метрики откуда-то есть"
- шизикам-любителям полазить по😀
По мне статья прям полезная, дочитал до конца под кофеёк
На русском такого подробного и пошагового я давно не видел, ну может у крутых ребят из Флант есть, но я разленился их читать, так что точно не скажу.
Никакого AI, сорян, чисто инженерный документ для инженеров про кубы.
Я, конечно, понимаю, что сейчас все вокруг ИИ агент-нейтив супер синёры и все всё знают, так что заметка для обычных инженеров, которые ещё чего-то не знают.
Свежая статья от LearnKube про то, откуда на самом деле берутся метрики в Kubernetes
- https://learnkube.com/kubernetes-metrics-cadvisor-kubelet-cri 🔥🔥🔥
По мне так прям годная разборка пайплайна метрик кубера: kubelet > cAdvisor > CRI.
Не маркетинговая жыжа инфоцыган, а прям пошагово на minikube с containerd, с командами, выводами,
/sys/fs/cgroup/ наизнанку.О чём в двух словах:
- как кублет на старте решает, cgroup v1 или v2 у ноды, и какой cgroup driver брать (
systemd vs cgroupfs)- как QoS класс пода (Guaranteed/Burstable/BestEffort) определяет, в какой слайс он улетит. С трейсом от UID пода в API до .scope юнита на диске
- что такое пауз-контейнер и почему у тебя у каждого пода два скоуп юнита, даже если контейнер один
- четыре эндпоинта кублета и чем они отличаются, типа:
- - /metrics/cadvisor - контейнерные метрики в прометей формате от cAdvisor
- - /stats/summary - JSON по нодам/подам/контейнерам/волюмам
- - /metrics/resource - лёгкие cpu/memory, на это сейчас смотрит metrics-server 0.6+
- - /metrics - внутренняя кухня самого кублета (
kubelet_runtime_operations_duration_seconds и тд)- зачем ваще сделали фичу
PodAndContainerStatsFromCRI - чтобы кублет тащил статы пода/контейнера прямо из рантайма через gRPC, а не гонял cAdvisor по cgroup-фс второй раз- что произойдёт с твоим
/metrics/cadvisor если её включить (спойлер: - про
KubeletCgroupDriverFromCRI (я честно скипнул, пипец нудятина про рантайм драйвера)Кому полезно:
- SRE/DevOps/SysAdmin, кто прометиусом/викторииметрикс скрейпит
/metrics/cadvisor и думает, что всё ок навсегда. Включат гейт, обнаружат пропавшие метрики и сюрприз-сюрприз - тем, кто сидит на кластерах с cgroup v1 - пора планировать миграцию, иначе 1.35 встретите со сломанным кублетом
- тем, кто хоть раз получал баг репорт "у нас метрик нет на /metrics/cadvisor" и не понимал откуда они вообще должны прилетать
- начинающим, кто хочет понять физику процессов, а не "ну вот стоит прометеус и метрики откуда-то есть"
- шизикам-любителям полазить по
/sys/fs/cgroup/kubepods.slice/, потому что половина статьи это именно ssh + ls -la По мне статья прям полезная, дочитал до конца под кофеёк
На русском такого подробного и пошагового я давно не видел, ну может у крутых ребят из Флант есть, но я разленился их читать, так что точно не скажу.
Никакого AI, сорян, чисто инженерный документ для инженеров про кубы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32❤11🫡2
Года два-три думал об этом, мечтал, планировал, читал и смотрел обзоры, хотел - и наконец-то "созрел".
Накопил денег и, пока не видит супруга, заказал себе новую для меня ортолинейную клавиатуру Voyager и не менее свежий для мира тачпад Navigator под правую кисть.
Ночью, пока все спят, в костюме ниндзя, тактическими перекатами, под прикрытием дымовых шашек, сгоняю на склад и заберу посылку, когда она приедет из Тайваня - чтобы никто не обвинил меня в том, что опять спустил семейные деньги вайти сраное никуда.
С нетерпением жду, когда наконец окунусь в мир раздельной клавиатуры и по‑настоящему комфортной печати (надеюсь). Ну и мучений конечно же.
Не ожидаю разочарования, потому что кисти рук очень болят, я устал, правда, и я хочу попробовать что-то новое.
Вдруг это поможет.
Накопил денег и, пока не видит супруга, заказал себе новую для меня ортолинейную клавиатуру Voyager и не менее свежий для мира тачпад Navigator под правую кисть.
Ночью, пока все спят, в костюме ниндзя, тактическими перекатами, под прикрытием дымовых шашек, сгоняю на склад и заберу посылку, когда она приедет из Тайваня - чтобы никто не обвинил меня в том, что опять спустил семейные деньги в
С нетерпением жду, когда наконец окунусь в мир раздельной клавиатуры и по‑настоящему комфортной печати (надеюсь). Ну и мучений конечно же.
Не ожидаю разочарования, потому что кисти рук очень болят, я устал, правда, и я хочу попробовать что-то новое.
Вдруг это поможет.
🔥22👍5
#troubleshooting #terragrunt #devops #всратость
Очередная всратая история про Tailscale .
Была задача: заменить один легаси Tailscale узел нормальной HA парой.
Два EC2 в Auto Scaling Group, два AZ, автоматическая ротация auth-key через Lambda + Vault.
Красиво, надёжно, как в книжках и доке написано.
Задеплоили, новые ноды поднялись, анонсируют маршруты, всё выглядит отлично.
Убрали легаси (просто потушили).
Через некоторое время в слаке:
- "а почему внутренний адрес ArgoCD отдаёт 403? э!"
Начинаем смотреть чо там: ДНС не резолвит внутренние имена, весь туннель работает, TCP через
Ну окей, DNS сломался, а почему.
В AWS VPC есть такая штука -
Если мой VPC это
Через него работает сплит-днс: внутренние имена идут в приватные Route53 зоны, всё остальное - наружу.
Чтобы это работало через Tailscale-туннель, клиенты должны уметь достучаться до
Легаси-нода анонсировала два маршрута:
Новые ноды анонсировали только один маршрут
Как оказалось (спасибо нейронкам, документации и коллегам) tailscale работает по принципу
- запрос к
А потом легаси потушили. И tailscale не переключился на
Это не баг, кстати, а документированное поведение, написанное прямо в KB-1019:
Я, конечно, как и коллеги, прочитали это уже после. Ну всё как обычно.
Для работы HA failover у tailscale вообще требуется, чтобы обе ноды анонсировали идентичные префиксы - широкий
Итого: DNS-резолвер 10.72.0.2 видел только легаси через
TCP до других адресов в
Фикс простой: каждая нода должна явно анонсировать
В terra модуле добавили вычисление адреса резолвера через
Плюс в tailscale ACL нужна отдельная запись в😬 .
Теперь при любой замене ноды все HA-пиры анонсируют и
Мораль тут банальная, но всё равно немного обидная: читай документацию до деплоя, а не после инцидента.
Мы предполагали, что Tailscale при отсутствии
Вроде логично же - подсеть включает адрес, значит маршрут есть, но у tailscale другая логика:
Один 32-битный префикс, пропущенный при проектировании нового модуля - и несколько часов дебага всей командой*.
* я только коммиты смотрел, читал доки тейлскейла, AWS по VPC и слушал на митосе как ребята траблшутят.
- - -
В следующий раз, когда мне захочется поныть про "тупые" вопросы о сетях и подсетях на собесе, просто вспомню, как один /32 положил нам DNS😬
Очередная всратая история
Была задача: заменить один легаси Tailscale узел нормальной HA парой.
Два EC2 в Auto Scaling Group, два AZ, автоматическая ротация auth-key через Lambda + Vault.
Красиво, надёжно, как в книжках и доке написано.
Задеплоили, новые ноды поднялись, анонсируют маршруты, всё выглядит отлично.
Убрали легаси (просто потушили).
Через некоторое время в слаке:
- "а почему внутренний адрес ArgoCD отдаёт 403? э!"
Начинаем смотреть чо там: ДНС не резолвит внутренние имена, весь туннель работает, TCP через
/16 ходит нормально, но стоит обратиться по FQDN к любому внутреннему сервису - тишина.dig +short internal-service.company.example.com
;; connection timed out; no servers could be reached
Ну окей, DNS сломался, а почему.
В AWS VPC есть такая штука -
AmazonProvidedDNS. Это встроенный резолвер, который живёт по адресу <CIDR_VPC_BASE>+2. Если мой VPC это
10.72.0.0/20, то резолвер сидит на 10.72.0.2.Через него работает сплит-днс: внутренние имена идут в приватные Route53 зоны, всё остальное - наружу.
Чтобы это работало через Tailscale-туннель, клиенты должны уметь достучаться до
10.72.0.2.Легаси-нода анонсировала два маршрута:
10.72.0.0/16 (широкая подсеть) и 10.72.0.2/32 (конкретно этот адрес резолвера).Новые ноды анонсировали только один маршрут
10.72.0.0/16.Как оказалось (спасибо нейронкам, документации и коллегам) tailscale работает по принципу
Longest Prefix Match (LPM): при выборе маршрута побеждает самый специфичный: - запрос к
10.72.0.2 шёл через легаси, потому что у неё был /32 - он длиннее /16.А потом легаси потушили. И tailscale не переключился на
/16 новых нод.Это не баг, кстати, а документированное поведение, написанное прямо в KB-1019:
"Tailscale does not fall back to a less-specific route when the subnet router for a more-specific route goes offline.
Tailscale drops traffic to 10.0.0.1 rather than falling back to subnet router A's 10.0.0.0/16 route."
Я, конечно, как и коллеги, прочитали это уже после. Ну всё как обычно.
Для работы HA failover у tailscale вообще требуется, чтобы обе ноды анонсировали идентичные префиксы - широкий
/16 не является фолбэком для /32 - это просто другой маршрут.Итого: DNS-резолвер 10.72.0.2 видел только легаси через
/32, новые ноды с 10.72.0.0/16 для tailscale были вообще не кандидатами на трафик к этому конкретному адресу. Убрали легаси - адрес пропал из таблицы маршрутов. DNS умер и всё, издец.TCP до других адресов в
10.72/16 работало нормально - там /32-специфики не было, оба маршрута от новых нод были равнозначными, failover сработал.Фикс простой: каждая нода должна явно анонсировать
<VPC_CIDR_BASE>+2/32.В terra модуле добавили вычисление адреса резолвера через
cidrhost(var.vpc_cidr, 2) и автоматически подклеиваем его как /32 к списку advertised_routes. Плюс в tailscale ACL нужна отдельная запись в
autoApprovers.routes под этот /32 - общий /16 его не покрывает, там тоже exact match locals {
vpc_dns_resolver = cidrhost(var.vpc_cidr, 2)
advertised_routes = distinct(
concat(var.advertised_routes, ["${local.vpc_dns_resolver}/32"])
)
}Теперь при любой замене ноды все HA-пиры анонсируют и
/16, и /32 резолвера - файловер работает корректно, ДНС не падает.Мораль тут банальная, но всё равно немного обидная: читай документацию до деплоя, а не после инцидента.
Мы предполагали, что Tailscale при отсутствии
/32 анонсера переключится на покрывающий /16. Вроде логично же - подсеть включает адрес, значит маршрут есть, но у tailscale другая логика:
/32 и /16 - это разные маршруты, не уточнение одного другим, фоллбек намеренно не делается, потому что иначе можно случайно отправить трафик не туда.Один 32-битный префикс, пропущенный при проектировании нового модуля - и несколько часов дебага всей командой*.
* я только коммиты смотрел, читал доки тейлскейла, AWS по VPC и слушал на митосе как ребята траблшутят.
- - -
В следующий раз, когда мне захочется поныть про "тупые" вопросы о сетях и подсетях на собесе, просто вспомню, как один /32 положил нам DNS
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍8🤡1
#пятница
Хочу иметь такие же стальные яйца уверенности, как у Леди Гаги, пришедшей на репетицию легендарной Metallica в максимально удобном ей наряде.
- https://youtu.be/jLZ2P_QiLZo?si=njfREiqlO6fIvcd-&t=139
Хочу обладать той же непоколебимой самоуверенностью, что и Slack - с десятками инцидентов в год и при этом с гордым 100% uptime на статус-пейдже.😎
- https://slack-status.com/
- https://slack-status.com/calendar
И, наконец, хочу прокачать до максимума талант наглости и оптимизма - чтобы в CV спокойно писать в разделе сертификатов: дату Planned.
- https://xn--r1a.website/sysadminka/339409
Хочу иметь такие же стальные яйца уверенности, как у Леди Гаги, пришедшей на репетицию легендарной Metallica в максимально удобном ей наряде.
- https://youtu.be/jLZ2P_QiLZo?si=njfREiqlO6fIvcd-&t=139
Хочу обладать той же непоколебимой самоуверенностью, что и Slack - с десятками инцидентов в год и при этом с гордым 100% uptime на статус-пейдже.
- https://slack-status.com/
- https://slack-status.com/calendar
И, наконец, хочу прокачать до максимума талант наглости и оптимизма - чтобы в CV спокойно писать в разделе сертификатов: дату Planned.
- https://xn--r1a.website/sysadminka/339409
Please open Telegram to view this post
VIEW IN TELEGRAM
😁27👍3🤣3
#всратость
Маленькая инди-компания опять не смогла.
Google Chrome + Google AntiGravity website+ Google Translate browser plugin.
Насчёт AI не подскажу, но, вероятно, без него не обошлось.
- https://antigravity.google/
- https://antigravity.google/download
Господи, какой же это пздц 🚶♀ .
Маленькая инди-компания опять не смогла.
Google Chrome + Google AntiGravity website+ Google Translate browser plugin.
Насчёт AI не подскажу, но, вероятно, без него не обошлось.
- https://antigravity.google/
- https://antigravity.google/download
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁20🤣10