// devops interview / kubernetes

Вопросы на собеседовании: Kubernetes

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

Открыть тему в приложении каждый день бесплатно: 3 эталона и 3 проверки арбитром

junior: база, с которой начинают

В проде нужен веб-сервис из трёх одинаковых реплик. Почему не стоит создавать три Pod вручную и что в этой задаче даёт Deployment?

как ответить Pod — отдельный экземпляр приложения, а не контроллер желаемого состояния. Deployment через ReplicaSet поддерживает нужное число взаимозаменяемых Pod, создаёт замену при их потере и управляет постепенным обновлением шаблона. Поэтому в проде обычно описывают Deployment, а не набор Pod вручную.

разбор

Одиночный Pod подходит для эксперимента или объекта, жизненным циклом которого управляет другой контроллер. Если такой Pod удалить, сам по себе он не восстановится. restartPolicy решает другую задачу: kubelet может перезапустить контейнер внутри существующего Pod на том же узле, но это не заменяет потерянный Pod на уровне кластера.

Deployment хранит шаблон Pod и желаемое число реплик. Его контроллер создаёт ReplicaSet, постоянно сравнивает желаемое состояние с фактическим и добавляет либо убирает реплики. Изменение шаблона запускает rollout новой ревизии, которым можно управлять отдельно.

Практическая граница: Deployment рассчитан на взаимозаменяемые stateless-реплики. Он не переносит данные с погибшего контейнера и не делает приложение отказоустойчивым сам по себе — состояние, зависимости и корректное завершение процесса проектируют отдельно.

чтобы прозвучать сильнее Добавь, что ручное удаление Pod под управлением Deployment не меняет желаемое число реплик: ReplicaSet создаст замену. Для стабильной сетевой идентичности или привязанного хранилища уже рассматривают StatefulSet.

devops-kubernetes-001 · junior · high

Pod запущен, но Service не отправляет на него трафик. Что не так в манифестах и как ты проверишь гипотезу?

apiVersion: v1
kind: Service
metadata:
  name: api
spec:
  selector:
    app: api
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: v1
kind: Pod
metadata:
  name: api-1
  labels:
    app: backend
spec:
  containers:
    - name: api
      image: example/api:1
      ports:
        - containerPort: 8080

как ответить Селектор Service ищет app: api, а у Pod стоит app: backend, поэтому контроллер не добавит его адрес в EndpointSlice. Я бы сравнил селектор и метки, затем посмотрел kubectl get endpointslice -l kubernetes.io/service-name=api. После исправления метки проверил бы readiness и соответствие targetPort порту, который действительно слушает приложение.

разбор

Service даёт стабильную точку доступа к меняющемуся набору backend-адресов. Для Service с селектором control plane находит подходящие Pod и ведёт связанные EndpointSlice; IP конкретного Pod клиентам запоминать не нужно. В примере пересечение селектора и меток пустое, поэтому Service существует, но направлять соединения ему некуда.

Проверка идёт от декларации к факту:

  • kubectl get service api -o yaml — увидеть селектор, port и targetPort;
  • kubectl get pods --show-labels — проверить точные ключи и значения меток;
  • kubectl get endpointslice -l kubernetes.io/service-name=api — увидеть реальные backend-адреса и их условия готовности;
  • запросить приложение напрямую внутри Pod или через временный диагностический Pod, чтобы отделить проблему Service от проблемы процесса.

containerPort сам по себе не открывает порт и не проверяет, что процесс его слушает. Даже после исправления метки трафик не заработает при неверном targetPort, неготовом Pod или сетевой политике, запрещающей соединение.

чтобы прозвучать сильнее Уточни, что Service может работать и без селектора, но тогда EndpointSlice создаёт другой контроллер или оператор. Для обычного Deployment пустой EndpointSlice почти всегда заставляет сначала проверить labels, selector и readiness.

devops-kubernetes-002 · junior · high

Чем readiness probe отличается от liveness probe и зачем отдельно нужна startup probe?

как ответить Readiness отвечает, можно ли сейчас направлять трафик в контейнер: при провале Pod исключают из обычного обслуживания через Service, но контейнер не перезапускают. Liveness ищет состояние, из которого нужен перезапуск контейнера. Startup probe защищает медленный старт: пока она не прошла, liveness и readiness не запускаются.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-003 · junior · high

На дашборде узлы почти пусты, но Pod с такими resources остаётся Pending с Insufficient cpu. Почему scheduler не смотрит на текущую загрузку и какую роль играют requests и limits?

resources:
  requests:
    cpu: 250m
    memory: 256Mi
  limits:
    cpu: 500m
    memory: 512Mi

как ответить Scheduler сравнивает сумму requests с allocatable узла, а не с мгновенной загрузкой: для этого Pod ему нужны 250m CPU и 256 MiB памяти. Limit задаёт границу использования во время работы, но его уменьшение само по себе не освобождает планировочную ёмкость. Нужно проверить фактический манифест после admission, requests всех контейнеров и уже зарезервированные requests на узлах.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-004 · junior · high

Что положишь в ConfigMap, а что в Secret? Почему Kubernetes Secret нельзя считать шифрованием секрета по умолчанию?

как ответить ConfigMap хранит несекретную конфигурацию, а Secret предназначен для паролей, токенов и ключей. Значения Secret обычно представлены в base64, но кодирование не даёт конфиденциальности; без отдельной настройки данные в etcd могут храниться незашифрованными. Нужны шифрование at rest, минимальный RBAC и ограничение того, какие контейнеры получают Secret.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-005 · junior · medium

middle: где отделяют уверенных

Новый Deployment не завершает rollout. В каком порядке ты будешь искать причину и когда решишь откатываться?

kubectl rollout status deployment/api --timeout=2m
kubectl describe deployment/api
kubectl get rs,pods -l app=api -o wide

# Подставь имя Pod из нового ReplicaSet:
NEW_POD=api-newhash-abcde
kubectl describe pod "$NEW_POD"
kubectl logs "$NEW_POD" --all-containers
kubectl logs "$NEW_POD" --all-containers --previous
kubectl get events --sort-by=.metadata.creationTimestamp

как ответить Сначала смотрю состояние Deployment и его новый ReplicaSet, затем конкретные Pod: scheduling, pull образа, состояние контейнеров, probes, события и текущие либо предыдущие логи. Так отделяю ошибку манифеста от нехватки ресурсов и падения приложения. Откат оправдан, если новая ревизия ухудшает сервис и предыдущая совместима с уже выполненными изменениями, но сам progressDeadlineSeconds автоматический rollback не запускает.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-006 · middle · medium

Нужно запускать очистку один раз после релиза и отчёт каждый час. Когда возьмёшь Job, когда CronJob и почему обе задачи должны быть идемпотентными?

как ответить Job подходит для конечной задачи: контроллер добивается нужного числа успешных завершений. CronJob создаёт Job по расписанию и добавляет правила для пропущенных и пересекающихся запусков. Идемпотентность нужна потому, что при сбоях и гонках один логический запуск может фактически выполнить работу повторно.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-007 · middle · medium

Pod должен запускаться только на GPU-узлах, защищённых taint. Как совместить node affinity и toleration и почему одной toleration недостаточно?

как ответить Taint отталкивает Pod, а toleration лишь снимает этот запрет: она не притягивает workload к GPU-узлу. Нужна ещё обязательная node affinity или nodeSelector по доверенной метке GPU-пула. Scheduler проверит и остальные условия, поэтому такая пара разрешает и направляет размещение, но не гарантирует его при отсутствии ёмкости.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-008 · middle · medium

Pod работает с ServiceAccount diagnostics, но API отвечает Forbidden на чтение Pod, хотя Role и RoleBinding созданы. Как найдёшь ошибку в RBAC?

как ответить Сначала проверю фактическую identity — system:serviceaccount:<namespace>:diagnostics — и воспроизведу решение авторизатора через kubectl auth can-i. Затем сопоставлю verb, API group, resource или subresource и namespace запроса с правилами Role и областью RoleBinding. Частые причины — неверный namespace у subject, другой serviceAccountName, отсутствие отдельного pods/log или привязка не той роли.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-009 · middle · medium

Ingress создан, но публичный URL не отвечает. Как проходит HTTP-запрос до Pod и на каких участках ты будешь искать разрыв?

как ответить Ingress хранит HTTP(S)-правила, но сам по себе ничего не обслуживает: нужен ingress controller, который реализует выбранный IngressClass. Запрос проходит через внешний адрес контроллера, правило host/path, Service и его EndpointSlice к готовому Pod. Я проверяю эту цепочку по порядку, включая DNS, TLS, статус Ingress, controller logs, порты Service и endpoints.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-010 · middle · medium

senior: глубина и продакшн

При rolling update часть запросов обрывается на завершающихся Pod. Как спроектировать graceful shutdown и что Kubernetes делает при удалении Pod?

как ответить При удалении Pod получает deletion timestamp, EndpointSlice помечает его завершающимся, а kubelet начинает graceful termination. Весь preStop и обработка TERM должны уложиться в terminationGracePeriodSeconds, после чего процесс будет принудительно остановлен. Приложение само прекращает принимать новые запросы и завершает активные, потому что мгновенное исключение endpoint из всех слоёв балансировки не гарантировано.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-011 · senior · low

Когда StatefulSet действительно нужен вместо Deployment и какие гарантии он не даёт базе данных?

как ответить StatefulSet нужен, когда репликам важны стабильные ordinal-имена, постоянная сетевая идентичность, связанный с каждой репликой том или упорядоченные операции. Он сохраняет идентичность Pod при пересоздании и обычно использует headless Service для DNS. Но StatefulSet не настраивает репликацию, кворум, backup или согласованность самой базы — это делает приложение либо оператор.

полный разбор и проверка ответа арбитром — в приложении devops-kubernetes-012 · senior · low

Соседние темы того же собеса