Перейти к содержимому
TelegramGitHub

Нужен ли Kubernetes

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

Kubernetes (K8s) — система, которая запускает контейнеры на группе серверов и следит за ними.

ПонятиеЧто это
ClusterГруппа серверов под управлением Kubernetes
NodeОдин сервер в кластере
PodОдин или несколько контейнеров, которые запускаются вместе. Минимальная единица
DeploymentОписание: «держи 3 копии этого pod и обновляй их по очереди»
ServiceПостоянный адрес и порт для группы pod

Вы описываете желаемое состояние в YAML. Kubernetes сам приводит кластер к нему.

  • Самовосстановление. Контейнер упал — Kubernetes запустит новый. Сервер сломался — перенесёт контейнеры на другой.
  • Масштабирование. Нагрузка выросла — копий стало больше. Можно настроить по своим метрикам.
  • Обновление без остановки. Новая версия включается постепенно. Если она сломана, откат одной командой.
  • Много сервисов и команд. Общие правила, права и сеть для десятков сервисов.
  • Сложность. Нужно знать pod, Service, Ingress, ConfigMap, Secret, PVC и ещё десятки понятий.
  • Время на поддержку. Кластер нужно обновлять, мониторить и чинить.
  • Много YAML. Сервис, который в Compose занимает 10 строк, в Kubernetes занимает 40.
  • Сеть и права. Они сложнее, чем в Docker.
  • Деньги. Кластер работает постоянно, даже когда задач нет.
  • Люди. Нужны те, кто умеет им управлять. Часто это отдельная платформенная команда.

Типичная команда данных: 5–30 пакетных пайплайнов, один BI-инструмент, одно хранилище. Для этого Kubernetes не нужен.

СитуацияЧто хватает
Локальная разработкаDocker и Compose
Одна база, один BI, несколько задач на одном сервереCompose на одной виртуальной машине
Пакетные задачи по расписаниюAWS ECS на Fargate, Cloud Run jobs, Container Apps jobs
Веб-сервис или API с небольшой нагрузкойCloud Run, ECS на Fargate (или ECS Express Mode), Container Apps
Оркестрация пайплайновУправляемый Airflow: MWAA, Cloud Composer, Astronomer
Задачи по событию, короткиеLambda с образом контейнера
  • Десятки сервисов и несколько команд на одной платформе.
  • Нужно масштабирование по своим метрикам, например по длине очереди.
  • В компании уже есть платформенная команда, которая поддерживает кластер.
  • Требование: свои серверы (on-prem) или несколько облаков с одним способом запуска.
  • Airflow с KubernetesExecutor при большом числе параллельных задач.
  • Spark на Kubernetes.
  • Сервинг ML-моделей в большом масштабе.

Начните просто. Переходите на Kubernetes, когда можете назвать конкретную проблему, которую он решает. «Все так делают» — не проблема. «Нам нужно 200 параллельных задач, и Fargate стоит слишком дорого» — проблема.

Всё, чему вы научились в этом курсе, пригодится в Kubernetes.

  • Dockerfile и образ остаются теми же. Kubernetes запускает тот же образ.
  • Переменные окружения работают так же.
  • Том в Docker похож на PVC в Kubernetes.
  • Имя службы в Compose (db) похоже на Service: постоянный адрес, по которому другие находят сервис.

Сервис db в Compose:

services:
db:
image: postgres:17
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data

Тот же сервис в Kubernetes (концептуальный пример, не запускаем). Для баз в Kubernetes обычно берут StatefulSet. Здесь Deployment, чтобы пример был проще:

apiVersion: apps/v1
kind: Deployment
metadata:
name: db
spec:
replicas: 1
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- name: db
image: postgres:17
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
ports:
- containerPort: 5432
volumeMounts:
- name: pgdata
mountPath: /var/lib/postgresql/data
volumes:
- name: pgdata
persistentVolumeClaim:
claimName: pgdata
---
apiVersion: v1
kind: Service
metadata:
name: db
spec:
selector:
app: db
ports:
- port: 5432

Идея та же: образ, переменные, порт, том. Но текста больше. И нужны ещё Secret и PersistentVolumeClaim. В реальной работе базу в Kubernetes обычно не запускают. Берут управляемую базу в облаке.

Лестница из четырёх шагов: Docker, Compose, облачный сервис контейнеров, Kubernetes. Часто хватает первых трёх

  1. Docker: образы и контейнеры.
  2. Compose: несколько сервисов вместе.
  3. Один облачный сервис контейнеров: ECS, Cloud Run или Container Apps.
  4. Kubernetes. Только если он действительно нужен.

Попробовать Kubernetes на своём компьютере можно в kind или в Docker Desktop (раздел Kubernetes в настройках).

Это задания на размышление. Для каждого выберите решение и объясните его.

Команда из трёх аналитиков. Каждую ночь работает 8 скриптов Python. Они грузят данные из API в хранилище. Каждый скрипт работает 5–20 минут. Что выбрать?

Проверка: ответ не включает Kubernetes.

Решение

Подойдёт любой из вариантов:

  • Каждый скрипт — образ. Запуск по расписанию в Cloud Run jobs, ECS на Fargate или Container Apps jobs.
  • Или управляемый Airflow, если нужны зависимости между задачами.
  • Самый простой вариант: одна виртуальная машина с cron и docker run.

Kubernetes не нужен. Задач мало, они короткие, нагрузка предсказуема.

В компании 15 команд данных и 200 DAG в Airflow. Задачи требуют разных библиотек. Пик нагрузки — 300 параллельных задач. Есть платформенная команда, которая уже поддерживает кластер Kubernetes. Что выбрать?

Проверка: ответ включает Kubernetes и называет причину.

Решение

Airflow с KubernetesExecutor или KubernetesPodOperator в существующем кластере.

Причины:

  • Большое число параллельных задач.
  • Каждая задача в своём образе, с разными библиотеками.
  • Платформенная команда уже умеет работать с кластером. Не нужно нанимать людей для кластера.

Один инженер данных. Нужно запустить Metabase и Postgres для небольшой команды из 10 человек. Нагрузка небольшая. Что выбрать?

Проверка: ответ не включает Kubernetes.

Решение

Compose на одной виртуальной машине в облаке. Те же compose.yaml и том для Postgres, что мы писали на уроках. Добавьте регулярные бэкапы базы.

Если не хочется поддерживать сервер, возьмите управляемую базу в облаке (RDS, Cloud SQL) и запустите Metabase в Cloud Run или ECS.

Kubernetes здесь добавит работы, но не принесёт пользы.

Дальше: Итоговая практика.