Библиотека девопса | DevOps, SRE, Sysadmin
10.4K subscribers
1.8K photos
76 videos
4 files
3.17K links
Все самое полезное для девопсера в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/25874ec4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
Download Telegram
👍 На курсе по контролируемой разработке AI-агентов мы будем разбирать ровно то, о чём говорит Владислав в голосовом, но уже в формате системной практики.

📅 Старт курса — 20 апреля.

Если хотите разобраться, как строить управляемые агентные системы:
➡️ Присоединяйтесь.

P.S. С первого занятия будет практика: код и разбор реальных ошибок, а не только теория.
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Безопасный способ вывести ноду из строя

Надо обновить ноду, поменять железо или просто перезагрузить сервер. Проблема в том, что на ноде уже крутятся поды с реальной работой. Просто выключить её нельзя. Вот тут на помощь приходит kubectl drain.

Команда:
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data


Kubernetes корректно выведет все поды с ноды, перенесёт их на другие ноды в кластере и отметит саму ноду как недоступную для новых подов. Workloads при этом не упадут, они просто переедут.

--ignore-daemonsets говорит системе не трогать DaemonSets, потому что они крутятся на каждой ноде и переносить их бесполезно. --delete-emptydir-data удаляет поды с пустыми томами, которые нельзя перенести нормально.

Drain работает только с управляемыми подами. Если у вас валяются standalone поды без контроллера, они просто удалятся. Поэтому перед drain проверьте, что важные поды находятся в Deployments, StatefulSets или других контроллерах.

После drain нода остаётся в состоянии unschedulable. Когда закончите работу, верните её обратно:
kubectl uncordon <node-name>


📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#root_prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
👨‍💻 Регулярные выражения в Ingress-NGINX работают не так, как вы думаете

Разбираем особенности Ingress-NGINX перед его отставкой. Одна из самых частых причин тихих сбоев при миграции — это поведение регулярных выражений в путях маршрутизации.

Предположим, нужно направлять на бэкенд только запросы, путь которых состоит ровно из трёх заглавных букв. Пишете паттерн /[A-Z]{3}, включаете аннотацию nginx.ingress.kubernetes.io/use-regex: "true" и считаете задачу решённой.

На деле Ingress-NGINX обрабатывает такой паттерн как _префикс без учёта регистра_. Запрос /uuid пройдёт — потому что три буквы в начале пути есть. /some-long-path тоже пройдёт. Именно это поведение было в продакшене, даже если вы об этом не знали.

При переходе на Gateway API с типом матчинга RegularExpression всё меняется. Реализации на базе Envoy — Istio, Envoy Gateway, Kgateway — делают полное совпадение с учётом регистра. Паттерн /[A-Z]{3} уже не пропустит /uuid. Запросы, которые раньше работали, начнут возвращать 404.

Чтобы сохранить прежнее поведение, паттерн нужно переписать явно: /[a-zA-Z]{3}.*. Либо использовать флаг (?i), если конкретная реализация его поддерживает.

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

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Не гоняйте, пацаны

Terraform-собеседование — и вот вам вопрос:
Команда хранит state в S3 и периодически ловит его порчу при одновременных apply. Как исключить race condition?


Подсказка: одного только версионирования S3 недостаточно. Нужен механизм, который не дает двум apply работать одновременно.

➡️ Проверить себя

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#задача_со_звёздочкой
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🧑‍💻 Linux From Scratch 13: больше компонентов, systemd по умолчанию

LFS это руководство по сборке Linux с нуля. Вы компилируете каждый компонент сами, из исходников. Это едва ли полезно для production систем, но отлично работает как обучение.

В Linux From Scratch 13.0 обновилось 36 компонентов. Вот самые заметные: ядро Linux 6.18.10, systemd 259.1, Python 3.14.3, OpenSSL 3.6.1, SQLite 3.50.4. Все обновлено и актуально.

Главное изменение: LFS 13.0 полностью переходит на systemd. Старые версии 12.4 шли с SysVinit, и это было огромным минусом для обучения, потому что современный Linux это практически всегда systemd.

➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
👨‍💻 Перезапись путей: скрытая логика, которая ломает маршрутизацию

Продолжаем цикл о подводных камнях перед отставкой Ingress-NGINX. Сегодня — перезапись путей. Это одна из самых используемых функций контроллера и одна из самых болезненных при переносе на Gateway API.

В Ingress-NGINX перезапись настраивается через аннотацию nginx.ingress.kubernetes.io/rewrite-target. Например, паттерн /api/(.*) с rewrite-target /$1 отрежет префикс /api и передаст бэкенду оставшуюся часть пути.

Проблема в том, что Ingress-NGINX _переписывает весь путь целиком_, а не только совпавшую часть. Это отличается от поведения большинства других прокси. Если бэкенд ожидает определённую структуру пути — поведение после миграции может измениться даже при формально правильном переводе.

В Gateway API перезапись реализована через фильтр URLRewrite. Логика другая: можно заменить префикс или весь путь. Прямого аналога подстановки через $1, $2 нет. Конфигурации с несколькими группами захвата придётся переосмыслить.

Ещё одна деталь — приоритет пересекающихся маршрутов. В Gateway API он определяется специфичностью совпадения. В Ingress-NGINX логика другая. Если у вас несколько маршрутов с похожими путями, порядок их срабатывания может поменяться после миграции.

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

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍 Весенние новости

Совсем скоро всё оттает, а пока что вспоминаем первую неделю весны.

Linux 7.0 стартовал неспокойно

Хватит быть хорошим

elementary OS 8.1.1

Nitrux 6.0.0

Ingress-NGINX уходит

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#дайджест_недели
Please open Telegram to view this post
VIEW IN TELEGRAM
2
💥 Открытый вебинар | ИИ-агенты в продакшене: от хайпа к деньгам

Агенты уже везде. Но мало кто признаётся, сколько денег сжёг на бесконечных циклах, галлюцинациях в RAG и отсутствии мониторинга.

Полина Полунина, руководитель AI-направления Альфа-Банка, расскажет честно:

▪️ Чем агент отличается от «просто GPT с промптом» и когда бизнесу достаточно обычного LLM
▪️ 3 реальных кейса из корпоративной среды: что взлетело, а что нет
▪️ Live-демо работающего агента
▪️ ТОП-5 граблей, на которые наступают команды при внедрении

⏱️ 10 марта в 19:00 (МСК)

🎁 Участники получат промокод на скидку на самый полный курс по ИИ-агентам

👉 Регистрируйся
🐳 Контейнер падает при старте

Когда Docker контейнер вылетает прямо после запуска, это всегда выглядит странно. Особенно если локально всё работало нормально. Давайте разберёмся, что чаще всего заставляет контейнер выходить с ошибкой.

Первое правило: смотрите логи

Контейнер существует ровно столько, сколько выполняется процесс внутри него. Если процесс завершился или вообще не запустился, контейнер упадёт. Это закономерно, но информация об ошибке может быть скрыта.

docker logs 


Запустите эту команду сразу, как только контейнер упал. Часто там будет сразу видно, что случилось. Если логов мало, добавьте флаг --tail 100 или посмотрите всё целиком через --all.

Рабочая директория и файлы

Очень частая причина. Если приложение ищет конфиг в /app/config, а в образе это лежит в /etc/app, всё сломается.

Проверьте в Dockerfile:

WORKDIR /app
COPY . .


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

Переменные окружения

Приложение может требовать DATABASE_URL или API_KEY, и если их нет, оно не запустится. При запуске передавайте всё нужное:

docker run -e DATABASE_URL=postgres://... -e API_KEY=secret myapp:latest


Или через файл:

docker run --env-file .env myapp:latest


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

Runtime и зависимости

Иногда базовый образ не содержит то, что нужно. Вы собрали Go приложение, положили бинарник в контейнер на основе alpine:latest, но забыли нужную библиотеку. Результат предсказуем.

FROM golang:1.21 as builder
WORKDIR /build
COPY . .
RUN go build -o app .

FROM alpine:latest
RUN apk add --no-cache ca-certificates
COPY --from=builder /build/app /usr/local/bin/


Убедитесь, что в образе есть всё необходимое. Используйте docker run -it myimage sh и проверьте вручную, работает ли приложение.

Порты и привилегии

Контейнер может падать из-за проблем с портами или правами. Если приложение пытается слушать на порту ниже 1024, но не запущено от root, это не сработает.

USER appuser
EXPOSE 8080


Убедитесь, что пользователь имеет нужные привилегии и приложение слушает на доступном порту.

Точка входа

Проверьте, правильная ли у вас ENTRYPOINT или CMD:

ENTRYPOINT ["node", "server.js"]


Если здесь опечатка или путь неверный, контейнер не запустится. Команда должна существовать и быть исполняемой.

Быстрая диагностика

Запустите контейнер интерактивно с sh вместо основного процесса:

docker run -it myapp:latest /bin/sh


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

Что проверить в первую очередь

1. Логи контейнера через docker logs
2. Переменные окружения и их значения
3. Рабочая директория и наличие файлов
4. Запуск приложения вручную внутри контейнера через /bin/sh
5. Права доступа и привилегии пользователя

Если контейнер падает, проблема почти всегда в одном из этих пунктов. Диагностика займёт несколько минут, если знать, где искать.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
📎 TLS в Ingress-NGINX: два режима с разным поведением при миграции

Тема TLS выглядит простой, но здесь тоже есть нюансы, которые проявляются только после переключения трафика на Gateway API.

Ingress-NGINX работает в двух принципиально разных режимах с TLS.

_Первый_ — терминирование на уровне контроллера: сертификат прикреплён к Ingress через секрет, контроллер расшифровывает трафик и передаёт бэкенду по HTTP. В Gateway API это настраивается через listeners[].tls.mode: Terminate с указанием certificateRefs в ресурсе Gateway.

_Второй_ — SSL passthrough через аннотацию nginx.ingress.kubernetes.io/ssl-passthrough: "true". Контроллер проксирует зашифрованный поток напрямую к поду, не расшифровывая его. В Gateway API для этого существует отдельный тип ресурса — TLSRoute. И здесь важный момент: при passthrough контроллер не видит HTTP-заголовки. Маршрутизация по пути или заголовкам недоступна — только по SNI.

Если в текущей конфигурации для одного хоста одновременно используются passthrough и HTTP-маршрутизация — это признак того, что архитектуру придётся пересматривать, а не просто переписывать манифесты.

Зафиксируйте для каждого хоста, какой режим TLS используется. Это определит не только синтаксис Gateway API, но и выбор реализации — не все из них поддерживают TLSRoute в полном объёме.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
DevOpsConf 2026: Фабрика инженерных решений

2–3 апреля, Москва. Главное событие для инженеров по автоматизации разработки, надежности и эксплуатации, архитекторов, системных администраторов, технических лидеров и ИТ-директоров.
В этом году всё иначе - мы пересобрали привычный лекторий в конструкторское бюро решений на DevOpsConf.

Над чем работаем:
🔹 Работа с наследием (легаси). Поток для тех, кому достался "черный ящик" без документации. Командная игра "Почини сломанную систему на скорость" + воркшоп по анализу древнего кода с помощью ИИ.
🔹 Наблюдаемость без паники. От метрик до архитектуры и борьбы с ложными алертами.
🔹 Как говорить с госорганами и бизнесом. Про 152-ФЗ, ФСТЭК и ГОСТы для инженеров, а также мастер-классы по питчингу решений для руководства.

Форматы: воркшопы, кейс‑игры, разбор инцидентов, экспертная зона.

👉 Изучить всю программу и забронировать билеты: https://tglink.io/3e56f4f5b86905?erid=2W5zFJBzVub
#реклама
О рекламодателе
1
💿 Прочитать диск без дисковода

Парень взял дешёвый USB микроскоп, посмотрел на старые диски и буквально прочитал текст, записанный на лазерном диске 40 лет назад.

На лазерном диске спиралью расположены микроскопические борозды. По ним лазер считывает данные. Под обычным микроскопом видны эти борозды, как полосы.

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

➡️ Смотреть видео

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM