DevOps / SRE / DevSecOps: вопросы и ответы

Гайд, который можно открыть перед техническим собеседованием

Содержание

  1. Модель ОС и Linux
  2. Сети
  3. Git
  4. Docker и контейнеры
  5. Kubernetes
  6. CI/CD
  7. Ansible и Terraform
  8. Мониторинг и наблюдаемость
  9. SRE: надёжность и процессы
  10. DevSecOps: безопасность
  11. Каверзные вопросы
  12. Поведенческие вопросы
  13. Как отвечать на собеседовании

1. Модель ОС и Linux

Пользовательское пространство (user space) приложения: nginx, python, bash, kubectl, ваш сервис Системные вызовы (syscalls) read, write, open, fork, execve, socket: единственный «мост» в ядро Ядро (kernel) планировщик, память, файловые системы, сеть, драйверы Железо: CPU, RAM, диск, сетевая карта
Упрощённая модель: приложения не работают с железом напрямую, они обращаются к ядру через системные вызовы
Чем отличаются user space и kernel space и почему это важно?

Ядро работает в привилегированном режиме и управляет железом. Пользовательские программы работают в ограниченном режиме и обращаются к ядру через системные вызовы. Если программа падает, обычно падает только она, а не вся система. Если же падает ядро, это kernel panic.

Практическое значение: когда вы видите, что процесс «висит», важно понять, где он застрял, в коде приложения или в вызове ядра. Это делается через strace или состояние процесса в ps.

Что такое процесс и поток? Чем отличается fork от exec?
  • Процесс — запущенная программа со своим адресным пространством и набором ресурсов (файловых дескрипторов, PID).
  • Поток — ветка выполнения внутри процесса. Потоки одного процесса делят память.
  • fork() создаёт копию текущего процесса с новым PID.
  • exec() заменяет содержимое процесса новой программой, PID остаётся прежним.

Так работает запуск команд в shell: сначала fork, затем exec.

Какие бывают состояния процессов?
КодСостояниеЧто значит
RRunning / RunnableВыполняется или ждёт процессора
SSleeping (interruptible)Ждёт события, например ответа сети. Обычное состояние
DUninterruptible sleepЖдёт ввода-вывода, прервать нельзя. Частая причина высокого load average
TStoppedОстановлен сигналом, например Ctrl+Z
ZZombieЗавершился, но родитель не забрал его статус через wait()
Что такое load average и как его правильно читать?

Load average показывает среднюю длину очереди задач за 1, 5 и 15 минут. В очередь попадают процессы в состоянии R и D.

  • Сравнивайте значение с количеством ядер (nproc). Load 4 на 4 ядрах — система загружена полностью, load 8 — перегружена.
  • Высокий load при низком CPU часто означает ожидание диска (состояние D). Смотрите iostat -x 1 или vmstat 1.
  • Рост 1-минутного load при стабильном 15-минутном — всплеск. Рост всех трёх — длительная проблема.
uptime              # load average
nproc               # количество ядер
vmstat 1 5          # поле wa — ожидание I/O, поле r — очередь
iostat -x 1         # загрузка дисков
Как смотреть использование CPU и памяти? Что такое top, и как читать его вывод?

top — интерактивный монитор процессов. Важные поля:

  • us — CPU в пользовательских программах; sy — CPU в ядре;
  • wa — CPU простаивает в ожидании диска. Высокое значение — проблема с I/O;
  • st — steal time, в виртуалке значит, что гипервизор отбирает CPU;
  • RES — реально занятая физическая память процессом; VIRT — виртуальный размер, обычно сильно больше и мало о чём говорит;
  • %MEM, %CPU — доля ресурсов.

Горячие клавиши: 1 — показать каждое ядро, M — сортировка по памяти, P — по CPU, k — убить процесс.

ЛайфхакВместо top на сервере чаще используют htop (удобнее) или btop. На проде для быстрой картины подойдёт top -bn1 | head -20.
Чем free отличается от available? Почему память «кончилась», хотя free почти нулевой?

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

  • free — полностью свободная память, она почти всегда мала. Это не признак проблемы.
  • available — оценка того, сколько памяти можно выделить новым приложениям без свопа. Смотрите на это значение.
free -h
# колонка available — главное число
Что такое OOM killer и почему процесс внезапно умирает с кодом 137?

Когда памяти не хватает, ядро вызывает OOM killer и убивает процесс с наибольшим «весом». Код выхода 137 = 128 + 9 (SIGKILL). В контейнерах это частая история: процесс упёрся в memory limit.

dmesg -T | grep -i "killed process"
journalctl -k | grep -i oom
Как найти, кто занимает место на диске, если df показывает 100%, а du не видит такого объёма?

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

df -h                     # общий объём и заполненность
du -xh / --max-depth=1 | sort -h | tail   # крупнейшие каталоги
lsof +L1                  # удалённые, но открытые файлы

Решение: перезапустить процесс или очистить лог через truncate -s 0 файл, если он ещё нужен.

Ещё одна частая причинаКончились inode, а не место: df -i. Тогда много мелких файлов, например в каталоге сессий или кэша.
Какие сигналы бывают? Чем kill отличается от kill -9?
  • SIGTERM (15) — мягкая просьба завершиться. Процесс может корректно закрыть соединения. Это значение по умолчанию у kill.
  • SIGKILL (9) — принудительное завершение, процесс не может его перехватить. Использовать только если SIGTERM не помог.
  • SIGHUP (1) — часто используется, чтобы перечитать конфиг (например, nginx).
  • SIGINT (2) — Ctrl+C.
ОсторожноSIGKILL не даёт процессу записать данные и освободить ресурсы. Всегда сначала пробуйте SIGTERM.
Что такое zombie-процесс и как от него избавиться?

Zombie — это процесс, который завершился, но его родитель не вызвал wait() и не забрал код возврата. Сам зомби не занимает CPU и память, но занимает запись в таблице процессов.

Избавиться можно, исправив родительский процесс или перезапустив его. Убить зомби через kill нельзя, он уже мёртв.

Какие права доступа у файлов и что делает chmod 755 или chown?

Права делятся на три группы: владелец, группа, остальные. Каждая группа имеет r (4), w (2) и x (1).

  • chmod 755 file — владелец rwx, группа и остальные rx;
  • chmod 600 key.pem — только владелец читает и пишет (так и должны храниться ключи);
  • chown user:group file — смена владельца.

Для каталогов x означает право войти в каталог.

Что такое inode и чем он отличается от имени файла?

Inode хранит метаданные файла: владельца, права, размер, адреса блоков на диске. Имя файла — это просто ссылка на inode, которая лежит в каталоге. Поэтому одно и то же содержимое может иметь несколько имён (hard link).

Hard link и symbolic link: hard link указывает на тот же inode, symlink — на путь. Если удалить исходный файл, symlink станет битым.

Как посмотреть, какие порты слушает сервер и какой процесс их занимает?
ss -tulpn          # современная замена netstat
# -t tcp, -u udp, -l слушающие, -p процесс, -n без DNS

Команда lsof -i :80 показывает то же самое для конкретного порта.

Как работают systemd-сервисы и где смотреть логи?
systemctl status nginx          # состояние и последние строки лога
systemctl restart nginx
systemctl enable nginx          # автозапуск
journalctl -u nginx -f          # логи сервиса в реальном времени
journalctl -u nginx --since "1 hour ago"
Что такое переменные окружения, PATH и почему cron работает иначе, чем ваш терминал?

Cron запускает задачи с минимальным окружением: без вашего PATH, без профиля shell. Поэтому команда, которая работает в терминале, в cron может «не найтись». Решение: указывать полные пути (/usr/bin/python3) или явно задавать PATH в crontab.

Что такое file descriptor и почему появляется «too many open files»?

Каждый открытый файл, сокет или канал получает числовой дескриптор. У процесса есть лимит (ulimit -n). Если приложение не закрывает соединения, лимит быстро заканчивается.

ulimit -n                       # текущий лимит
ls /proc/PID/fd | wc -l         # сколько дескрипторов использует процесс

↑ Наверх

2. Сети

Что происходит, когда вы вводите адрес сайта в браузере?
  1. Браузер проверяет кэш DNS, затем спрашивает резолвер (обычно у провайдера или 8.8.8.8).
  2. Резолвер через цепочку серверов получает IP-адрес домена.
  3. Клиент устанавливает TCP-соединение: трёхстороннее рукопожатие SYN → SYN-ACK → ACK.
  4. Для HTTPS выполняется TLS-рукопожатие: проверка сертификата, согласование ключей.
  5. Отправляется HTTP-запрос, сервер возвращает ответ.
  6. Браузер загружает ресурсы и отображает страницу.

Этот ответ хорош тем, что показывает весь путь. Интервьюер часто задаёт этот вопрос, чтобы понять ширину знаний.

Чем TCP отличается от UDP? Когда что использовать?
TCPUDP
СоединениеУстанавливается (handshake)Нет
НадёжностьГарантирует доставку и порядокНет гарантий
СкоростьНиже из-за контроляВыше, меньше накладных расходов
ПримерыHTTP, SSH, базы данныхDNS, видеозвонки, метрики (StatsD)
Что такое DNS и как понять, почему имя не резолвится?

DNS превращает имена в IP. Типы записей: A (IPv4), AAAA (IPv6), CNAME (алиас), MX (почта), TXT (проверки, SPF), NS (серверы зоны).

dig example.com A +short
dig @8.8.8.8 example.com        # спросить конкретный DNS
nslookup example.com
cat /etc/resolv.conf            # какой резолвер используется

В Kubernetes имена сервисов резолвятся через CoreDNS: service.namespace.svc.cluster.local.

Что такое порт, сокет и NAT?
  • Порт — число 0–65535, которое различает сервисы на одном IP. Известные: 22 SSH, 80 HTTP, 443 HTTPS, 53 DNS.
  • Сокет — пара IP:порт плюс протокол. Соединение однозначно задаётся четвёркой адресов и портов.
  • NAT — подмена адресов на границе сети: много внутренних хостов выходят в интернет через один внешний IP.
Как читать CIDR, например 10.0.1.0/24?

Число после слеша — это количество бит, отведённых под сеть. /24 даёт 256 адресов, из них 254 пригодны для хостов (первый адрес — сеть, последний — broadcast).

МаскаАдресов
/24256
/1665 536
/2816

Частые ошибки: перекрывающиеся подсети при VPN и в Kubernetes, неправильная маска на маршрутизаторе.

Чем отличаются HTTP-коды 4xx и 5xx? Что означают 502, 503, 504?
  • 4xx — ошибка клиента: 400 неверный запрос, 401 нет аутентификации, 403 нет прав, 404 не найдено, 429 слишком много запросов.
  • 5xx — ошибка сервера: 500 внутренняя ошибка, 502 плохой ответ от upstream, 503 сервис недоступен, 504 upstream не ответил вовремя.

Для DevOps важно: 502 и 504 на балансировщике часто означают, что приложение упало или медленно отвечает. Сначала проверяйте поды или процесс за балансировщиком.

Как диагностировать сетевую проблему по шагам?
  1. ping — есть ли связь по IP вообще (учтите, что ICMP может быть закрыт).
  2. dig или nslookup — резолвится ли имя.
  3. nc -vz host 443 или curl -v — открыт ли порт и отвечает ли сервис.
  4. traceroute / mtr — где теряются пакеты или растёт задержка.
  5. ss -tanp — состояния соединений на своей стороне.
  6. tcpdump -i any port 443 — что реально уходит в сеть.
  7. Файрвол и правила: iptables -L -n, security group в облаке.
Как отвечатьПокажите методичность: идите от уровня к уровню (связность → DNS → порт → приложение → правила). Интервьюеру важен не набор команд, а порядок мышления.
Что означает TIME_WAIT и почему их много на сервере?

После закрытия TCP-соединения сторона, которая закрыла первой, держит сокет в состоянии TIME_WAIT около минуты. Это нужно, чтобы поздние пакеты не попали в новое соединение. Много TIME_WAIT — нормально для сервера с короткими HTTP-запросами. Опасно, когда исчерпываются порты.

ss -s          # сводка по состояниям сокетов
Чем latency отличается от throughput?
  • Latency — время одного запроса, задержка (миллисекунды).
  • Throughput — сколько данных или запросов в секунду проходит через систему.

Канал 1 Гбит/с с пингом 200 мс может иметь высокую пропускную способность, но медленный отклик на каждый запрос. Для API важнее latency, для бэкапов — throughput.

Чем iptables отличается от nftables и зачем нужна iptables в Kubernetes?

iptables и nftables — инструменты фильтрации и NAT в ядре. nftables — современный преемник с единым синтаксисом. Kubernetes через kube-proxy создаёт правила, чтобы перенаправлять трафик на сервисы и поды. Поэтому проблемы сервисов часто лежат в правилах NAT.

3. Git

Чем merge отличается от rebase?
  • merge создаёт коммит слияния и сохраняет полную историю ветвления. Безопасен для общих веток.
  • rebase переписывает ваши коммиты поверх другой базы, история становится линейной. Не делайте rebase того, что уже отправлено в общую ветку: переписанная история сломает работу коллег.
ПравилоЛокальную ветку можно перебазировать, общую — только merge.
Чем reset отличается от revert?
  • reset двигает указатель ветки назад и может удалить коммиты. Меняет историю. Опасен для общих веток.
  • revert создаёт новый коммит, который отменяет изменения. История сохраняется. Безопасен для публичной истории.

Режимы reset: --soft оставляет изменения в индексе, --mixed (по умолчанию) — в рабочей копии, --hard удаляет их.

Чем fetch отличается от pull?

fetch только скачивает изменения и обновляет удалённые ссылки (origin/main). pull = fetch + merge (или rebase). Привычка делать fetch, смотреть, и только потом merge, помогает не получить неожиданный конфликт.

Что такое detached HEAD и как из него выйти?

HEAD указывает не на ветку, а прямо на коммит. Так бывает после git checkout коммит. Новые коммиты останутся «висящими» и потеряются при переключении. Чтобы не потерять работу, создайте ветку: git switch -c новая-ветка.

Что такое stash и когда он нужен?

Stash временно прячет незакоммиченные изменения, чтобы переключиться на другую задачу. git stash сохраняет, git stash pop возвращает, git stash list показывает список.

Как найти коммит, который сломал сборку?
git bisect start
git bisect bad            # текущий коммит сломан
git bisect good v1.2.0    # последний рабочий
# Git предложит коммиты, вы отмечаете good или bad, пока не найдёт виновника
git bisect reset

Для автоматического поиска можно передать скрипт: git bisect run ./test.sh.

Что такое git reflog и когда он спасает?

Reflog записывает все перемещения HEAD локально. Если вы случайно сделали reset --hard, коммит можно вернуть через reflog. Это страховка, а не замена нормальной работы с ветками.

git reflog
git reset --hard HEAD@{2}
Что такое .gitignore и почему секреты в git — это проблема даже после удаления?

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

Что делатьСразу смените секрет, потом очистите историю инструментами вроде git filter-repo. Просто удалить файл недостаточно.

4. Docker и контейнеры

В чём разница между образом (image) и контейнером?

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

Аналогия: образ — это класс, контейнер — объект.

Что такое слои образа и почему порядок команд в Dockerfile важен?

Каждая инструкция Dockerfile создаёт слой. Docker кэширует слои: если слой не изменился, он берётся из кэша. Поэтому частые изменения (код) ставят в конец, а редкие (установка зависимостей) — в начало.

# Плохо: любое изменение кода пересобирает pip install
COPY . /app
RUN pip install -r requirements.txt

# Лучше: зависимости кэшируются отдельно
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app
Чем CMD отличается от ENTRYPOINT?
  • ENTRYPOINT задаёт основную программу контейнера.
  • CMD задаёт аргументы по умолчанию, которые можно переопределить при запуске.

Если указаны оба, CMD становится аргументами для ENTRYPOINT. Типичный приём: ENTRYPOINT ["python"], CMD ["app.py"].

Чем volume отличается от bind mount?
  • Volume создаёт Docker, данные хранятся под его управлением, удобен для баз данных.
  • Bind mount монтирует конкретный каталог хоста, удобен для разработки.

Данные в контейнере без volume пропадают при удалении контейнера.

Почему контейнер сразу завершается после запуска?

Контейнер живёт, пока работает его главный процесс (PID 1). Если процесс завершился, контейнер останавливается. Частые причины:

  • приложение запускается в фоне (демонизируется), и PID 1 завершается;
  • ошибка в конфиге или отсутствует переменная окружения;
  • в ENTRYPOINT/CMD неверный путь.
docker logs CONTAINER        # причина обычно здесь
docker run -it IMAGE sh      # зайти и проверить вручную
Что такое multi-stage build и зачем он нужен?

Сборка в одном образе с компилятором и инструментами раздувает размер. Multi-stage: первый этап собирает приложение, второй копирует только готовый результат в лёгкий базовый образ. Итоговый образ меньше и безопаснее, потому что в нём нет компиляторов.

Почему использовать тег latest — плохая идея?

latest не означает «последняя стабильная версия», это просто тег по умолчанию. Образ под этим тегом может измениться, и вы получите разные версии на разных серверах. Используйте конкретные версии (nginx:1.27.2), а лучше digest (@sha256:...).

Какие сетевые режимы есть у Docker?
  • bridge — режим по умолчанию, контейнеры в виртуальной сети хоста;
  • host — контейнер использует сеть хоста напрямую;
  • none — без сети;
  • overlay — для нескольких хостов в Swarm.
Что такое cgroups и namespaces и как они связаны с контейнерами?

Контейнер — это не виртуальная машина, а обычный процесс Linux, изолированный двумя механизмами:

  • Namespaces изолируют видимость: свои PID, сеть, файловая система, имена хоста.
  • Cgroups ограничивают ресурсы: CPU, память, ввод-вывод. Здесь работают лимиты Docker и Kubernetes.

Поэтому контейнер быстрый и легковесный, но ядро у него общее с хостом.

5. Kubernetes

Control plane API server, etcd, scheduler, controller manager Worker node 1 Pod A Pod B kubelet, kube-proxy Worker node 2 Pod A Pod C kubelet, kube-proxy
Control plane принимает решения, worker-узлы запускают поды
Что такое под, и почему Kubernetes работает с подами, а не с контейнерами?

Под — минимальная единица развёртывания. В нём один или несколько контейнеров, которые делят сеть (один IP) и могут делить тома. Контейнеры внутри пода видят друг друга через localhost. Поды эфемерны: их можно пересоздать, и у них меняется IP.

Чем Deployment отличается от ReplicaSet, StatefulSet, DaemonSet, Job и CronJob?
РесурсДля чего
ReplicaSetПоддерживает нужное число одинаковых подов. Обычно не создают напрямую
DeploymentStateless-приложения: обновления, откаты, управление ReplicaSet
StatefulSetStateful-приложения: стабильные имена подов и своё хранилище на каждый
DaemonSetПо одному поду на каждом узле: агенты логов, мониторинга
JobЗадача, которая выполняется до успешного завершения
CronJobJob по расписанию
Какие типы Service существуют?
  • ClusterIP — доступ только внутри кластера (по умолчанию);
  • NodePort — открывает порт на каждом узле;
  • LoadBalancer — создаёт внешний балансировщик у облака;
  • ExternalName — DNS-алиас на внешнее имя.

Для HTTP часто удобнее один Ingress вместо множества LoadBalancer.

Что такое Ingress и чем он отличается от Service?

Service — это внутренняя точка доступа к подам с балансировкой. Ingress — правила маршрутизации HTTP/HTTPS снаружи: по доменам и путям, с TLS. Для работы Ingress нужен контроллер (nginx ingress, Traefik и другие).

Чем отличаются liveness, readiness и startup probes?
  • liveness — жив ли процесс. Провал приводит к перезапуску контейнера.
  • readiness — готов ли принимать трафик. Провал убирает под из балансировки, но не перезапускает.
  • startup — для медленно стартующих приложений: пока не пройдёт, liveness и readiness не проверяются.
Частая ошибкаСлишком строгий liveness, который проверяет зависимости, например базу. Тогда при сбое базы все поды перезапускаются и становится хуже. Для зависимостей нужен readiness.
Чем requests отличаются от limits? Что такое QoS-класс?
  • requests — гарантированный минимум, по которому планировщик выбирает узел;
  • limits — верхняя граница. Превышение CPU ведёт к троттлингу, превышение памяти — к OOMKill.

QoS-классы: Guaranteed (requests = limits), Burstable (что-то задано), BestEffort (ничего не задано). При нехватке ресурсов первыми убиваются BestEffort.

Почему под застрял в Pending и как это проверить?
kubectl describe pod POD_NAME      # раздел Events
kubectl get events --sort-by=.lastTimestamp

Частые причины: не хватает CPU или памяти на узлах для requests, не подходит nodeSelector или affinity, taint без toleration, PVC не привязан к тому.

Что означает CrashLoopBackOff и как разбираться?

Контейнер падает, Kubernetes его перезапускает с растущей паузой. Смотрим:

kubectl logs POD_NAME --previous     # логи упавшего контейнера
kubectl describe pod POD_NAME        # код выхода, OOMKilled, probe failures
Чем ConfigMap отличается от Secret? Secret зашифрован?

ConfigMap хранит несекретную конфигурацию. Secret — для паролей и ключей. Но по умолчанию Secret хранится в etcd в base64, а это кодирование, а не шифрование. Чтобы защитить, включайте шифрование at rest в etcd, ограничивайте RBAC и используйте внешние хранилища секретов (Vault, External Secrets).

Как работает rolling update и как его настроить?

Deployment заменяет поды постепенно. Два параметра:

  • maxSurge — сколько подов можно создать сверх нужного числа;
  • maxUnavailable — сколько подов может быть недоступно одновременно.
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0   # без простоя
kubectl rollout status deployment/app
kubectl rollout undo deployment/app
Что такое PV, PVC и StorageClass?
  • PV — реальное хранилище, выделенное кластеру;
  • PVC — запрос пода на хранилище определённого размера и типа;
  • StorageClass — правила динамического создания PV, например SSD или HDD.
Чем Namespace отличается от кластера и для чего нужны Taint и Toleration?
  • Namespace — логическое разделение ресурсов внутри одного кластера. Не даёт полной изоляции узлов.
  • Taint на узле отталкивает поды. Toleration в поде разрешает на него попасть. Используется для выделенных узлов, например с GPU.
Что такое RBAC и какое главное правило безопасности?

RBAC определяет, кто и что может делать: Role и ClusterRole задают права, RoleBinding и ClusterRoleBinding назначают их пользователям или ServiceAccount. Главное правило: принцип минимальных прав. Не давайте cluster-admin приложениям, а ServiceAccount по умолчанию не должен иметь лишних прав.

kubectl auth can-i list pods --as=system:serviceaccount:app:default
Как работает HPA и почему он может не масштабировать?

Horizontal Pod Autoscaler меняет число реплик по метрикам, обычно CPU. Частые причины, почему он не работает: не заданы requests (без них нельзя посчитать процент), не установлен metrics-server, метрика стабильно ниже порога.

kubectl get hpa
kubectl top pods
Опишите, что происходит при kubectl apply -f deployment.yaml
  1. kubectl отправляет манифест в API server.
  2. API server проверяет запрос, аутентификацию и RBAC, и записывает объект в etcd.
  3. Controller manager видит новый Deployment и создаёт ReplicaSet, затем ReplicaSet создаёт поды.
  4. Scheduler выбирает узел для каждого пода по requests, affinity, taints.
  5. kubelet на узле запускает контейнеры через container runtime.
  6. kube-proxy и CoreDNS обновляют сетевые правила и имена, чтобы трафик пошёл на новый под.

Это отличный вопрос, потому что по нему видно, понимает ли кандидат архитектуру, а не только команды.

↑ Наверх

6. CI/CD

В чём разница между Continuous Integration, Continuous Delivery и Continuous Deployment?
  • CI — частое слияние кода в общую ветку, автоматическая сборка и тесты при каждом изменении;
  • Continuous Delivery — артефакт всегда готов к выкладке, но в продакшн выкатывает человек, часто по кнопке;
  • Continuous Deployment — каждое изменение, прошедшее все проверки, автоматически уходит в продакшн.
Почему артефакт должен собираться один раз?

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

Чем Blue/Green отличается от Canary?
  • Blue/Green — две одинаковые среды. Трафик переключается целиком. Откат — переключить обратно. Требует вдвое больше ресурсов.
  • Canary — новая версия получает небольшой процент трафика, он постепенно растёт. Позволяет поймать проблему на реальных пользователях с малым риском.
Как правильно хранить секреты в пайплайне?
  • Используйте встроенные secrets CI-системы или внешний менеджер (Vault, AWS Secrets Manager).
  • Не выводите секреты в лог: маскируйте их, не печатайте переменные через echo.
  • Выдавайте короткоживущие токены и минимальные права.
  • Никогда не кладите секреты в репозиторий, даже в приватный.
Что такое pipeline as code и почему это хорошо?

Описание пайплайна хранится в репозитории вместе с кодом: Jenkinsfile, .gitlab-ci.yml, workflow в GitHub Actions. Изменения проходят ревью, история видна в git, и пайплайн воспроизводим. Пайплайн, настроенный кликами в интерфейсе, сложно аудировать и восстановить.

Как откатиться, если релиз сломал продакшн?
  1. Быстрый откат: вернуть предыдущий известный артефакт (kubectl rollout undo, переключение Blue/Green, деплой прошлого тега).
  2. Потом разобраться в причине, не торопясь, и выпустить исправление через обычный пайплайн.

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

Что такое feature flags и зачем они нужны?

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

7. Ansible и Terraform

В чём разница между Ansible и Terraform?
  • Terraform описывает инфраструктуру: создать сеть, виртуалки, базу. Декларативен, хранит state-файл с текущим состоянием.
  • Ansible настраивает то, что уже существует: пакеты, конфиги, сервисы. Процедурен по духу, но задачи идемпотентны, state-файла нет.

Типичная связка: Terraform поднимает серверы, Ansible их настраивает.

Что такое идемпотентность и почему это важно?

Операция идемпотентна, если многократный запуск даёт тот же результат, что и однократный. В Ansible модули проверяют текущее состояние и меняют только то, что отличается. Так можно безопасно перезапускать плейбук после сбоя.

Что такое state-файл в Terraform и почему его нельзя терять?

State хранит соответствие между описанием в коде и реальными ресурсами. Без него Terraform не знает, что уже создано, и может создать дубликаты или удалить лишнее. Хранить его нужно удалённо, с блокировкой (например, S3 с DynamoDB или Terraform Cloud), потому что два одновременных apply испортят состояние.

ВажноState может содержать секреты в открытом виде. Ограничивайте доступ к бэкенду.
Что такое drift и как его обнаружить?

Drift — расхождение между кодом и реальной инфраструктурой, например если кто-то поменял правило файрвола вручную. Обнаруживается через terraform plan: план покажет, что Terraform хочет вернуть к описанию. Регулярные plan в CI помогают ловить дрейф рано.

Чем plan отличается от apply?

plan ничего не меняет, показывает, что будет создано, изменено и удалено. apply выполняет план. Хорошая практика: сохранять план в файл (terraform plan -out=tfplan) и применять именно его, чтобы между проверкой и применением ничего не поменялось.

Чем count отличается от for_each?

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

Как в Ansible устроен механизм секретов?

Ansible Vault шифрует файлы с переменными. Пароль от vault передаётся через --ask-vault-pass или файл, который не должен попадать в git. Для параметров задачи с секретами используется no_log: true.

Push или pull модель: что выбрать и чем они отличаются?
  • Push — управляющий узел сам подключается к серверам и применяет конфигурацию (Ansible, Terraform). Просто в настройке, но нужен доступ к серверам.
  • Pull — агент на сервере сам забирает конфигурацию (Puppet, Chef, GitOps-инструменты вроде Argo CD). Лучше масштабируется и не требует входящих подключений.

8. Мониторинг и наблюдаемость

В чём разница между мониторингом и наблюдаемостью (observability)?

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

Что такое три столпа наблюдаемости?
  • Метрики — числа во времени: загрузка CPU, RPS, задержка. Дёшевы и хорошо агрегируются.
  • Логи — записи о событиях с подробностями. Нужны для разбора конкретных случаев.
  • Трассировки — путь одного запроса через сервисы. Показывают, где тратится время.
Как работает Prometheus и чем он отличается от push-систем?

Prometheus сам опрашивает (pull) HTTP-эндпоинты приложений и сохраняет метрики во временной базе. Плюсы: контроль частоты опроса, легко понять, что цель недоступна (метрика up = 0). Для коротких задач есть Pushgateway.

Какие типы метрик бывают?
  • Counter — только растёт, например число запросов. Берём rate(), а не сырое значение;
  • Gauge — может расти и падать, например память или число соединений;
  • Histogram / Summary — распределение, например задержки, для расчёта перцентилей.
rate(http_requests_total[5m])
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
Что такое методы RED и USE?
  • RED (для сервисов): Rate — запросов в секунду, Errors — доля ошибок, Duration — задержка;
  • USE (для ресурсов): Utilization — загрузка, Saturation — очередь ожидания, Errors — ошибки.

RED смотрит на опыт пользователя, USE — на состояние железа и ресурсов.

Как не утонуть в алертах?
  • Алерт должен требовать действия. Если его можно просто игнорировать, он вредит.
  • Алертить на симптомы для пользователя (высокая ошибка, медленный ответ), а не на каждую причину (CPU 70%).
  • Добавлять runbook со ссылкой и первыми шагами к каждому алерту.
  • Группировать и подавлять дубликаты, настраивать паузы.
Почему важно синхронизировать время на серверах?

Логи, трассировки, сертификаты, TOTP и Kerberos зависят от времени. Если часы расходятся, по логам невозможно восстановить порядок событий, а TLS может отказаться работать. Используйте NTP или chrony и проверяйте timedatectl.

9. SRE: надёжность и процессы

Что такое SLI, SLO, SLA и error budget?
  • SLI (Service Level Indicator) — измеряемый показатель, например доля успешных запросов за окно времени.
  • SLO (Objective) — внутренняя целевая планка, например 99.9% успешных запросов в месяц.
  • SLA — договорное обязательство перед клиентом, часто со штрафами. Обычно мягче SLO.
  • Error budget — допустимый запас ошибок: 100% минус SLO. Пока бюджет есть, можно выкатывать риск. Если бюджет исчерпан, приоритет переходит к стабильности.
ПримерSLO 99.9% в месяце даёт бюджет около 43 минут недоступности. Это хороший способ обсуждать риск с бизнесом на языке цифр.
Что такое toil и как с ним бороться?

Toil — ручная, повторяющаяся, не приносящая долгосрочной пользы работа, которая растёт вместе с сервисом. Например, ручной перезапуск упавшего сервиса каждую ночь. Бороться: автоматизировать, устранять первопричину, ограничивать долю времени на toil (часто ориентир до половины времени SRE).

Чем MTTD, MTTR и MTBF отличаются?
  • MTTD — среднее время обнаружения проблемы;
  • MTTR — среднее время восстановления (часто его трактуют как repair, но важно уточнить, что именно);
  • MTBF — среднее время между отказами.

Для современных сервисов ключевой метрикой чаще называют MTTR: как быстро возвращаемся в норму.

Что такое blameless postmortem?

Разбор инцидента без поиска виноватого. Фокус на системе: почему процесс позволил ошибке случиться и почему её не поймали раньше. Структура: краткое описание, таймлайн, влияние, корневая причина, что сработало хорошо, action items с владельцами и сроками.

Как организовать on-call, чтобы он не выгорал?
  • Ротация с понятным графиком и эскалацией;
  • Алерты только на действия, runbook на каждый;
  • Компенсация или отгулы после тяжёлых ночей;
  • Регулярный разбор шума: какие алерты будили зря, их надо убрать.
Что такое canary-анализ и SLO-based alerting?

Canary-анализ сравнивает метрики новой и старой версии на небольшом трафике и решает, продолжать ли выкат. SLO-based alerting поднимает тревогу, когда скорость расходования error budget слишком высока, а не на каждую ошибку. Это уменьшает шум и привязывает алерты к влиянию на пользователей.

10. DevSecOps: безопасность

Что такое shift left и что значит DevSecOps?

Shift left — переносить проверки безопасности раньше в цикл разработки: в IDE, в pull request, в сборку. DevSecOps — безопасность как часть общего процесса, а не отдельный этап в конце, который всех тормозит.

Чем SAST, DAST, SCA отличаются друг от друга?
  • SAST — статический анализ исходного кода, ищет уязвимости без запуска. Пример: Semgrep, SonarQube.
  • DAST — динамическое тестирование работающего приложения, атакует его снаружи. Пример: OWASP ZAP.
  • SCA — анализ зависимостей на известные уязвимости CVE. Пример: Snyk, Trivy, Dependabot.
Как безопасно собрать Docker-образ?
  • Минимальный базовый образ (distroless, alpine или slim) и конкретные версии;
  • Не запускать от root: директива USER;
  • Не класть секреты в образ, передавать их при запуске;
  • Сканировать образ (Trivy, Grype) в пайплайне и блокировать критичные уязвимости;
  • Подписывать образы (cosign) и проверять подпись при деплое;
  • Multi-stage build, чтобы не тянуть компиляторы в продакшн.
Что такое принцип least privilege и как его применить?

Каждому пользователю, сервису и процессу даётся только минимально необходимый набор прав. На практике: отдельные сервисные аккаунты для каждого приложения, RBAC в Kubernetes без cluster-admin, IAM-роли с узкими политиками в облаке, запрет root в контейнерах.

Что такое supply chain security и SBOM?

Атаки на цепочку поставок: злоумышленник подменяет зависимость или сборку. Защита: фиксировать версии, проверять хеши и подписи, вести SBOM (Software Bill of Materials), то есть список всех компонентов. SBOM помогает быстро понять, затронуты ли вы новой уязвимостью.

Как защитить сеть в Kubernetes?
  • NetworkPolicy: по умолчанию запретить весь трафик и разрешать нужное;
  • Pod Security Standards: запретить privileged-контейнеры и hostPath;
  • mTLS между сервисами (например, через service mesh);
  • Шифрование etcd и ограничение доступа к API server;
  • Аудит действий через audit log.
Как управлять секретами и их ротацией?
  • Хранить в специальном менеджере секретов, а не в коде и переменных пайплайна;
  • Выдавать динамические или короткоживущие учётные данные;
  • Автоматически ротировать по расписанию и сразу после подозрения на утечку;
  • Вести аудит доступа к секретам.
Что делать, если нашли секрет в репозитории?
  1. Считать секрет скомпрометированным и немедленно отозвать или сменить его.
  2. Проверить логи доступа: использовался ли он кем-то.
  3. Удалить из истории репозитория, но это вторично.
  4. Добавить сканирование секретов в pre-commit и в пайплайн (gitleaks, trufflehog).

11. Каверзные вопросы

Load average 20 на сервере с 4 ядрами, CPU простаивает. Что происходит?

Очередь ожидания велика, но процессы не считают CPU, а ждут. Скорее всего, это состояние D — ожидание диска или сети в ядре. Проверяем vmstat 1 (поле wa и b), iostat -x 1, ps -eo stat,pid,cmd | grep '^D'. Вероятные причины: медленный или перегруженный диск, зависшая NFS-монтировка.

Приложение «тормозит». Как понять, где узкое место?

Идём по ресурсам: CPU (top, загрузка на ядро), память (нет ли свопа и OOM), диск (iostat, await), сеть (ss, retransmits), зависимости (базы, внешние API по трассировкам). Важно сравнивать с базовой линией: что изменилось, когда началась проблема? Часто виноват последний деплой или рост данных.

В чём разница между kill, kill -9 и остановкой контейнера через docker stop?

kill по умолчанию шлёт SIGTERM, процесс может завершиться корректно. kill -9 шлёт SIGKILL, его нельзя перехватить. docker stop шлёт SIGTERM главному процессу контейнера и через 10 секунд SIGKILL. Поэтому приложение в контейнере должно обрабатывать SIGTERM, иначе оно не сможет завершиться корректно.

Почему приложение в контейнере не реагирует на Ctrl+C или SIGTERM?

Если процесс запущен через shell-форму CMD, главным процессом становится shell, который не передаёт сигналы дочернему. Решение: использовать exec-форму CMD ["python", "app.py"] или init-процесс (docker run --init). Также процесс должен явно обрабатывать SIGTERM.

Почему 502 на ingress, хотя поды Running?

Pod Running не означает, что приложение готово. Проверьте readiness, endpoints сервиса (kubectl get endpoints), соответствие портов в Service и containerPort, а также таймауты между ingress и приложением. Ещё частая причина: приложение слушает 127.0.0.1 вместо 0.0.0.0.

Почему в Kubernetes контейнер не получает новую версию ConfigMap?

Если ConfigMap смонтирован как переменные окружения, при изменении он не обновится в работающем поде: переменные задаются при старте. Для томов ConfigMap обновляется со временем, но приложение должно перечитать файл. Практичное решение: менять имя ConfigMap или добавлять хеш в аннотацию пода, чтобы Deployment перезапустил поды.

Почему SELECT в базе стал медленным, хотя индексы есть?

Варианты: индекс не используется из-за функции над колонкой, например WHERE lower(email) = ..., неправильный тип данных с неявным приведением, устаревшая статистика, выросшая таблица, блокировки от долгих транзакций. Смотрите EXPLAIN ANALYZE и журнал медленных запросов.

Порт занят: «address already in use». Как найти виновника?
ss -tulpn | grep :8080
lsof -i :8080

Если процесс — от прошлого запуска, его можно остановить. Частая причина в Docker: контейнер с тем же портом уже запущен, или docker-proxy держит порт.

Почему на сервере мало памяти, хотя процессы потребляют немного?

Возможные объяснения: кэш ядра (смотрите available, а не free), утечка памяти в ядре или в слабом месте (slab, /proc/meminfo), tmpfs, который занимает память (df -h /dev/shm /tmp), или много процессов, каждый из которых учитывается по RSS. Используйте smem или ps aux --sort=-rss.

Почему NTP-сервис не синхронизирует время в контейнерах?

Контейнеры используют часы хоста. Синхронизировать нужно хост, а не контейнер. В Kubernetes это делает узел. Проверка: timedatectl status на хосте и chronyc sources.

Что быстрее: один большой deploy или много маленьких, и почему?

Маленькие релизы безопаснее: меньше изменений, проще найти причину, проще откатить. Это основа практики CD. Но у каждого релиза есть накладные расходы, поэтому цель — автоматизировать процесс, а не просто делать редкие большие релизы.

12. Поведенческие вопросы

Расскажите о самом сложном инциденте, в котором вы участвовали.

Используйте структуру STAR: Situation (контекст), Task (ваша задача), Action (что сделали именно вы), Result (итог и что изменили потом). Особенно важен последний пункт: что сделали, чтобы такое не повторилось. Говорите «мы» для команды, но показывайте свою конкретную роль.

Как вы расставляете приоритеты, когда задач много?

Оцениваю влияние на пользователей и бизнес, срочность и стоимость. Инциденты и риски безопасности — выше плановых задач. Важно проговорить компромиссы с руководителем и не молчать, если сроки нереальны.

Как вы объясняете техническую проблему нетехническому менеджеру?

Говорю языком последствий: что сломано, кто затронут, сколько стоит простой, что делаем и когда станет лучше. Без жаргона, с цифрами. Например: «Сайт недоступен 10% пользователей, исправление займёт 2 часа, риск потери заказов — оценка такая-то».

Как вы относитесь к конфликтам с разработчиками, например про релизы или безопасность?

Ищу общую цель: надёжный и быстрый релиз. Стараюсь автоматизировать спорное, например проверки в пайплайне, чтобы не быть «полицией». Объясняю причины через риски, а не через запреты, и готов обсуждать исключения с понятными условиями.

Что вы делаете, если не знаете ответа на вопрос?

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

Почему вы хотите работать именно у нас?

Подготовьте ответ заранее: изучите продукт, стек, публичные статьи о технологиях компании. Связывайте свой опыт с задачами, которые они решают. Общие фразы вроде «хочу расти» звучат слабо.

13. Как отвечать на собеседовании

ЛайфхакПеред собеседованием сделайте мини-стенд: поднимите Kubernetes локально (kind или minikube), запустите приложение, сломайте его и почините. Практический опыт звучит убедительнее любой теории.

↑ Наверх