DevOps: вопросы с ответами
41 разобранных вопросов по теме «DevOps». Каждый — с правильным ответом и пояснением.
- Allure: зачем и основные аннотации?
Наглядные отчёты с историей, вложениями, ретраями. @Step — шаг теста в отчёте. @Description — описание. @Severity — приоритет. @Epic/@Feature/@Story — иерархия. Allure.addAttachment — прикрепить запрос/ответ/скриншот.
- Что такое CI/CD pipeline?
checkout → build → test → docker build → push registry → deploy staging → (approval) → prod. В Яндексе: Arcadia CI + Nanny для деплоя.
- В чём разница: CI vs CD?
CI — автосборка+тесты при push. CD — Delivery (ручной деплой) или Deployment (автодеплой). Pipeline: checkout → build → test → docker build → push registry → deploy staging → (approval) → prod.
- В чём разница: CMD vs ENTRYPOINT?
ENTRYPOINT — основная исполняемая команда, сложно переопределить. CMD — аргументы по умолчанию, легко переопределить в docker run.
- В чём разница: ConfigMap vs Secret?
ConfigMap — не-секретная конфигурация. Secret — base64-encoded чувствительные данные. Оба монтируются как volumes или env vars.
- В чём разница: Declarative vs Scripted Pipeline?
Declarative — более структурированный, с фиксированным синтаксисом (pipeline { agent, stages }). Scripted — Groovy-код, более гибкий.
- Что такое docker-compose?
Инструмент для запуска нескольких связанных контейнеров одной командой через yaml. Типовой сценарий: приложение + БД + Redis + Kafka.
- В чём разница: Docker: образ vs контейнер. CMD vs ENTRYPOINT?
Образ: шаблон (класс). Контейнер: запущенный экземпляр (объект) с записываемым слоём. CMD: аргументы по умолчанию (легко переопределить в docker run). ENTRYPOINT: основная команда (сложнее переопределить). Обе задают, что выполнится при старте контейнера.
- Dockerfile: основные инструкции?
FROM (базовый образ), COPY/ADD, RUN, WORKDIR, EXPOSE, ENV, CMD/ENTRYPOINT, VOLUME, USER.
- ELK: как искать логи теста?
Elasticsearch хранит/индексирует, Kibana — UI для поиска с языком KQL. Фильтр: traceId + временной диапазон. KQL: level:ERROR AND service:payment. MDC: Mapped Diagnostic Context — traceId одинаков для всего запроса и проброшен между потоками, поэтому по нему удобно найти все логи одного теста.
- Jenkins Pipeline — что это?
Декларативный или scripted pipeline, описан в Jenkinsfile в корне репозитория. Этапы (stages): checkout, build, test, deploy.
- Kubernetes: Pod, Deployment, Service?
Pod — 1+ контейнер, общий network. Deployment — управляет ReplicaSet: реплики, rolling update, rollback. Service — стабильный IP/DNS: ClusterIP (внутренний), NodePort, LoadBalancer. Ingress — L7 маршрутизация.
- Linux: найти все ERROR за сегодня и посчитать?
grep "$(date +%Y-%m-%d)" app.log | grep -c "ERROR". find: find . -name "*.log" -mtime -1 (файлы за сутки). Уникальные IP: grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log | sort -u. tail -f app.log — для просмотра в реальном времени.
- В чём разница: Liveness vs Readiness probe?
Liveness: жив ли? Нет → перезапуск. Readiness: готов к трафику? Нет → убирается из балансировки. Spring Boot Actuator: /health/liveness, /health/readiness.
- В чём разница: Liveness vs Readiness vs Startup probe?
Liveness — жив ли? Нет → перезапуск. Readiness — готов к трафику? Нет → убирается из LB. Startup — для медленного старта: пока она не пройдёт, Liveness и Readiness не выполняются, а после успеха Startup больше не опрашивается. В Spring Boot Actuator доступны /actuator/health/liveness и /actuator/health/readiness.
- В чём разница: Merge vs Rebase в Git?
Merge: создаёт коммит-слияние, история ветвится (видно, откуда пришли изменения). Rebase: перемещает коммиты на вершину целевой ветки, даёт линейную историю, но переписывает SHA коммитов — поэтому rebase в публичных ветках делать не стоит (переписывает историю).
- Что такое Multi-stage build?
FROM maven:3.9 → сборка. FROM eclipse-temurin:21-jre → копируем только JAR. Финальный образ ~200 MB вместо ~800 MB. Безопаснее (меньше attack surface), быстрее деплой.
- Multi-stage build — зачем?
Собираешь в одном образе (с Maven/Gradle), а в финальный копируешь только JAR. Финальный образ маленький и без build-инструментов.
- Что такое Service типы в K8s?
ClusterIP (внутренний), NodePort (внешний на каждой ноде), LoadBalancer (облачный LB — именно это делает группа балансеров в VK).
- В чём разница: Surefire vs Failsafe — разница?
Surefire: запускает unit-тесты (*Test.java) на фазе test. Failsafe: запускает интеграционные (*IT.java) на фазе verify. Failsafe НЕ падает сразу при ошибке — доводит post-integration-test до конца (чтобы освободить ресурсы) и сигнализирует об ошибке только на фазе verify.
- В чём разница между CMD и ENTRYPOINT?
ENTRYPOINT задаёт основную исполняемую команду. CMD — аргументы по умолчанию. CMD легко переопределить при docker run, ENTRYPOINT — сложнее (через --entrypoint).
- Что такое Жизненный цикл Maven?
validate → compile → test → package → verify → install → deploy; каждая фаза выполняет все предыдущие. mvn test: прогоняет unit-тесты (Surefire plugin). mvn verify: прогоняет интеграционные (Failsafe plugin). install кладёт артефакт в локальный ~/.m2, deploy — в удалённый репозиторий.
- Зачем нужны Docker-образы в CI/CD?
Чтобы среда сборки была одинаковая на всех машинах. И на проде запускается тот же образ, что был протестирован.
- Как автотесты встраиваются в CI/CD pipeline?
1) Smoke-тесты: после каждого деплоя (быстрые, 5–10 кейсов). 2) Регрессия: на merge request или ночной запуск (полный набор). 3) Nightly: полная регрессия + отчёт Allure. Jenkins/GitLab CI → mvn verify → Allure report. Тесты разнесены по стадиям пирамиды: быстрые чаще, тяжёлые реже, чтобы фидбэк приходил рано.
- Как найти процесс, занявший порт?
lsof -i :8080 или ss -tulpn | grep 8080 или netstat -tulpn | grep 8080.
- Как откатить последний коммит?
git reset --soft HEAD~1 (оставит изменения), git reset --hard HEAD~1 (выкинет всё), git revert HEAD (создаст новый коммит, который отменит предыдущий — безопасно для общих веток).
- Как отправить сигнал процессу?
kill PID (SIGTERM, мягкое завершение), kill -9 PID (SIGKILL, жёсткое). Команда pkill/killall — по имени.
- Как посмотреть логи запущенного Java-процесса?
tail -f /var/log/app.log, или journalctl -u service-name -f, или через docker logs -f container.
- Какие команды Docker ты знаешь?
docker build, docker run, docker ps, docker logs, docker exec, docker stop, docker rm, docker images, docker pull/push.
- В чём разница: Образ (image) vs контейнер (container)?
Образ — неизменяемый шаблон (как класс). Контейнер — запущенный экземпляр образа (как объект). Из одного образа — много контейнеров.
- В чём разница: Образ vs контейнер?
Образ — неизменяемый шаблон из слоёв (каждая инструкция Dockerfile — слой). Контейнер — запущенный экземпляр с writable-слоем. docker images → образы, docker ps → контейнеры.
- Чем @Component отличается от @Service, @Repository, @Controller?
Технически почти ничем — все они помечают бин для регистрации в контексте. Но семантически: @Service — бизнес-логика, @Repository — работа с БД (плюс перевод исключений в DataAccessException), @Controller — веб-слой.
- Чем merge отличается от rebase?
merge создаёт коммит-слияние, история ветвится. rebase «переносит» коммиты твоей ветки поверх другой, делая историю линейной. Rebase в публичных ветках обычно делать не стоит.
- Чем образ (image) отличается от контейнера (container)?
Образ — шаблон, неизменяемый снимок (как класс). Контейнер — запущенный экземпляр образа (как объект). Из одного образа можно запустить много контейнеров.
- Чем отличается @Component, @Service, @Repository, @Controller?
Технически — все создают бин (синглтон по умолчанию). Семантически разные: @Repository — слой доступа к данным, Spring дополнительно оборачивает SQL/JPA исключения в DataAccessException. @Service — бизнес-логика, @Controller — веб-слой. Все они специализации @Component.
- Чем отличаются soft link и hard link?
Soft (ln -s) — указатель на путь, работает через каталоги. Hard — второе имя для того же inode, нельзя через каталоги и на другую файловую систему.
- Что делает git stash?
Откладывает незакоммиченные изменения «на полку», возвращая рабочую копию к чистому состоянию. Потом можно git stash pop.
- Что такое CI и CD?
CI (Continuous Integration) — автоматическая сборка, тесты, статический анализ при каждом push. CD (Continuous Delivery/Deployment) — автоматический деплой в среды.
- Что такое docker-compose?
Инструмент для запуска нескольких связанных контейнеров одной командой через yaml-файл. Обычно: приложение + БД + Redis.
- Что такое Dockerfile?
Текстовый файл с инструкциями для сборки образа: FROM (базовый образ), COPY, RUN, CMD/ENTRYPOINT и т.д.
- Что такое pipeline в GitLab/GitHub Actions?
Цепочка job'ов, выполняемых на runner'ах при определённых событиях (push, merge request). Описывается в .gitlab-ci.yml или .github/workflows/*.yml.