Что такое Kubernetes и какие основные проблемы он решает?

«Что такое Kubernetes и какие основные проблемы он решает?» — вопрос из категории DevOps, который задают на 25% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Kubernetes (K8s) — это система оркестрации контейнеризированных приложений с открытым исходным кодом. Она автоматизирует развертывание, масштабирование и управление приложениями, упакованными в контейнеры (например, Docker).

Основные решаемые проблемы:

  1. Масштабирование: Автоматическое увеличение/уменьшение количества реплик приложения в зависимости от нагрузки.
  2. Отказоустойчивость: Самовосстановление — перезапуск контейнеров при сбоях и их перераспределение на работоспособные узлы.
  3. Декларативная конфигурация: Описание желаемого состояния системы ("должно быть 5 копий приложения"), а K8s самостоятельно приводит систему к этому состоянию.
  4. Управление сетевым трафиком: Балансировка нагрузки между экземплярами приложения и механизмы для обнаружения сервисов.
  5. Управление обновлениями: Поддержка стратегий rolling updates и rollback с минимальным временем простоя.

Ключевые абстракции (ресурсы):

  • Pod: Наименьшая единица развертывания. Контейнер (или группа тесно связанных контейнеров), разделяющих сеть и хранилище.
  • Deployment: Декларативное описание жизненного цикла Pod'ов (реплики, стратегия обновления).
  • Service: Абстракция для доступа к группе Pod'ов как к единому сетевому сервису (стабильный IP/DNS).

Пример манифеста Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 3 # Желаемое количество идентичных Pod'ов
  selector:
    matchLabels:
      app: web
  template: # Шаблон для создания Pod'ов
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: app-container
        image: myregistry/web-app:latest
        ports:
        - containerPort: 8080

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