Вопросы по Kubernetes на собеседовании DevOps
Для инженера эксплуатации Kubernetes это самый частый блок собеса, и спрашивают его глубже, чем разработчика. Спрашивают не команды kubectl, а понимание: почему под висит в Pending, чем провал liveness отличается от readiness, что произойдёт с нагрузкой, если ляжет управляющий слой.
Что спрашивают
- +Объекты и контроллеры: чем Deployment отличается от StatefulSet, зачем DaemonSet, как идёт rolling update при maxSurge и maxUnavailable
- +Сеть: зачем Service, если у пода есть адрес, почему Ingress без контроллера не работает, что меняет первая NetworkPolicy
- +Ресурсы: по чему планирует scheduler, чем OOMKilled отличается от троттлинга, как получить класс QoS Guaranteed
- +Эксплуатация: разбор CrashLoopBackOff, ImagePullBackOff, Pending и Evicted по событиям и кодам выхода
Из чего состоит тема
Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, где вы ошибаетесь.
- Архитектура кластера8
- RBAC и мультитенантность7
- Автоскейлинг7
- Поды и контроллеры7
- Пробы и жизненный цикл7
- Траблшутинг кластера7
- Service и Ingress6
- Конфиг, секреты, тома6
- Планирование подов6
- Ресурсы и QoS6
Разборы подтем
Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.
- Архитектура кластера Kubernetes8 вопросов
- Поды и контроллеры Kubernetes7 вопросов
- Service и Ingress в Kubernetes6 вопросов
- ConfigMap, Secret и тома в Kubernetes6 вопросов
- Планирование подов: requests, taints, Pending6 вопросов
- Пробы liveness и readiness7 вопросов
- Ресурсы и QoS в Kubernetes6 вопросов
- Автоскейлинг: HPA и Cluster Autoscaler7 вопросов
- RBAC и мультиарендность в Kubernetes7 вопросов
- Разбор аварий: CrashLoopBackOff и Pending7 вопросов
Примеры вопросов с разбором
- Почему единица запуска в Kubernetes — под, а не контейнер?A)Под нужен для отказоустойчивости: это две копии одного контейнераB)Группа контейнеров с общей сетью и томамиC)Под — обёртка для образа, из которой оркестратор читает манифестD)Под задаёт версию приложения, а контейнер — конкретный процесс
показать ответ и разбор
+B)Группа контейнеров с общей сетью и томами// разбор: Под — минимальная планируемая единица: контейнеры внутри делят сетевой namespace (общий localhost и порты) и могут делить тома. Отсюда паттерны с sidecar: прокси, сборщик логов, init-контейнер рядом с приложением. Планировщик размещает под целиком на одну ноду, а масштабируют не контейнер внутри, а число подов.
- Пароль положили в Secret вместо ConfigMap. Насколько он теперь защищён?A)Значение лишь закодировано base64B)Значение шифруется кластером, ключ хранится на control planeC)Значение шифруется на ноде и расшифровывается только приложениемD)Значение хранится вне etcd, в отдельном защищённом хранилище
показать ответ и разбор
+A)Значение лишь закодировано base64// разбор: Secret отличается от ConfigMap не шифрованием, а обращением: кодирование base64, отдельный тип, монтирование в tmpfs, отсутствие вывода значений в описании объекта. Кто имеет право читать секреты в namespace, увидит содержимое одной командой. Реальная защита — ограничения RBAC, шифрование данных в etcd (EncryptionConfiguration) и вынос секретов во внешнее хранилище с подстановкой через оператор.
- У каждого пода есть свой IP. Зачем тогда Service ClusterIP?A)Чтобы поды получили доступ в интернет через NATB)Чтобы шифровать трафик между подами внутри кластераC)Чтобы ограничить, кто с кем может общаться в кластереD)Адреса подов эфемерны, а сервис даёт стабильные имя и адрес
показать ответ и разбор
+D)Адреса подов эфемерны, а сервис даёт стабильные имя и адрес// разбор: Под пересоздаётся при каждой выкатке и получает новый адрес — прибивать к нему клиентов нельзя. Service даёт постоянный виртуальный адрес и DNS-имя, а список живых бэкендов держит в EndpointSlice, обновляя его по readiness подов. Трафик разводит kube-proxy правилами на ноде. Ограничения доступа — задача NetworkPolicy, а не сервиса.
- Чем requests отличаются от limits при размещении пода?A)Планировщик считает requests, limits — рантаймB)Планировщик считает limits, requests нужны лишь для отчётностиC)Оба параметра равнозначны: планировщик берёт их среднееD)requests задают минимум для автоскейлера, планировщик их не читает
показать ответ и разбор
+A)Планировщик считает requests, limits — рантайм// разбор: Планировщик ищет ноду, где сумма requests уже размещённых подов плюс запрос нового влезает в ёмкость. Limits в это не входят: они превращаются в ограничения cgroup и работают в рантайме — превышение памяти даёт OOM-kill, превышение CPU даёт троттлинг. Отсюда типовой перекос: маленькие requests и щедрые limits дают плотную упаковку и внезапную нехватку под нагрузкой.
- Что берут для базы с диском на под: Deployment или StatefulSet?A)Deployment с томом: он умеет закреплять диск за репликойB)Deployment с реплика-сетом на одну реплику, иначе диск разъедетсяC)StatefulSet: стабильные имена подов и свой том у каждой репликиD)DaemonSet: так под с базой окажется на каждой ноде
показать ответ и разбор
+C)StatefulSet: стабильные имена подов и свой том у каждой реплики// разбор: У Deployment поды одноразовые и взаимозаменяемые: имя случайное, том общий или отсутствует. StatefulSet даёт устойчивую идентичность — имена вида db-0, db-1, отдельный PVC на каждую реплику через volumeClaimTemplates, предсказуемый порядок запуска и остановки. Именно это нужно базам, брокерам и всему, что хранит состояние на диске.
- Чем liveness-проба отличается от readiness по последствиям?A)Liveness перезапускает, readiness убирает из сервисаB)Провал liveness убирает под из балансировки, readiness перезапускает контейнерC)Обе перезапускают контейнер, readiness просто ждёт дольшеD)Обе только помечают под, а решение принимает контроллер деплоя
показать ответ и разбор
+A)Liveness перезапускает, readiness убирает из сервиса// разбор: Liveness отвечает на вопрос «жив ли процесс»: провал — рестарт контейнера. Readiness отвечает «готов ли принимать трафик»: провал — под исчезает из EndpointSlice сервиса, но продолжает работать. Отсюда разное наполнение: в liveness — дешёвая проверка самого процесса, в readiness — готовность зависимостей, прогретый кэш, открытые пулы.
- Чем Role отличается от ClusterRole?A)Role описывает права людей, ClusterRole — права сервисных аккаунтовB)Role работает на чтение, ClusterRole разрешает и записьC)Role действует в своём namespace, ClusterRole — на весь кластерD)Role назначается напрямую, ClusterRole — только через группы
показать ответ и разбор
+C)Role действует в своём namespace, ClusterRole — на весь кластер// разбор: Role живёт в namespace и раздаёт права на объекты внутри него. ClusterRole описывает права на уровне кластера и на объекты вне namespace — ноды, PV, сами namespace. При этом ClusterRole можно связать RoleBinding'ом внутри одного namespace: удобный приём, когда набор прав общий, а область применения узкая.
- Контейнер упёрся в свои limits по памяти и по CPU. Что произойдёт в каждом случае?A)И там, и там контейнер перезапуститсяB)И там, и там процесс просто замедлитсяC)По памяти — троттлинг, по CPU — убийство процессаD)По памяти — OOM-kill, по CPU — троттлинг
показать ответ и разбор
+D)По памяти — OOM-kill, по CPU — троттлинг// разбор: Память неэластична: выделить сверх лимита нельзя, поэтому ядро убивает процесс — контейнер получает статус OOMKilled и рестарт по политике. CPU эластичен: превышение квоты не убивает, а притормаживает — планировщик ядра не даёт задаче ресурс до конца текущего периода. Отсюда разные симптомы: рестарты против выросших задержек при нормальной загрузке.
- HPA настроен на целевые 70% CPU. Процент считается от чего?A)От физической ёмкости ноды, где размещён подB)От суммы requests контейнеров подаC)От лимита CPU, заданного в манифестеD)От пикового потребления за прошлый час
показать ответ и разбор
+B)От суммы requests контейнеров пода// разбор: Целевая утилизация в HPA считается как отношение фактического потребления к сумме requests пода: 70% при запросе 500m означает 350m. Отсюда практическое следствие: без заданных requests метрика не считается и автоскейлер не работает. И второе: изменив requests, вы автоматически меняете точку срабатывания HPA, даже если формально его не трогали.
это 9 из 67
Ещё 58 вопросов по теме — в тренажёре, с движком повторения
Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы идут сессиями, а движок возвращает подтемы, где вы ошибаетесь, пока они не начнут отскакивать. Бесплатно, лимит по энергии.
Частые вопросы
Что чаще всего спрашивают по Kubernetes на собесе?
Три вещи: разницу между liveness и readiness с последствиями каждого провала, поведение requests и limits при планировании и в рантайме, а также разбор пода, который не поднимается. Дальше уже про сеть, хранилище и права.
Нужно ли знать внутренности кластера джуну?
На джуна хватает объектов и умения читать describe и события. Архитектуру с api-server, etcd и kubelet спрашивают ближе к мидлу, а кворум etcd и мультиарендность это уже сеньорский разговор.