Изучение DevOps: основы, инструменты и практики

Курс знакомит с принципами DevOps и ключевыми практиками, которые ускоряют разработку и повышают надежность поставки. Вы изучите CI/CD, контейнеризацию, инфраструктуру как код, мониторинг и основы безопасности в DevOps-подходе.

1. DevOps-мышление: цели, культура и жизненный цикл разработки

DevOps-мышление: цели, культура и жизненный цикл разработки

Зачем вообще нужен DevOps

DevOps часто воспринимают как набор инструментов: CI/CD, контейнеры, Kubernetes, Terraform. На практике DevOps начинается не с инструментов, а с способа мышления и организации работы между разработкой и эксплуатацией.

DevOps помогает решить типичные проблемы IT-команд:

  • Медленные релизы из-за ручных процессов и сложных согласований
  • Конфликты между разработкой и эксплуатацией ("мы сделали — вы поддерживайте")
  • Нестабильность продакшена и рост числа инцидентов
  • Непредсказуемость сроков и качества поставки
  • Полезные определения (для ориентира):

  • Что такое DevOps (Microsoft Learn)
  • Что такое DevOps (AWS)
  • DevOps (Atlassian)
  • DevOps как система целей

    DevOps-мышление удобно рассматривать как фокус на трех результатах:

  • Скорость поставки изменений
  • Надежность и устойчивость сервиса
  • Качество взаимодействия людей и процессов
  • Важно: DevOps не означает "релизить чаще любой ценой". Цель — поставлять изменения быстро и безопасно.

    Как измеряют результат

    В индустрии распространены метрики, которые связывают инженерные практики и бизнес-результат. Самый известный набор — метрики DORA:

  • Частота деплоя
  • Время от коммита до продакшена (lead time)
  • Доля неуспешных изменений
  • Время восстановления после инцидента
  • Справка: DevOps Research and Assessment (DORA) на Google Cloud

    DevOps — это культура, а не отдел

    Ошибочная стратегия — создать "DevOps-отдел" и ожидать, что он магически решит проблемы релизов и эксплуатации. На практике DevOps работает, когда ответственность распределена правильно:

  • Команда разработки отвечает не только за написание кода, но и за то, как он работает в продакшене
  • Команда эксплуатации участвует в создании требований к надежности, наблюдаемости и автоматизации
  • Безопасность подключается как партнер по процессу (DevSecOps), а не как финальный "контролер" перед релизом
  • Ключевые культурные принципы

    Ниже — принципы, которые встречаются в большинстве успешных DevOps-трансформаций.

  • Общая ответственность за результат
  • Прозрачность и наблюдаемость (команда видит реальную картину работы сервиса)
  • Автоматизация всего повторяемого (сборки, тесты, деплой, проверки)
  • Маленькие изменения вместо больших релизов (легче тестировать, проще откатывать)
  • Непрерывное улучшение (ретроспективы, работа над причинами, а не симптомами)
  • Обучение на инцидентах без поиска виноватых (blameless подход)
  • Жизненный цикл разработки в DevOps

    DevOps обычно описывают как замкнутый цикл: от идеи до эксплуатации и обратно — через обратную связь.

    !Схема показывает DevOps как непрерывный цикл поставки и улучшения продукта

    Разберем этапы простыми словами.

    Планирование

    Здесь команда определяет:

  • Что именно нужно пользователям и бизнесу
  • Какие требования к надежности и безопасности важны
  • Как будет измеряться успех изменения (метрики, логи, алерты)
  • Результат этапа — понятные задачи и критерии готовности.

    Кодирование

    На этом этапе важно не только писать функциональность, но и закладывать эксплуатационные аспекты:

  • Конфигурация приложения и окружений
  • Логирование ключевых событий
  • Готовность к диагностике проблем
  • Обработка ошибок и таймаутов
  • Сборка

    Сборка превращает исходный код в артефакт, который можно развернуть:

  • пакет, контейнерный образ, бинарник
  • В DevOps сборка должна быть:

  • воспроизводимой
  • автоматизированной
  • одинаковой для всех окружений, насколько это возможно
  • Тестирование

    Смысл тестирования в DevOps — уменьшать риск изменений еще до продакшена:

  • автоматические тесты
  • проверки качества кода
  • проверки зависимостей
  • проверки инфраструктурных изменений (если они есть)
  • Релиз

    Релиз — это подготовка изменения к выкладке:

  • версии
  • release notes
  • управление фичами (например, через feature flags)
  • Важно различать:

  • Релиз — изменение подготовлено и оформлено
  • Деплой — изменение реально развернуто в окружении
  • Развертывание

    Цель этапа — безопасно доставить изменения в окружение (staging/production):

  • с минимальным ручным вмешательством
  • с понятным планом отката
  • с контролем качества после выкладки
  • Эксплуатация

    После выкладки сервис должен стабильно работать:

  • управление ресурсами
  • инциденты и устранение причин
  • обновления зависимостей и платформы
  • DevOps-мышление требует, чтобы эксплуатация была не "героической", а системной.

    Мониторинг и обратная связь

    Мониторинг дает ответы на вопросы:

  • Сервис доступен?
  • Пользователи достигают своих целей?
  • Есть деградация производительности?
  • Какие ошибки происходят чаще всего?
  • Обратная связь из мониторинга возвращается в планирование и влияет на следующие изменения.

    Как DevOps связывает разработку и эксплуатацию

    Ниже — упрощенное сравнение подходов.

    | Область | Традиционный подход (упрощенно) | DevOps-подход | |---|---|---| | Ответственность | Разработка "передает" в эксплуатацию | Совместная ответственность за работу сервиса | | Изменения | Редкие и большие релизы | Частые и небольшие изменения | | Процессы | Много ручных шагов | Максимум автоматизации | | Инциденты | Часто поиск виноватых | Разбор причин и улучшение системы | | Качество | Проверка "в конце" | Встроенное качество на каждом этапе |

    Типичные заблуждения о DevOps

  • "DevOps = человек, который настраивает CI/CD"
  • "DevOps = Kubernetes"
  • "DevOps отменяет ITSM и процессы"
  • "DevOps нужен только большим компаниям"
  • Правильнее так:

  • DevOps — это набор принципов и практик, которые улучшают поставку ценности
  • Инструменты важны, но они вторичны по отношению к культуре и процессам
  • Что будет дальше в курсе

    Эта статья заложила основу: DevOps как мышление, культура и жизненный цикл. Дальше логично перейти к практикам и инструментам, которые делают цикл реальным:

  • управление исходным кодом и стратегиями ветвления
  • CI (непрерывная интеграция) и построение пайплайнов
  • CD (непрерывная доставка/развертывание)
  • инфраструктура как код и управление окружениями
  • наблюдаемость: метрики, логи, трассировки и алертинг
  • 2. Linux, сети и Git: базовые навыки DevOps-инженера

    Linux, сети и Git: базовые навыки DevOps-инженера

    Зачем DevOps-инженеру базовые навыки, а не только инструменты

    В предыдущей статье курса мы разобрали DevOps как мышление: совместная ответственность, автоматизация, короткий цикл обратной связи и надежная поставка изменений. Чтобы эти принципы работали на практике, DevOps-инженеру нужны базовые навыки, которые встречаются в любой инфраструктуре и в любом стеке:

  • Linux как основная платформа серверов и контейнеров
  • Сети как основа доступности сервисов и диагностики инцидентов
  • Git как фундамент управления изменениями (код, конфигурации, инфраструктура)
  • Эта статья дает практическую базу: что нужно знать, какие команды использовать, и как мыслить при диагностике.

    Linux: минимальный набор, без которого сложно

    Терминал и файловая система

    DevOps-задачи почти всегда начинаются с терминала. Важно понимать, где вы находитесь, что лежит на диске, и как устроены пути.

    Ключевые понятия:

  • Абсолютный путь начинается с / (например, /etc/nginx/nginx.conf)
  • Относительный путь считается от текущей директории (например, ./app)
  • . означает текущую директорию, .. означает родительскую
  • Базовые команды:

    Практические заметки:

  • ls -la полезна тем, что показывает права, владельца и скрытые файлы.
  • rm -r удаляет директории рекурсивно: это одна из самых опасных команд, проверяйте путь дважды.
  • Поиск и просмотр информации

    В эксплуатации вы постоянно ищете: где лежит конфиг, какой процесс слушает порт, что написано в логах.

    Команды для поиска и просмотра:

    Подсказки:

  • less удобнее cat для больших файлов.
  • tail -f помогает наблюдать за логом в реальном времени.
  • grep -R ищет по дереву каталогов, часто применяется для конфигов.
  • Процессы и ресурсы

    Большая часть инцидентов выглядит как процесс упал, процесс завис, закончилась память, перегрузка CPU, заполнен диск.

    Команды для диагностики:

    Как это читать:

  • top показывает текущую нагрузку и процессы-лидеры по CPU/памяти.
  • free -h показывает состояние памяти (включая кэш).
  • df -h показывает заполненность файловых систем, а du помогает найти, кто съел место.
  • Права доступа и выполнение от имени другого пользователя

    В Linux почти все проблемы с доступом сводятся к модели: владелец, группа, остальные и права rwx.

    Пример вывода ls -l:

    Что это означает:

  • -rw-r-----:
  • - владелец может читать и писать (rw-) - группа может читать (r--) - остальные не имеют доступа (---)

    Полезные команды:

    Практическая идея: в DevOps лучше давать сервисам минимально необходимые права и избегать запуска всего от root.

    Справка по правам: Linux file permissions (Red Hat)

    Сервисы и systemd

    На современных дистрибутивах Linux сервисами часто управляет systemd.

    Базовые команды:

    Зачем это DevOps-инженеру:

  • быстро понять, запущен ли сервис
  • увидеть причину падения в журнале
  • перезапустить после изменений конфигурации
  • Справка: systemctl (freedesktop.org)

    Пакетные менеджеры и зависимости

    Частая задача: поставить утилиту для диагностики или обновить пакеты.

    Примеры:

    Важно помнить:

  • фиксируйте версии в инфраструктурных сценариях там, где важна воспроизводимость
  • в продакшене обновления делаются по процессу (окна, тестирование, откаты)
  • Сети: как думать и чем проверять

    Базовая модель: клиент, DNS, маршрут, порт, протокол

    Когда «не работает сервис», полезно разложить проблему на части:

  • Имя резолвится в IP через DNS?
  • Есть ли маршрут до IP (сетевой путь)?
  • Доступен ли нужный порт?
  • Правильный ли протокол (HTTP/HTTPS, TCP/UDP)?
  • Работает ли приложение на целевой машине и слушает ли оно порт?
  • !Диаграмма помогает запомнить, где искать причину, если сервис недоступен

    TCP и UDP простыми словами

  • TCP — соединение с подтверждениями доставки (обычно используется для HTTP/HTTPS, SSH, баз данных). Полезен, когда важна надежность.
  • UDP — без установления соединения, быстрее и проще, но без гарантий (часто используется для DNS, стриминга, некоторых метрик).
  • На практике для DevOps важно:

  • большинство проблем «не открывается сайт/не подключается база» — это TCP
  • проблемы с DNS — часто UDP (хотя DNS может работать и поверх TCP в отдельных случаях)
  • Справка: TCP (RFC 9293, IETF)

    DNS: почему «по имени не работает», а «по IP работает»

    DNS превращает доменное имя в IP. Типовые симптомы:

  • домен не резолвится
  • резолвится не туда (не тот IP)
  • резолвится то в один, то в другой IP, а один из них сломан
  • Команды:

    Справка по dig: dig (ISC BIND 9)

    IP, маршруты и «дойти до хоста»

    Если DNS дал IP, следующий шаг — проверить достижимость и маршрут.

    Команды:

    Интерпретация:

  • ping проверяет базовую достижимость (ICMP может быть запрещен, поэтому отсутствие ответа не всегда означает проблему).
  • traceroute показывает путь по узлам и помогает понять, где трафик «теряется».
  • Порты и сокеты: кто слушает и кто подключается

    Одна из самых полезных проверок: есть ли процесс, который слушает нужный порт.

    Команды:

    Что это дает:

  • ss -lntp покажет, что именно слушает порт (и PID процесса).
  • nc -vz проверит, открывается ли TCP-соединение.
  • curl -v покажет детали соединения и ответа сервера, что полезно при проблемах TLS и HTTP.
  • Справка: curl documentation

    Firewall и правила доступа

    Если сервис слушает порт, но снаружи не доступен, частая причина — правила firewall или security groups.

    В Linux вы встретите:

  • iptables (исторический интерфейс)
  • nftables (современная подсистема)
  • надстройки вроде ufw (Ubuntu) или firewalld (RHEL-подобные)
  • Минимальная проверка наличия ufw:

    Важно: в облаках доступность портов часто определяется двумя слоями — настройками ОС и правилами на уровне облачной сети.

    Git: управление изменениями как основа DevOps

    Зачем Git DevOps-инженеру

    DevOps работает, когда изменения контролируемы и воспроизводимы. Git используется не только для кода приложения:

  • пайплайны CI/CD хранятся в репозитории
  • инфраструктура как код (Terraform, Ansible, Helm) хранится в репозитории
  • конфигурации и политики часто версионируются
  • Справка: About Git (Git SCM)

    Основные сущности: репозиторий, коммит, ветка

  • Репозиторий — набор файлов и история изменений.
  • Коммит — фиксированное изменение с автором, временем и сообщением.
  • Ветка — указатель на цепочку коммитов, позволяющий параллельно развивать изменения.
  • Базовые команды:

    Практика сообщений коммитов:

  • пишите коротко и по делу: что изменилось и зачем
  • один коммит — одна логическая задача, чтобы было проще откатывать
  • Удаленный репозиторий и синхронизация

    Чаще всего вы работаете с удаленным репозиторием (GitHub/GitLab/Bitbucket).

    Ключевые команды:

    Разница, которую важно не путать:

  • fetch скачивает изменения, но не применяет их к вашей рабочей ветке
  • pull обычно делает fetch и затем пытается влить изменения в текущую ветку
  • Merge и rebase: что выбрать и почему

    Есть два базовых способа «подтянуть» изменения одной ветки в другую.

  • merge создает коммит слияния и сохраняет историю ветвления.
  • rebase переписывает историю вашей ветки так, как будто вы начинали от актуального состояния целевой ветки.
  • Практическое правило для начинающих:

  • для командной работы безопаснее использовать merge через Pull/Merge Request
  • rebase полезен локально, чтобы держать ветку аккуратной, но требует понимания последствий переписывания истории
  • Команды (упрощенно):

    Справка: Git merge (Git SCM docs)

    Конфликты: нормальная часть работы

    Конфликт — это ситуация, когда Git не может автоматически объединить изменения.

    Как действовать:

  • Посмотреть, какие файлы в конфликте: git status
  • Открыть файл и найти маркеры <<<<<<<, =======, >>>>>>>
  • Принять правильный вариант или объединить вручную
  • Отметить разрешение конфликта и завершить операцию:
  • Важно: конфликты легче решать, если изменения маленькие и частые — это напрямую поддерживает DevOps-подход из первой статьи.

    Теги и версии

    Теги помогают отмечать релизы.

    Это особенно полезно в CI/CD: пайплайн может собирать артефакты и деплоить их на основе тега.

    Как эти навыки связываются с DevOps-циклом

    Связь с жизненным циклом из предыдущей статьи выглядит так:

  • Планирование и разработка: изменения фиксируются в Git небольшими коммитами
  • Сборка и тестирование: выполняются в Linux-окружении (локально, на раннере CI, в контейнере)
  • Развертывание и эксплуатация: диагностика сервиса сводится к процессам, логам и сети
  • Мониторинг и обратная связь: инциденты часто начинаются с симптомов «недоступно» или «ошибка подключения», а значит нужно уметь быстро проверять DNS, маршруты и порты
  • Что дальше

    Дальше в курсе мы будем собирать эти навыки в единый рабочий процесс:

  • построение CI-пайплайнов (как автоматизировать сборку и тесты)
  • CD и стратегии деплоя (как выкладывать безопасно)
  • инфраструктура как код (как описывать окружения так же, как код)
  • Linux, сети и Git останутся вашими базовыми инструментами диагностики и управления изменениями на каждом следующем шаге.

    3. CI/CD: сборка, тестирование и автоматизация релизов

    CI/CD: сборка, тестирование и автоматизация релизов

    Как CI/CD связано с DevOps-мышлением и базовыми навыками

    В первой статье курса мы разобрали DevOps как способ работы: общая ответственность, автоматизация, маленькие изменения, быстрая обратная связь и надежность. Во второй статье закрепили базу DevOps-инженера: Linux, сети и Git.

    CI/CD объединяет это в практику:

  • Git хранит изменения и запускает автоматизацию по событиям (коммит, merge request, тег).
  • Linux чаще всего является средой, где выполняются сборка и тесты (на CI-раннере, в контейнере).
  • Сети важны для скачивания зависимостей, публикации артефактов, доступа к тестовым стендам и деплоя.
  • CI/CD отвечает на вопрос: как доставлять изменения быстро и безопасно, не полагаясь на ручные действия.

    Термины, которые нужно понимать с самого начала

  • CI (Continuous Integration, непрерывная интеграция) — частое добавление изменений в общий репозиторий с автоматической проверкой (сборка, тесты, линтеры).
  • CD бывает двух типов:
  • Continuous Delivery (непрерывная доставка) — изменения автоматически доходят до состояния «готово к выкладке», но выкладка в продакшен может требовать ручного подтверждения.
  • Continuous Deployment (непрерывное развертывание) — изменения автоматически выкладываются в продакшен, если прошли проверки.
  • Пайплайн (pipeline) — описанная последовательность шагов (джобы), которые выполняются автоматически.
  • Джоба (job) — конкретная задача (например, запустить тесты).
  • Стадия (stage) — группа джоб в пайплайне, обычно выполняются по порядку (например, сначала тесты, потом сборка, потом деплой).
  • Раннер (runner/agent) — машина или контейнер, где фактически запускаются джобы.
  • Артефакт (artifact) — результат сборки, который можно передать дальше (например, архив, контейнерный образ, пакет).
  • Окружение (environment) — среда развертывания (dev, staging, production).
  • Зачем CI/CD: от «работает у меня» к воспроизводимости

    Без CI/CD типичная цепочка выглядит так: разработчик собрал проект локально, вручную прогнал пару команд, передал в эксплуатацию, дальше «как-нибудь выкатим». Это плохо масштабируется и плохо воспроизводится.

    CI/CD делает процесс похожим на конвейер:

  • один и тот же сценарий выполняется одинаково для всех
  • результат можно повторить и объяснить
  • качество проверяется до продакшена
  • появляется измеримость (время сборки, время доставки, процент падений)
  • !Упрощенная карта того, как изменения проходят от Git до продакшена и возвращаются через обратную связь.

    Из чего состоит хороший CI

    Триггеры: когда запускать проверки

    Типовые события, которые запускают CI:

  • push в ветку (часто только для feature-веток)
  • создание или обновление merge request (pull request)
  • push тега (часто для релизной сборки)
  • Практическая цель: проверки должны срабатывать раньше, чем изменения попадут в основную ветку.

    Типовой набор проверок в CI

  • форматирование и линтинг (например, проверка стиля)
  • статический анализ (по возможности)
  • юнит-тесты
  • сборка
  • публикация артефактов
  • Важно: CI должен быть достаточно быстрым, иначе команда перестает ему доверять и начинает обходить.

    Артефакты и принцип «собрал один раз»

    Один из ключевых принципов надежной доставки:

  • сборка выполняется один раз
  • дальше по окружениям продвигается один и тот же артефакт
  • Это снижает риск ситуации, когда staging собран «по одному», а production — «по другому».

    Тестирование в CI/CD: что где уместно

    Пирамида тестов как практическая эвристика

    Полезная идея: делать много быстрых тестов и меньше дорогих.

  • юнит-тесты: быстрые, изолированные
  • интеграционные тесты: проверяют взаимодействие компонентов (например, приложение и база)
  • end-to-end (e2e): проверяют сценарии пользователя, обычно самые медленные и хрупкие
  • Если e2e-тестов слишком много, пайплайн замедляется, а диагностика усложняется.

    Где запускать разные тесты

  • в CI: юнит-тесты, линтеры, базовые интеграционные тесты (если поднимаются быстро)
  • в CD (staging): расширенные интеграционные и e2e, проверки миграций, smoke-тесты после деплоя
  • Quality gate: «ворота качества»

    Quality gate — правило, что без прохождения определенных проверок нельзя двигаться дальше.

    Примеры:

  • нельзя мержить без зеленого CI
  • нельзя деплоить без прохождения тестов staging
  • нельзя выпускать релиз без подписанного артефакта или без нужных сканов
  • CD: как автоматизировать релизы и деплой безопасно

    Delivery против Deployment

    Разница важна организационно:

  • Delivery подходит, когда нужен контроль окна выкладки, обязательные approvals или требования комплаенса.
  • Deployment подходит, когда команда и система готовы выкладывать часто и автоматически.
  • Окружения и продвижение

    Типовая схема:

  • dev: быстрые проверки, часто нестрогие
  • staging: максимально похоже на production, финальная проверка перед выкладкой
  • production: среда для пользователей
  • Продвижение означает: один и тот же артефакт проходит по окружениям с разными проверками.

    Стратегии развертывания

  • Rolling — обновление по частям (инстанс за инстансом).
  • Blue/Green — две среды, переключение трафика между ними.
  • Canary — выкладка на небольшой процент трафика с наблюдением метрик.
  • Выбор зависит от архитектуры, критичности сервиса и зрелости наблюдаемости.

    Откат и восстановление

    Автоматизация без плана отката опасна. Минимум, который стоит продумать:

  • что является «предыдущей стабильной версией» (тег, образ)
  • как быстро переключиться назад
  • какие проверки подтвердят, что система восстановилась
  • Безопасность в CI/CD: DevSecOps на практике

    Чтобы безопасность не была «финальным блокером», ее встраивают в пайплайн.

    Частые практики:

  • сканирование зависимостей на уязвимости
  • статический анализ кода (SAST) там, где он дает сигнал, а не шум
  • проверка секретов (чтобы токены не попадали в репозиторий)
  • минимизация прав CI-раннера и токенов доступа
  • Официальная документация по хорошим практикам управления секретами в пайплайнах:

  • Secrets в GitHub Actions
  • CI/CD variables в GitLab
  • Практический пример: минимальный CI на GitHub Actions

    Ниже пример пайплайна, который:

  • запускается на push и pull request
  • поднимает окружение Node.js
  • устанавливает зависимости
  • запускает линтер и тесты
  • Что здесь важно понимать:

  • on описывает события, которые запускают пайплайн.
  • jobs содержит джобы, которые выполняются на раннере.
  • runs-on задает тип раннера (в данном случае Linux).
  • steps — последовательность действий.
  • Документация:

  • GitHub Actions
  • Как связать CI/CD с наблюдаемостью и обратной связью

    CI/CD не заканчивается на деплое. DevOps-цикл замыкается через мониторинг и обратную связь:

  • после деплоя запускайте smoke-тест (быстрая проверка, что сервис жив)
  • отслеживайте ключевые метрики (ошибки, латентность, насыщение ресурсов)
  • связывайте релиз (версию/тег) с событиями в мониторинге
  • Это помогает отвечать на вопросы:

  • какая версия вызвала рост ошибок
  • когда именно началась деградация
  • насколько быстро команда может восстановиться
  • Типичные ошибки внедрения CI/CD

  • делать пайплайн слишком медленным и сложным на старте
  • хранить секреты в репозитории или в логах пайплайна
  • собирать заново на каждом окружении вместо продвижения артефакта
  • не иметь стратегий деплоя и отката
  • игнорировать flaky-тесты (нестабильные тесты), из-за которых «красный CI» перестает быть сигналом
  • Что дальше в курсе

    CI/CD — это основа автоматизации, но дальше обычно появляются два больших слоя:

  • инфраструктура как код: как создавать и менять окружения так же контролируемо, как код
  • контейнеризация и оркестрация: как стандартно упаковывать и запускать сервисы
  • В следующих темах мы будем собирать полноценную цепочку: Git → CI → артефакт → CD → окружения → наблюдаемость.

    4. Контейнеризация: Docker и основы Kubernetes

    Контейнеризация: Docker и основы Kubernetes

    Как контейнеризация продолжает тему CI/CD

    В предыдущей статье мы разобрали CI/CD как способ автоматически собирать, тестировать и продвигать изменения. Контейнеризация делает этот процесс воспроизводимым:

  • CI собирает одинаковый артефакт для всех окружений.
  • Docker-образ становится этим артефактом.
  • CD разворачивает один и тот же образ в dev/staging/production.
  • Kubernetes помогает запускать и масштабировать контейнеры устойчиво, с самоисцелением и управлением конфигурацией.
  • Идея проста: код + зависимости + настройки запуска упакованы так, чтобы работать одинаково в любой среде.

    Что такое контейнер

    Контейнер — это изолированный процесс в Linux, который:

  • имеет собственное файловое окружение (образ + слой изменений),
  • получает ограничения по ресурсам (CPU/память),
  • имеет отдельные сетевые пространства имен,
  • запускается по явно заданной команде.
  • В отличие от виртуальной машины, контейнер обычно не включает полноценную гостевую ОС, а использует ядро хоста.

    !Схема различий между VM и контейнером

    Docker: базовые понятия

    Образ и контейнер

  • Docker-образ — неизменяемый шаблон (read-only), из которого можно запускать контейнеры.
  • Контейнер — запущенный экземпляр образа с дополнительным записываемым слоем.
  • Практический вывод для DevOps:

  • образ удобно продвигать по окружениям как единый артефакт,
  • контейнеры должны быть максимально одноразовыми: легко запускаться заново без ручной настройки.
  • Официальная документация:

  • Docker Documentation
  • Регистр (registry)

    Чтобы CI/CD мог публиковать образы, а окружения могли их скачивать, используется регистр:

  • Docker Hub,
  • GitHub Container Registry,
  • GitLab Container Registry,
  • частные registry.
  • Спецификация формата образов в индустрии стандартизована OCI:

  • Open Container Initiative
  • Минимальные команды Docker для практики

    Работа с образами

  • pull скачивает образ.
  • images показывает локальные образы.
  • build собирает образ из Dockerfile.
  • Запуск контейнера

  • --rm удалит контейнер после остановки.
  • -p 8080:80 пробросит порт: с хоста 8080 в контейнер 80.
  • Полезная диагностика:

  • ps показывает запущенные контейнеры.
  • logs помогает читать логи (важно для эксплуатации).
  • exec позволяет зайти внутрь контейнера для быстрой проверки.
  • Dockerfile: как описать сборку образа

    Dockerfile — это инструкция для сборки образа. Типовой подход:

  • выбрать базовый образ,
  • скопировать исходники,
  • установить зависимости,
  • задать команду запуска.
  • Пример для простого веб-сервиса на Node.js:

    Что важно понимать:

  • FROM задает базовый слой.
  • WORKDIR задает рабочую директорию.
  • COPY переносит файлы в образ.
  • RUN выполняется при сборке образа.
  • CMD выполняется при старте контейнера.
  • Документация:

  • Dockerfile reference
  • Слои и кеш

    Сборка образов кешируется по шагам. Практические правила:

  • копируйте файлы зависимостей и ставьте зависимости до копирования всего проекта,
  • объединяйте команды там, где это оправдано,
  • избегайте лишних файлов в контексте сборки через .dockerignore.
  • Данные контейнеров: тома и bind mount

    Контейнеры удобны, когда они не хранят важные данные внутри собственного файлового слоя.

    Два частых варианта:

  • volume — управляется Docker, удобен для данных БД и кэшей.
  • bind mount — монтирует директорию хоста в контейнер, удобен для разработки.
  • Примеры:

    Документация:

  • Docker storage
  • Сеть в Docker: что нужно для DevOps-диагностики

    Контейнеры подключаются к сетям Docker. По умолчанию часто используется bridge-сеть.

    Практически полезно помнить:

  • -p hostPort:containerPort публикует порт наружу,
  • внутри одной docker-сети контейнеры могут обращаться друг к другу по имени (если вы используете Docker Compose),
  • диагностика сетевых проблем все равно опирается на базовые инструменты из статьи про сети: curl, ss, nc, DNS-резолвинг.
  • Документация:

  • Docker networking
  • Docker Compose: локальная среда из нескольких сервисов

    Docker Compose полезен, чтобы поднять несколько компонентов как единый стенд: приложение, БД, кеш.

    Минимальный пример compose.yaml:

    Запуск:

    Документация:

  • Docker Compose
  • Практики качества и безопасности контейнеров

    Принцип: один контейнер — один процесс

    Чаще всего контейнер проектируют так, чтобы основным был один процесс (например, nginx, java, node). Это упрощает:

  • мониторинг и логи,
  • перезапуск,
  • масштабирование.
  • Не запускать от root без необходимости

    Запуск от root внутри контейнера повышает риск при уязвимостях приложения. Практика — задавать пользователя.

    Документация:

  • Dockerfile USER
  • Закрепляйте версии

    Для воспроизводимости в CI/CD:

  • фиксируйте версии базовых образов (например, node:20-alpine вместо node:latest),
  • используйте теги релизов для своих образов.
  • Сканируйте образы

    Типовая часть DevSecOps — скан уязвимостей зависимостей и образов.

  • Trivy
  • Зачем нужен Kubernetes

    Docker решает упаковку и запуск контейнера. Но в продакшене обычно нужны дополнительные свойства:

  • несколько копий сервиса (масштабирование),
  • распределение нагрузки,
  • перезапуск упавших контейнеров,
  • безопасные обновления без простоя,
  • сервис-дискавери и работа с конфигурацией.
  • Kubernetes — платформа оркестрации контейнеров, которая стандартизирует эти задачи.

    Официальная документация:

  • Kubernetes Documentation
  • Архитектура Kubernetes очень простыми словами

    Kubernetes-кластер состоит из:

  • Control Plane: принимает желаемое состояние и управляет кластером.
  • Worker Nodes: машины, где реально запускаются ваши контейнеры.
  • Главная идея: вы описываете желаемое состояние (например, “3 реплики сервиса”), а Kubernetes стремится его поддерживать.

    !Схема основных компонентов Kubernetes

    Основные сущности Kubernetes, которые встречаются чаще всего

    Namespace

    Namespace — логическое разделение ресурсов внутри кластера. Часто используют для:

  • разделения сред (например, staging, production),
  • разделения команд.
  • Документация:

  • Namespaces
  • Pod

    Pod — минимальная единица запуска: один или несколько контейнеров, которые:

  • разделяют сеть (один IP на Pod),
  • могут разделять тома.
  • Обычно в Pod один основной контейнер приложения.

    Документация:

  • Pods
  • Deployment

    Deployment управляет набором Pod’ов и обновлениями.

    Что дает Deployment:

  • нужное количество реплик,
  • rolling update,
  • откат к предыдущей версии.
  • Документация:

  • Deployments
  • Пример минимального Deployment:

    Service

    Pod’ы могут пересоздаваться и менять IP. Service дает стабильную точку доступа и балансировку.

    Основные варианты:

  • ClusterIP: доступен только внутри кластера.
  • NodePort: открывает порт на каждой ноде.
  • LoadBalancer: интегрируется с облачным балансировщиком (если доступно).
  • Документация:

  • Service
  • Пример ClusterIP Service:

    Ingress

    Ingress обычно используется для входящего HTTP/HTTPS-трафика снаружи кластера (маршрутизация по доменам и путям). На практике нужен Ingress Controller.

    Документация:

  • Ingress
  • ConfigMap и Secret

    Настройки лучше не “зашивать” в образ.

  • ConfigMap — для несекретной конфигурации.
  • Secret — для чувствительных данных (токены, пароли), с учетом политики доступа.
  • Документация:

  • ConfigMaps
  • Secrets
  • kubectl: базовые команды для работы с кластером

    kubectl — основной CLI-клиент.

    Частые команды диагностики:

    Документация:

  • kubectl overview
  • Как Docker и Kubernetes связываются с CI/CD

    Типовой поток поставки выглядит так:

  • Изменение попадает в Git (коммит/merge request).
  • CI запускает тесты и сборку.
  • CI собирает Docker-образ, тегирует и пушит в registry.
  • CD обновляет манифесты Kubernetes (или значения Helm), применяет их в кластер.
  • Kubernetes делает rolling update и поддерживает нужное число реплик.
  • Мониторинг и логи подтверждают качество релиза.
  • Ключевой DevOps-принцип из предыдущей статьи про CI/CD здесь проявляется буквально: собрали один раз (образ) и продвигаем его дальше.

    Частые ошибки начинающих

  • Использовать latest для продакшена и потом не понимать, что именно запущено.
  • Хранить секреты в образе или в репозитории вместо Secret/хранилищ секретов.
  • Пытаться “лечить” контейнеры вручную вместо исправления описания (Dockerfile, манифесты).
  • Деплоить в Kubernetes без readiness/liveness проверок и без наблюдаемости.
  • Что дальше

    Контейнеризация и основы Kubernetes дают платформу для следующего уровня практик DevOps:

  • инфраструктура как код (создание кластеров, сетей, регистров и окружений повторяемо),
  • стратегии деплоя (canary/blue-green) на уровне оркестратора,
  • наблюдаемость контейнерных платформ (метрики, логи, трассировки).
  • 5. Инфраструктура как код: Terraform и управление конфигурациями

    Инфраструктура как код: Terraform и управление конфигурациями

    Зачем нужна инфраструктура как код в DevOps-цепочке

    В предыдущих статьях курса мы выстроили базовую линию DevOps:

  • DevOps-мышление требует быстрых и безопасных изменений.
  • Linux, сети и Git дают базовые навыки диагностики и управления изменениями.
  • CI/CD автоматизирует сборку, тестирование и доставку.
  • Контейнеризация стандартизирует упаковку и запуск.
  • Но остается критический вопрос: как создавать и менять сами окружения (сети, кластеры, базы, балансировщики, права доступа) так же контролируемо, как код приложения.

    Инфраструктура как код (IaC, Infrastructure as Code) — подход, при котором инфраструктура описывается декларативно в файлах, хранится в Git, проходит ревью и применяется автоматически (или полуавтоматически) через пайплайны.

    !Где IaC находится в общем DevOps-цикле

    Основные принципы IaC

    Чтобы IaC действительно работал, важны не столько инструменты, сколько принципы.

  • Декларативность: вы описываете желаемое состояние (например, “нужна сеть и 3 виртуальные машины”), а инструмент сам определяет, что создать или изменить.
  • Воспроизводимость: одно и то же описание должно приводить к одному и тому же результату.
  • Версионирование в Git: инфраструктура меняется через коммиты, pull/merge request и ревью.
  • Автоматизация применения: изменения применяются через пайплайн, а не вручную в консоли.
  • Минимум ручных правок: если что-то изменили в инфраструктуре, это должно быть отражено в IaC, иначе появится расхождение.
  • Ключевой эффект IaC — инфраструктура становится частью “продукта”, а не набором ручных настроек.

    Terraform: что это и почему он так популярен

    Terraform — инструмент для описания и применения инфраструктуры как кода. Он работает через провайдеры (providers), которые умеют управлять ресурсами конкретных платформ: облака, DNS, Kubernetes, базы данных как сервис, GitHub и т.д.

    Официальные источники:

  • Terraform Documentation
  • Terraform Language
  • Terraform Providers
  • Базовые термины Terraform

  • Provider (провайдер) — плагин для работы с API платформы.
  • Resource (ресурс) — то, чем Terraform управляет (виртуальная машина, сеть, DNS-запись).
  • Data source (источник данных) — чтение уже существующих данных (например, получить ID готовой сети).
  • Module (модуль) — переиспользуемый набор ресурсов с входами и выходами.
  • State (состояние) — файл (или удаленное хранилище), где Terraform хранит соответствие “ресурс в реальности ↔ ресурс в коде”.
  • Типовой рабочий цикл Terraform

    Terraform построен вокруг предсказуемого процесса.

  • terraform init
  • terraform fmt и terraform validate
  • terraform plan
  • terraform apply
  • Смысл шагов:

  • init скачивает провайдеры и настраивает backend (хранилище state).
  • fmt приводит код к стандартному форматированию.
  • validate проверяет базовую корректность конфигурации.
  • plan показывает, что изменится, но ничего не меняет.
  • apply применяет изменения.
  • Практика для DevOps: plan удобно запускать в CI на каждый merge request, а apply — только после ревью и подтверждения.

    Минимальный пример Terraform-конфигурации

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

    Что здесь важно:

  • variable задает входной параметр конфигурации.
  • output публикует результат (удобно для CI/CD или для следующих модулей).
  • Для реальной инфраструктуры добавляются provider и resource блоки конкретной платформы.

    Terraform state: почему без него нельзя

    Terraform должен понимать, какие объекты в реальности соответствуют ресурсам в коде. Для этого он хранит state.

    Что обычно хранится в state:

  • идентификаторы ресурсов в платформе (например, ID сети/инстанса),
  • часть атрибутов ресурса, которые нужны для вычисления изменений,
  • зависимости между ресурсами.
  • Ключевое следствие: state — чувствительная часть системы, потому что там могут оказаться значения, которые не должны быть публичными.

    Локальный state против удаленного

    Если state лежит локально на ноутбуке, командная работа быстро ломается: разные люди получают разные “истины”. Поэтому в командах используют удаленный backend.

    Удаленный backend решает несколько задач:

  • общий state для всей команды,
  • блокировки (locking), чтобы два человека не применили изменения одновременно,
  • аудит и управляемость.
  • Популярные варианты:

  • Terraform Cloud/Enterprise,
  • S3 + DynamoDB для блокировок (в AWS-практиках),
  • аналоги в других облаках.
  • Официальная документация по backends:

  • Terraform Backends
  • !Зачем нужен state и почему он должен быть общим

    Модули Terraform: как не утонуть в копипасте

    По мере роста инфраструктуры возникает повторяемость: сети, базовые политики, стандартные компоненты. Модули позволяют упаковать “шаблон инфраструктуры” и переиспользовать его.

    Практический смысл модулей:

  • снизить копипасту,
  • стандартизировать инфраструктуру,
  • скрыть сложность за простым интерфейсом (variables/outputs).
  • Официальная документация:

  • Terraform Modules
  • Рекомендация по стилю: модуль должен иметь понятные входы (переменные) и выходы, а внутри — реализовывать детали.

    Окружения: dev, staging, production без хаоса

    Окружения обычно отличаются:

  • размерами (меньше ресурсов в staging),
  • настройками доступов,
  • доменами, сертификатами,
  • иногда даже регионом.
  • Главная цель — чтобы staging был максимально похож на production, но дешевле и безопаснее.

    Практический подход для Terraform:

  • держать разный state для разных окружений,
  • использовать разные значения переменных,
  • применять изменения по отдельным пайплайнам.
  • Terraform предлагает механизм workspaces, но в реальных командах часто выбирают более явную структуру репозитория (например, отдельные директории на окружение), чтобы было сложнее ошибиться и “применить не туда”.

    Документация:

  • Terraform Workspaces
  • Управление конфигурациями: где заканчивается Terraform и начинается Ansible

    Terraform отлично подходит для создания инфраструктурных ресурсов. Но на практике нужно еще и настраивать то, что внутри:

  • пакеты,
  • конфиги сервисов,
  • пользователи и права,
  • параметры ОС,
  • раскладка файлов.
  • Для этого используют управление конфигурациями (configuration management). Один из популярных инструментов — Ansible.

    Официальные источники:

  • Ansible Documentation
  • В чем разница на практике

    | Задача | Terraform | Ansible | |---|---|---| | Создать сеть, балансировщик, ВМ, managed-сервис | Да | Обычно нет | | Описать связи ресурсов и зависимости | Да | Ограниченно | | Настроить пакеты и конфиги внутри серверов | Ограниченно | Да | | Работать через SSH на уже созданных хостах | Не основной сценарий | Да |

    Упрощенная ментальная модель:

  • Terraform отвечает за “что создать в платформе”.
  • Ansible отвечает за “как настроить хост после создания”.
  • Типовые комбинации

  • Terraform создает инфраструктуру (сети, ВМ, security groups), затем Ansible настраивает ПО на ВМ.
  • Terraform создает кластер Kubernetes и сопутствующие ресурсы, а приложение ставится в кластер через Helm/манифесты.
  • Вместо настройки серверов используют “запеченные образы” (image baking): образ собирается заранее (например, Packer), а Terraform лишь запускает готовые образы.
  • Выбор зависит от платформы и зрелости процессов, но общий DevOps-принцип один: меньше ручных действий, больше воспроизводимости.

    Секреты и чувствительные данные в IaC

    В IaC постоянно встречаются секреты: токены, пароли, ключи. Ошибки здесь особенно опасны.

    Правила, которые стоит принять как базовые:

  • не хранить секреты в репозитории,
  • не передавать секреты через открытые параметры командной строки,
  • хранить секреты в специализированных системах (например, Vault или секрет-хранилища облаков),
  • помнить, что Terraform state может содержать значения атрибутов, включая чувствительные.
  • Terraform умеет помечать значения как sensitive, чтобы они не выводились в консоль, но это не гарантирует, что значение не окажется в state.

    Документация:

  • Sensitive Data in Terraform
  • IaC в CI/CD: как сделать изменения инфраструктуры управляемыми

    Практика, которая хорошо ложится на DevOps-мышление из первых статей курса:

  • Изменение IaC идет через merge request.
  • CI запускает terraform fmt и terraform validate.
  • CI запускает terraform plan и публикует план как артефакт или комментарий.
  • После ревью и approval выполняется terraform apply (часто вручную подтверждаемым шагом пайплайна для production).
  • Это дает:

  • прозрачность изменений,
  • повторяемость,
  • контроль доступа,
  • меньший риск “случайных кликов” в облачной консоли.
  • Дополнительно полезные практики:

  • разделять права: пайплайн для plan может иметь более узкие права, чем пайплайн для apply,
  • логировать, кто и когда применил изменения,
  • периодически делать drift detection (проверять, что реальность не разошлась с описанием).
  • Типичные ошибки и рабочие практики

    Ошибки

  • “Правки в консоли, потому что быстрее” и забыли перенести в IaC.
  • Один общий state на все окружения.
  • Секреты в Git или секреты, утекшие в логи CI.
  • Отсутствие ревью на изменения инфраструктуры.
  • Слишком большие изменения одним коммитом, которые сложно проверить.
  • Практики

  • маленькие изменения и частые применения,
  • обязательный plan перед apply,
  • удаленный backend со lock,
  • модульность и стандартизация,
  • разделение окружений,
  • принцип наименьших привилегий для учеток Terraform и CI.
  • Что дальше в курсе

    Теперь у нас есть полный “скелет” DevOps-поставки:

  • Git как источник правды,
  • CI/CD как механизм автоматизации,
  • Docker/Kubernetes как стандартный runtime,
  • Terraform и управление конфигурациями как способ воспроизводимо создавать окружения.
  • Следующий логичный шаг — собрать это в единый практический процесс: от коммита до деплоя в Kubernetes, где инфраструктура и приложение развиваются согласованно, а наблюдаемость подтверждает качество изменений.

    6. Наблюдаемость: мониторинг, логирование и алертинг

    Наблюдаемость: мониторинг, логирование и алертинг

    Почему наблюдаемость — следующий обязательный слой после CI/CD, контейнеров и IaC

    В предыдущих статьях курса мы построили цепочку поставки:

  • Git фиксирует изменения и включает ревью.
  • CI/CD автоматизирует сборку, тесты и доставку.
  • Docker и Kubernetes стандартизируют запуск и обновления.
  • Terraform и управление конфигурациями делают окружения воспроизводимыми.
  • Но после деплоя остается главный вопрос эксплуатации: как быстро и точно понять, что происходит с системой, и как безопасно реагировать на проблемы.

    Наблюдаемость (observability) — это способность по данным о работе системы (телеметрии) отвечать на вопросы:

  • Сервис работает для пользователей?
  • Если нет — где именно проблема и почему?
  • Что изменилось перед деградацией (релиз, конфигурация, инфраструктура)?
  • Наблюдаемость замыкает DevOps-цикл: изменения выкатываются чаще, и без хорошего мониторинга, логов и алертов команда просто не сможет делать это быстро и безопасно.

    !Общая архитектура наблюдаемости: что собираем, куда отправляем и как используем

    Мониторинг и наблюдаемость: в чем разница

    Мониторинг обычно отвечает на вопрос что сломалось и где это видно (например, “ошибки 5xx выросли”).

    Наблюдаемость шире: она отвечает на вопрос почему и как это доказать данными, объединяя разные источники телеметрии и позволяя быстро проводить диагностику.

    Практическая формула для DevOps:

  • мониторинг без логов и трассировок часто дает только симптом;
  • наблюдаемость объединяет симптом и контекст, чтобы быстро найти причину.
  • Три основных сигнала: метрики, логи, трассировки

    Эти три источника часто называют “тремя столпами” наблюдаемости.

    Метрики

    Метрики — это числовые ряды во времени.

    Метрики отвечают на вопросы:

  • Как меняется нагрузка?
  • Есть ли деградация производительности?
  • Сколько ошибок и какого типа?
  • Хватает ли ресурсов?
  • Типовые примеры метрик:

  • RPS/QPS (запросы в секунду).
  • Ошибки 4xx/5xx.
  • Латентность (например, p95/p99).
  • CPU, память, диск, сетевой трафик.
  • Ключевое преимущество метрик: они быстрые для агрегации и удобны для алертинга.

    Реальные инструменты:

  • Prometheus
  • Grafana
  • Логи

    Логи — это события (обычно текстовые записи) с контекстом.

    Логи отвечают на вопросы:

  • Какие ошибки происходят прямо сейчас?
  • В каком месте кода или в каком запросе это случилось?
  • Какие входные параметры или идентификаторы были у проблемной операции?
  • Практическое правило: метрики показывают что ухудшилось, логи помогают понять почему.

    Реальные инструменты:

  • Grafana Loki
  • Elastic Stack
  • Трассировки

    Трассировки (distributed tracing) показывают путь одного запроса через несколько компонентов.

    Трассировки отвечают на вопросы:

  • Где именно “тормозит” запрос: в сервисе A, в сервисе B или в базе?
  • Какие зависимости дают основной вклад в задержку?
  • Где ошибка возникла в цепочке вызовов?
  • Важные термины:

  • Trace — весь путь запроса.
  • Span — один участок работы внутри trace (например, HTTP-запрос к соседнему сервису).
  • Реальные инструменты и стандарты:

  • OpenTelemetry
  • Jaeger
  • Что именно мониторить: от технических метрик к пользовательскому опыту

    Золотые сигналы

    Один из самых практичных подходов — мониторить “золотые сигналы” сервиса:

  • Латентность: как долго отвечаем.
  • Трафик: сколько запросов/задач обрабатываем.
  • Ошибки: доля неуспешных запросов.
  • Насыщение: насколько мы близки к пределам ресурсов.
  • Это помогает не распыляться на сотни метрик без смысла.

    SLI, SLO и SLA

    Чтобы алерты и дашборды были привязаны к реальности, вводят уровни сервиса.

  • SLI (Service Level Indicator) — измеряемый индикатор (например, доля успешных запросов).
  • SLO (Service Level Objective) — целевое значение SLI (например, 99.9% успешных запросов за 30 дней).
  • SLA (Service Level Agreement) — договорное обязательство перед клиентом (часто включает штрафы).
  • Практический смысл:

  • SLI/SLO нужны инженерам, чтобы понимать “достаточно ли хорошо работает сервис”.
  • SLA — юридический/бизнесовый уровень, который не стоит подменять инженерными алертами.
  • Источник, который хорошо вводит эти понятия:

  • Google SRE Book: Service Level Objectives
  • !Интуитивное объяснение SLO через бюджет ошибок

    Как строить алертинг, чтобы он помогал, а не мешал

    Алерт — это просьба о действии

    Хороший алерт должен отвечать на три вопроса:

  • Что сломалось?
  • Насколько это срочно?
  • Что делать прямо сейчас?
  • Если алерт не приводит к действию, это шум.

    Симптомы против причин

    Обычно лучше алертить на симптомы, влияющие на пользователя, а причины использовать для диагностики.

    Примеры:

  • Симптом: рост доли 5xx, рост латентности, падение доступности.
  • Причина: CPU 100%, кончились соединения в пуле, проблемы с DNS.
  • Причины часто дают много ложных срабатываний: CPU может быть высоким, но сервис при этом работает нормально.

    Severity и маршрутизация

    На практике вводят уровни критичности (примерная логика):

  • Critical: пользователи массово не могут пользоваться сервисом, нужен немедленный ответ.
  • Warning: есть деградация или риск, требуется реакция в рабочее время.
  • Маршрутизация алертов обычно идет через диспетчеризацию.

    Реальный инструмент экосистемы Prometheus:

  • Alertmanager
  • Борьба с “алерт-усталостью”

    Типовые причины шума:

  • алерты на причины вместо симптомов;
  • слишком чувствительные пороги;
  • нет группировки и подавления повторов;
  • нет владельца алерта и runbook.
  • Полезная практика: каждый алерт должен иметь “owner” и ссылку на инструкции.

    Практики логирования для эксплуатации

    Структурированные логи

    Для современных систем логирование лучше делать структурированным, обычно в JSON.

    Зачем это нужно:

  • проще фильтровать и агрегировать;
  • проще строить дешевые запросы “покажи все ошибки типа X”;
  • проще коррелировать с трассировками.
  • Минимально полезные поля лога:

  • timestamp
  • level
  • service
  • environment
  • message
  • request_id или trace_id
  • Корреляция: связать метрики, логи и трассы

    Ключ к быстрой диагностике — общий идентификатор запроса.

    Практика:

  • в HTTP добавляют заголовок корреляции (часто X-Request-Id);
  • для трассировок используют trace_id и span_id;
  • эти идентификаторы пишут в логи.
  • Тогда сценарий диагностики становится прямым:

  • алерт показывает рост ошибок;
  • по дашборду видно, какой endpoint деградирует;
  • по trace_id находите медленный участок;
  • логи по trace_id показывают контекст ошибки.
  • Не логируйте секреты

    Нельзя писать в логи:

  • пароли и токены;
  • номера карт и персональные данные;
  • приватные ключи.
  • Это одновременно риск безопасности и комплаенса, и это плохо сочетается с централизованным сбором логов.

    Наблюдаемость в Kubernetes: что добавляется поверх контейнеров

    Kubernetes дает новые сущности и новые классы проблем, поэтому наблюдаемость тоже “расширяется”.

    Что полезно мониторить в кластере:

  • состояние Pod’ов (CrashLoopBackOff, OOMKilled);
  • рестарты контейнеров;
  • нагрузку и saturation нод;
  • ошибки на Ingress/балансировщике;
  • задержки и ошибки между сервисами.
  • Минимальная диагностика часто начинается с kubectl, а затем продолжается в системах наблюдаемости:

    Смысл DevOps-подхода здесь тот же: не “чинить руками”, а находить причину и исправлять через код, манифесты и пайплайны.

    Как связать наблюдаемость с релизами и IaC

    Привязка к версии

    Чтобы понимать “какой релиз сломал метрики”, важно везде иметь версию:

  • тег Docker-образа (например, 1.4.2);
  • метка в Kubernetes (например, app.kubernetes.io/version);
  • поле версии в метриках и логах.
  • Тогда на графике можно увидеть корреляцию “после релиза X выросли 5xx”.

    Изменения наблюдаемости тоже должны быть кодом

    Как и инфраструктура, наблюдаемость должна жить как код:

  • дашборды версионируются;
  • правила алертинга проходят ревью;
  • конфиги сборщиков логов/метрик управляются через IaC.
  • Это снижает риск “магических ручных настроек”, которые никто не помнит.

    Минимальный практический стек (пример) и роль каждого компонента

    | Задача | Что обычно используют | Роль | |---|---|---| | Сбор и хранение метрик | Prometheus | Скрапит метрики и хранит временные ряды | | Визуализация | Grafana | Дашборды и единая точка обзора | | Алертинг | Alertmanager | Группировка, маршрутизация, подавление алертов | | Централизованные логи | Loki или Elastic | Поиск по логам, разбор инцидентов | | Трассировки | Jaeger (или совместимые бэкенды) | Диагностика распределенных запросов | | Инструментация | OpenTelemetry | Единый стандарт генерации телеметрии |

    Важно: выбор инструментов вторичен по отношению к принципам. Плохие алерты останутся плохими даже в “самом правильном” стеке.

    Типичные ошибки при внедрении наблюдаемости

  • Алертят на CPU вместо пользовательских симптомов.
  • Ставят слишком много алертов без владельцев и инструкций.
  • Логи неструктурированные и без корреляционных идентификаторов.
  • Метрик слишком много, но нет ключевых (ошибки, латентность, доступность).
  • Не связывают релизы с метриками и инцидентами.
  • Пытаются решать инциденты “внутри контейнера руками”, а не исправлять причину через код.
  • Что дальше

    С этого момента элементы курса складываются в замкнутый процесс:

  • CI/CD доставляет изменения.
  • Docker/Kubernetes запускают их воспроизводимо.
  • IaC гарантирует контролируемые окружения.
  • Наблюдаемость показывает реальное качество и замыкает обратную связь.
  • Дальнейшее развитие обычно идет в сторону практик надежности:

  • более строгие SLO и работа с бюджетом ошибок;
  • стратегии деплоя (canary/blue-green) с автоматическими проверками метрик;
  • улучшение диагностики через трассировки и корреляцию событий.
  • 7. DevSecOps: безопасность, секреты и надежность в продакшене

    DevSecOps: безопасность, секреты и надежность в продакшене

    Как DevSecOps продолжает цепочку DevOps из предыдущих тем

    В этом курсе мы уже собрали основу практического DevOps:

  • DevOps-мышление и цикл поставки изменений
  • Linux, сети и Git как база
  • CI/CD как механизм автоматизации
  • Docker и Kubernetes как стандартный runtime
  • IaC (Terraform) как способ воспроизводимо создавать окружения
  • наблюдаемость как способ понимать, что происходит после деплоя
  • DevSecOps добавляет недостающий слой: как встроить безопасность в этот же поток поставки, чтобы она не превращалась в «финальный ручной барьер», а стала частью ежедневной инженерной работы.

    Практическая цель DevSecOps в продакшене:

  • снижать риск уязвимостей и утечек
  • делать изменения безопаснее без замедления поставки
  • повышать надежность (многие инциденты начинаются с проблем безопасности: компрометация, неверные права, утечки ключей, DDoS)
  • !Где именно безопасность встраивается в DevOps-поток

    Базовая идея DevSecOps

    DevSecOps обычно понимают так:

  • безопасность участвует с самого начала (требования, дизайн, реализация)
  • проверки автоматизируются и становятся частью CI/CD
  • ответственность разделена: безопасность не «отдельная команда, которая запрещает», а партнерство разработки, эксплуатации и security
  • Полезные ориентиры:

  • OWASP Top 10
  • NIST Secure Software Development Framework (SSDF)
  • Модель угроз: минимальный подход, который должен уметь DevOps

    Без попытки «стать пентестером» важно уметь отвечать на два вопроса:

  • что мы защищаем (активы)
  • от чего защищаем (угрозы и вероятные ошибки)
  • Типовые активы в продакшене

  • Данные пользователей (персональные данные, платежи, контент)
  • Учетные данные и секреты (токены, пароли, ключи)
  • CI/CD и репозитории (как путь доставки к продакшену)
  • Инфраструктура (облако, Kubernetes-кластер, сети)
  • Репутация и доступность (простои и утечки обычно дороже багов)
  • Типовые угрозы, которые регулярно встречаются

  • Утечка секретов в Git, логи или артефакты сборки
  • Уязвимые зависимости и контейнерные образы
  • Ошибочные права доступа (слишком широкие роли в облаке или Kubernetes)
  • Компрометация CI-раннера или токенов доступа
  • Необновленные компоненты (уязвимости в базе, ОС, ingress-контроллере)
  • Ссылки по базовым концепциям:

  • OWASP Cheat Sheet Series
  • Секреты: как не превратить продакшен в утечку

    Секрет — это значение, которое дает доступ: пароль, API-токен, приватный ключ, cookie signing key и т.д.

    Главная мысль: секреты должны жить в специализированных механизмах, а не в репозитории, не в Dockerfile и не в переменных, которые печатаются в логи.

    Типовые ошибки управления секретами

  • Секрет в репозитории (даже в закрытом)
  • Секрет в Dockerfile через ENV
  • Секрет в CI-логах (например, команда печатает переменные)
  • Один и тот же секрет для dev/staging/production
  • «Долгоживущие» ключи без ротации
  • Правила, которые стоит принять как стандарт

  • Секреты не хранятся в Git (даже в зашифрованном виде без процесса ключей)
  • Секреты не попадают в артефакты (образы, архивы)
  • Доступ по принципу наименьших привилегий (минимальные права, минимальные области)
  • Ротация секретов (по процессу и при инцидентах)
  • Где хранить секреты на практике

    Варианты зависят от платформы и зрелости команды.

    | Подход | Где секрет | Плюсы | Риски и ограничения | |---|---|---|---| | Секреты CI/CD (например, secrets в GitHub/GitLab) | В хранилище платформы CI | Быстро стартовать | Важно ограничивать доступ workflow/раннеров | | Vault | Централизованное хранилище секретов | Ротация, политики доступа, аудит | Требует поддержки и дисциплины | | Облачные секрет-хранилища | Managed-сервис облака | Интеграция с IAM, аудит | Завязка на провайдера | | Kubernetes Secrets | Внутри кластера | Удобно для runtime | Требует контроля доступа, шифрования и практик |

    Официальные ссылки:

  • HashiCorp Vault Documentation
  • AWS Secrets Manager
  • Kubernetes Secrets
  • GitHub Actions encrypted secrets
  • Kubernetes Secrets: что важно понимать

    Kubernetes Secret — это объект, который хранит секретные данные и позволяет передавать их в Pod (например, как переменные окружения или файлы).

    Практически важные моменты:

  • Secret сам по себе не означает «идеально безопасно»
  • Нужно ограничивать доступ к Secret через RBAC
  • Важно включать шифрование Secret в etcd (если вы управляете кластером)
  • Справка:

  • Kubernetes: Encrypting Secret Data at Rest
  • !Как секрет безопасно проходит путь до приложения

    Безопасность цепочки поставки: от зависимостей до подписи артефактов

    Современные атаки часто идут не «в лоб» на продакшен, а через цепочку поставки:

  • вредоносная библиотека
  • компрометированный registry
  • подмена артефакта
  • уязвимость в базовом образе
  • SBOM: что это и зачем

    SBOM (Software Bill of Materials) — это список компонентов, из которых состоит ваш артефакт (зависимости приложения, пакеты ОС в образе и т.д.).

    Зачем SBOM:

  • быстрее понять, затронуты ли вы новой уязвимостью
  • облегчить аудит и комплаенс
  • связать артефакт с точным набором компонентов
  • Ориентир:

  • NTIA: Software Bill of Materials
  • Подпись артефактов и проверяемое происхождение

    Если вы собираете Docker-образы в CI и разворачиваете их в Kubernetes, важно отвечать на вопрос:

  • этот образ действительно собран вашим пайплайном из вашего репозитория?
  • Подходы:

  • подпись образов
  • хранение аттестаций сборки
  • Практический инструмент в экосистеме:

  • Sigstore
  • cosign (GitHub)
  • SLSA: уровень зрелости защиты supply chain

    SLSA (Supply-chain Levels for Software Artifacts) — это набор рекомендаций, как строить процесс сборки и доставки так, чтобы сложнее было подменить исходники или артефакты.

    Официальный ресурс:

  • SLSA Framework
  • Security-gates в CI/CD: что реально стоит автоматизировать

    В статье про CI/CD мы говорили про quality gates. В DevSecOps добавляются security gates — такие же автоматические «ворота», но по безопасности.

    Базовый набор проверок, который часто дает максимальный эффект

  • Проверка утечек секретов в репозитории
  • Сканирование зависимостей на уязвимости
  • Сканирование контейнерного образа
  • Минимальные policy-checks для IaC и Kubernetes-манифестов
  • Важно: автоматизация должна давать сигнал, а не шум. Если проверка постоянно ложноположительная и команда ее игнорирует, она перестает быть защитой.

    Примеры официальных практик по hardening CI:

  • GitHub Actions: Security hardening
  • Контейнеры и Kubernetes: безопасный запуск в продакшене

    Контейнеризация из прошлой темы дает воспроизводимый runtime, но сама по себе не делает систему безопасной. В продакшене важны настройки запуска.

    Минимальные практики безопасности контейнеров

  • Не запускать приложение от root, если нет необходимости
  • Фиксировать версии базовых образов, избегать latest
  • Минимизировать размер образа и поверхность атаки
  • Сканировать образы на уязвимости до деплоя
  • Ориентир по теме:

  • Docker Security
  • Kubernetes: RBAC, изоляция и политики

    RBAC (Role-Based Access Control) — модель прав доступа в Kubernetes: кто и что может делать (читать секреты, создавать Pod’ы, менять deployments).

    Практики, которые чаще всего критичны:

  • Ограничивать права сервисных аккаунтов в namespace
  • Ограничивать, кто может читать Secrets
  • Использовать политики безопасности, чтобы запретить опасные параметры Pod’ов (например, привилегированный режим)
  • Официальные ссылки:

  • Kubernetes RBAC
  • Kubernetes Pod Security Standards
  • IaC и безопасность: как не «разрешить все» одним коммитом

    Инфраструктура как код делает изменения воспроизводимыми, но добавляет риск: ошибка в коде может быстро попасть во все окружения.

    Типовые ошибки в IaC, которые приводят к инцидентам

  • Открытые security groups и доступ к административным портам из интернета
  • Публичные бакеты/хранилища данных
  • Слишком широкие IAM-права для сервисов и пайплайнов
  • Отсутствие разделения окружений и state
  • Policy as Code

    Policy as Code — подход, при котором правила безопасности описываются как код и применяются автоматически при ревью и в CI.

    Один из распространенных стандартов для политик:

  • Open Policy Agent
  • Практический формат применения:

  • политики проверяют Terraform-планы и Kubernetes-манифесты
  • при нарушении правил пайплайн падает или требует дополнительного approval
  • Безопасность и надежность: почему это одно и то же в продакшене

    В статье про наблюдаемость мы обсуждали метрики, логи, трассировки и алертинг. В DevSecOps это расширяется до идеи:

  • безопасность тоже должна быть наблюдаемой
  • безопасность должна иметь реакции и runbook так же, как эксплуатационные инциденты
  • Что мониторить с точки зрения безопасности

  • Аномальные попытки входа и рост ошибок авторизации
  • Резкий рост 4xx/5xx на публичных точках (возможные атаки или деградации)
  • Неожиданные изменения прав доступа
  • Подозрительные запросы к секретам
  • Инциденты: базовая дисциплина

    Чтобы безопасно жить с частыми релизами, важно иметь минимальный процесс реакции:

  • Классификация критичности (что считается security-инцидентом)
  • Канал эскалации и ответственные
  • Runbook: что делать в первые 15 минут
  • Пост-инцидентный разбор причин и улучшения пайплайна, конфигурации, политик
  • Ориентир по инженерному подходу к инцидентам и постмортемам:

  • Google SRE Book
  • Практический чек-лист DevSecOps для команды

  • Git и ревью
  • обязательные pull/merge request
  • запрет прямых пушей в main
  • CODEOWNERS для критичных областей (инфраструктура, пайплайны)
  • CI/CD
  • проверка утечек секретов
  • сканирование зависимостей и образов
  • сборка одного артефакта и продвижение по окружениям
  • минимальные права токенов CI
  • Kubernetes и runtime
  • least privilege в RBAC
  • запрет запуска привилегированных Pod’ов без исключений
  • секреты через безопасный механизм и ограниченный доступ
  • IaC
  • plan в CI и apply после ревью
  • разделение окружений и state
  • policy as code для типовых рисков
  • Наблюдаемость и реакция
  • алерты на симптомы, влияющие на пользователей
  • события безопасности и аудит
  • runbook и регулярные учения
  • Что дальше

    Эта тема завершает «скелет» практического DevOps и делает его пригодным для продакшена:

  • CI/CD ускоряет доставку
  • контейнеры и Kubernetes стандартизируют запуск
  • IaC делает окружения воспроизводимыми
  • наблюдаемость дает обратную связь
  • DevSecOps снижает риск и повышает надежность, встраивая безопасность в тот же поток
  • Дальнейшее развитие обычно идет в сторону более зрелых практик:

  • постепенные деплои с автоматическим откатом по метрикам
  • более строгие SLO и управление риском через бюджет ошибок
  • повышение зрелости supply chain: подписи, аттестации, SBOM как стандарт для каждого релиза