> Что такое поды в Kubernetes (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Avito

Стек: Go

> Пример ответа

Короткий ответ

Под - это минимальная единица развёртывания в Kubernetes, которая содержит один или несколько контейнеров с общими ресурсами: сетью, storage и namespace. Контейнеры в поде всегда запускаются на одной ноде и масштабируются вместе. В Go-приложениях под обычно содержит один контейнер с бинарником, но для sidecar-паттернов (например, envoy или лог-агент) под может включать несколько контейнеров.

Подробное объяснение

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

  • Общий network namespace: все контейнеры в поде разделяют один IP-адрес и loopback-интерфейс. Они могут общаться друг с другом через localhost, что удобно для sidecar-контейнеров.
  • Общий storage: контейнеры могут монтировать одни и те же volumes, что позволяет им обмениваться файлами.
  • Общий lifecycle: Kubernetes управляет подом как единым целым - создаёт, перезапускает, удаляет все контейнеры вместе.
  • Связка с нодой: под не может быть разделён между нодами. Если нода падает, под пересоздаётся на другой ноде (если он управляется через ReplicaSet или Deployment).

Поды бывают двух типов:

  • Статические - создаются напрямую kubelet'ом на ноде, не управляются API-сервером.
  • Управляемые - создаются через API, обычно через Deployment, StatefulSet или DaemonSet.

В контексте Go-приложений под - это обычно один контейнер с скомпилированным бинарником. Но часто добавляют sidecar-контейнеры для observability (например, Prometheus exporter) или для проксирования трафика.

На практике

При работе с подом в Go важно понимать, что:

  • Health checks (liveness и readiness probes) настраиваются на уровне пода, но выполняются для каждого контейнера отдельно.
  • Resource requests и limits задаются для каждого контейнера, а не для пода целиком. Сумма requests по контейнерам определяет минимальные ресурсы пода.
  • Pod IP нестабилен - он меняется при пересоздании пода. Для стабильного доступа используют Service.
  • Graceful shutdown: при удалении пода Kubernetes отправляет SIGTERM контейнерам, затем через terminationGracePeriodSeconds (по умолчанию 30 секунд) отправляет SIGKILL. В Go-приложении нужно корректно обрабатывать SIGTERM для завершения HTTP-сервера и закрытия соединений.

Типичный паттерн для Go: приложение слушает порт, указанный в env-переменной PORT, и отправляет метрики на отдельный порт для Prometheus.

Пример кода

Пример простого Deployment для Go-приложения:

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-app
spec:
replicas: 3
selector:
matchLabels:
app: go-app
template:
metadata:
labels:
app: go-app
spec:
containers:
- name: app
image: myregistry/go-app:v1.0
ports:
- containerPort: 8080
env:
- name: PORT
value: "8080"
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 1
periodSeconds: 3
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"

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

Начните с определения пода как минимальной единицы развёртывания. Затем перечислите ключевые свойства: общий network namespace, общий storage, общий lifecycle. Упомяните, что под - это не то же самое, что контейнер: в поде может быть несколько контейнеров. Приведите пример sidecar-паттерна. Если спросят про Go - скажите, что под обычно содержит один контейнер с бинарником, но важно правильно настроить probes и graceful shutdown. Не углубляйтесь в детали реализации kubelet, если не просят.

Что проверяет интервьюер

Интервьюер проверяет:

  • Понимаете ли вы разницу между подом и контейнером.
  • Знаете ли вы, что контейнеры в поде разделяют network namespace и могут общаться через localhost.
  • Понимаете ли вы, что под - это единица масштабирования и жизненного цикла.
  • Знаете ли вы, как под связан с Deployment, ReplicaSet и нодой.
  • Умеете ли вы объяснить, зачем нужны liveness и readiness probes.

Типичные ошибки

  • Путать под и контейнер, говорить, что под - это просто обёртка над одним контейнером.
  • Утверждать, что контейнеры в поде могут иметь разные IP-адреса.
  • Не упоминать, что под не может быть разделён между нодами.
  • Говорить, что под переживает падение ноды - это неверно, под удаляется и пересоздаётся.
  • Забывать про terminationGracePeriodSeconds и graceful shutdown при обсуждении удаления пода.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью