Kubernetes — the friendly introKubernetes — дружелюбное введение

The system that runs and manages thousands of containers across many machines: scheduling, scaling, healing, networking. Read Docker first. Система, которая запускает и управляет тысячами контейнеров на множестве машин: планирование, масштабирование, самовосстановление, сеть. Сначала прочитай про Docker.
🐳 Docker ☸️ Kubernetes 🚀 Flyte

1. What is Kubernetes?1. Что такое Kubernetes?

Kubernetes (often "K8s") is a container orchestrator: an open-source system that runs your containers across a fleet of machines and keeps them healthy. You tell it the desired state ("run 5 copies of this app"), and Kubernetes constantly works to make reality match — scheduling containers onto machines, restarting crashed ones, scaling up and down, and wiring up networking.

Kubernetes (часто «K8s») — это оркестратор контейнеров: опенсорсная система, которая запускает твои контейнеры по парку машин и поддерживает их в рабочем состоянии. Ты говоришь ей желаемое состояние («запусти 5 копий этого приложения»), и Kubernetes постоянно приводит реальность к нему — раскидывает контейнеры по машинам, перезапускает упавшие, масштабирует вверх и вниз, настраивает сеть.

AnalogyАналогия If a container is a shipping container, Kubernetes is the automated port: it decides which ship (machine) each container goes on, replaces any that fall overboard, adds more when traffic spikes, and routes trucks to the right dock. You declare the goal; the port logistics run themselves. Если контейнер — это морской контейнер, то Kubernetes — автоматизированный порт: решает, на какой корабль (машину) поставить каждый контейнер, заменяет упавшие за борт, добавляет ещё при всплеске трафика и направляет грузовики к нужному причалу. Ты объявляешь цель; логистика порта работает сама.
One lineОдной строкой Kubernetes = declarative autopilot for containers: you say what you want running; it places, heals, scales and connects it across many machines. Kubernetes = декларативный автопилот для контейнеров: ты говоришь, что должно работать; он размещает, чинит, масштабирует и связывает это по множеству машин.

2. Why does it exist?2. Зачем он нужен?

Docker runs one container on one machine. Real systems need hundreds or thousands across a cluster — and doing that by hand is impossible. Kubernetes automates the hard parts:

Docker запускает один контейнер на одной машине. Реальным системам нужны сотни и тысячи по кластеру — и делать это вручную невозможно. Kubernetes автоматизирует сложное:

  • Scheduling. Decides which machine has room (CPU/memory) to run each container.
  • Self-healing. A container crashes or a machine dies → Kubernetes restarts/reschedules it automatically.
  • Scaling. Add or remove replicas based on load (manually or auto-scaling).
  • Rollouts & rollbacks. Deploy a new version gradually; roll back instantly if it misbehaves.
  • Service discovery & networking. Containers find and talk to each other via stable names, with built-in load balancing.
  • Планирование. Решает, на какой машине есть место (CPU/память) для каждого контейнера.
  • Самовосстановление. Контейнер упал или умерла машина → Kubernetes перезапускает/переразмещает автоматически.
  • Масштабирование. Добавляет или убирает реплики по нагрузке (вручную или авто-скейлинг).
  • Раскатки и откаты. Деплоит новую версию постепенно; мгновенно откатывает, если ведёт себя плохо.
  • Service discovery и сеть. Контейнеры находят друг друга по стабильным именам, со встроенной балансировкой.
The core idea: reconciliationГлавная идея: reconciliation Kubernetes runs a constant control loop: compare desired state vs actual state, then act to close the gap. That's why it self-heals — it never stops reconciling. Kubernetes крутит постоянный control loop: сравнивает желаемое состояние с фактическим и действует, чтобы закрыть разницу. Поэтому он самовосстанавливается — он никогда не прекращает reconciliation.

3. Core concepts3. Ключевые понятия

① Pod① Pod

The smallest deployable unit — one (or a few tightly-coupled) containers that share network and storage. You rarely manage pods directly; higher objects manage them for you. Pods are disposable and can be killed and recreated anytime.

Наименьшая единица развёртывания — один (или несколько тесно связанных) контейнеров, делящих сеть и хранилище. Pod-ами редко управляют напрямую; за тебя это делают объекты выше. Pod-ы одноразовые: их могут убить и пересоздать в любой момент.

② Deployment② Deployment

Declares "I want N replicas of this pod, from this image". It keeps that many running, handles rolling updates and rollbacks. The workhorse for stateless apps.

Объявляет «хочу N реплик этого pod из этого образа». Держит столько запущенными, делает постепенные обновления и откаты. Рабочая лошадка для stateless-приложений.

③ Service③ Service

A stable network address + load balancer in front of a changing set of pods. Pods come and go with new IPs; the Service gives a constant name to reach them.

Стабильный сетевой адрес + балансировщик перед меняющимся набором pod-ов. Pod-ы появляются и исчезают с новыми IP; Service даёт постоянное имя для обращения к ним.

④ Namespace④ Namespace

A virtual partition of the cluster to isolate teams/environments (e.g. dev vs prod) and scope names, quotas and access.

Виртуальное разделение кластера, чтобы изолировать команды/окружения (например dev vs prod) и ограничить имена, квоты и доступ.

⑤ ConfigMap & Secret⑤ ConfigMap и Secret

Inject configuration and credentials into pods without baking them into the image. ConfigMap = non-sensitive config; Secret = passwords/keys (base64, ideally encrypted).

Прокидывают конфигурацию и креды в pod-ы, не запекая их в образ. ConfigMap = несекретный конфиг; Secret = пароли/ключи (base64, в идеале шифрованные).

⑥ Job & CronJob⑥ Job и CronJob

For batch work: a Job runs a pod to completion (e.g. a data processing task), and a CronJob runs Jobs on a schedule — the closest K8s primitives to a data pipeline run.

Для батч-работы: Job запускает pod до завершения (например задача обработки данных), а CronJob запускает Job-ы по расписанию — ближайшие примитивы K8s к запуску дата-пайплайна.

4. Architecture (high level)4. Архитектура (в целом)

A cluster has a control plane (the brain) and worker nodes (the muscle that runs your pods).

У кластера есть control plane (мозг) и worker nodes (мышцы, запускающие твои pod-ы).

CONTROL PLANE (the brain) ├─ API server ◀── you talk to this (kubectl, YAML) ├─ etcd ◀── key-value store: the cluster's desired + actual state ├─ scheduler ◀── picks which node each new pod runs on └─ controllers ◀── the reconciliation loops (keep N replicas, etc.) │ ▼ schedules pods onto… WORKER NODES (the muscle) ├─ kubelet ◀── agent on each node; starts/stops pods, reports health ├─ container runtime (e.g. containerd) ◀── actually runs containers └─ kube-proxy ◀── networking / routing to pods
Mental modelМодель в голове You declare desired state to the API server; it's stored in etcd; controllers reconcile it; the scheduler places pods; kubelets on nodes run them. Everything is a control loop chasing your declared goal. Ты объявляешь желаемое состояние API server-у; оно хранится в etcd; контроллеры его reconcile-ят; scheduler размещает pod-ы; kubelet-ы на нодах их запускают. Всё — control loop, догоняющий объявленную цель.

5. A minimal example5. Минимальный пример

A Deployment asking for 3 replicas of an app, declared in YAML and applied with one command.

Deployment, запрашивающий 3 реплики приложения, описанный в YAML и применённый одной командой.

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-pipeline
spec:
  replicas: 3                # desired state: keep 3 pods alive
  selector:
    matchLabels: { app: my-pipeline }
  template:
    metadata:
      labels: { app: my-pipeline }
    spec:
      containers:
        - name: worker
          image: my-pipeline:1.0   # the Docker image to run
          resources:
            requests: { cpu: "500m", memory: "512Mi" }
# apply it (declarative) and watch
kubectl apply -f deployment.yaml
kubectl get pods        # see your 3 pods; kill one → K8s recreates it
The self-healing demoДемо самовосстановления Delete a pod with kubectl delete pod ... and a new one appears within seconds. You asked for 3; the controller keeps reconciling back to 3. That loop is the whole essence of Kubernetes. Удали pod через kubectl delete pod ... — и новый появится за секунды. Ты попросил 3; контроллер постоянно reconcile-ит обратно к 3. Этот цикл и есть вся суть Kubernetes.

6. Why a data engineer cares6. Почему это важно дата-инженеру

  • Your orchestrators run on it. Flyte is Kubernetes-native; Airflow's KubernetesExecutor and Spark-on-K8s launch each task as a pod.
  • Elastic compute. A heavy backfill spins up many pods, then scales back down — you pay for what you use.
  • Resource isolation. Per-pod CPU/memory requests stop one greedy job from starving others.
  • Reliability for free. Self-healing + rescheduling means a crashed task or dead node doesn't silently stall your pipeline.
  • Provisioned by IaC. The cluster itself is usually created with Terraform (EKS/AKS/GKE), and you deploy onto it.
  • Твои оркестраторы работают на нём. Flyte — Kubernetes-native; KubernetesExecutor в Airflow и Spark-on-K8s запускают каждую таску как pod.
  • Эластичные вычисления. Тяжёлый бэкфил поднимает много pod-ов, затем сворачивается — платишь за то, что используешь.
  • Изоляция ресурсов. Запросы CPU/памяти на pod не дают одному жадному джобу голодоморить остальных.
  • Надёжность «бесплатно». Самовосстановление + переразмещение означают, что упавшая таска или мёртвая нода не застопорят пайплайн тихо.
  • Поднимается через IaC. Сам кластер обычно создаётся Terraform (EKS/AKS/GKE), а ты деплоишь на него.
The stack, top to bottomСтек сверху вниз Terraform provisions the K8s cluster → Kubernetes schedules containers → Docker images are those containers → Flyte/Airflow turn your pipeline tasks into them. Five pieces, one pipeline. Terraform поднимает кластер K8s → Kubernetes планирует контейнеры → образы Docker и есть эти контейнеры → Flyte/Airflow превращают таски пайплайна в них. Пять кусочков, один пайплайн.

7. Quick self-check7. Быстрая самопроверка

Answer in your head, then tap to flip.Ответь про себя, потом нажми, чтобы перевернуть.

Docker vs Kubernetes?Docker vs Kubernetes?
tapнажми
Docker builds/runs one container on one host. Kubernetes orchestrates many containers across a cluster: scheduling, scaling, healing, networking.Docker собирает/запускает один контейнер на одном хосте. Kubernetes оркеструет много контейнеров по кластеру: планирование, масштабирование, самовосстановление, сеть.
What is a Pod?Что такое Pod?
tapнажми
The smallest deployable unit: one or a few tightly-coupled containers sharing network/storage. Disposable — killed and recreated freely.Наименьшая единица развёртывания: один или несколько тесно связанных контейнеров с общей сетью/хранилищем. Одноразовый — свободно убивается и пересоздаётся.
How does Kubernetes self-heal?Как Kubernetes самовосстанавливается?
tapнажми
A control loop constantly compares desired vs actual state and acts to close the gap. Asked for 3 replicas, only 2 alive → it starts a 3rd.Control loop постоянно сравнивает желаемое и фактическое состояние и действует, закрывая разницу. Просил 3 реплики, живы 2 → запускает 3-ю.
Why do you need a Service?Зачем нужен Service?
tapнажми
Pods are ephemeral with changing IPs. A Service gives a stable name + load balancer in front of them, so others can reliably reach the pods.Pod-ы эфемерны и с меняющимися IP. Service даёт стабильное имя + балансировщик перед ними, чтобы к pod-ам можно было надёжно обращаться.
Control plane vs worker node?Control plane vs worker node?
tapнажми
Control plane = the brain (API server, etcd, scheduler, controllers) deciding what should run. Worker nodes = the machines (kubelet + runtime) that actually run the pods.Control plane = мозг (API server, etcd, scheduler, контроллеры), решающий, что должно работать. Worker nodes = машины (kubelet + рантайм), реально запускающие pod-ы.
Which K8s object fits a data pipeline run?Какой объект K8s подходит для запуска дата-пайплайна?
tapнажми
A Job (runs a pod to completion) or a CronJob (Jobs on a schedule). Deployments are for long-running services, not batch tasks.Job (запускает pod до завершения) или CronJob (Job-ы по расписанию). Deployment — для долгоживущих сервисов, не для батч-задач.