Skip to content

Latest commit

 

History

History
153 lines (117 loc) · 11.6 KB

File metadata and controls

153 lines (117 loc) · 11.6 KB

← Оглавление

Kubernetes

Docker запускает контейнеры, Kubernetes ими управляет — на десятках машин, сам, круглосуточно


Kubernetes (k8s) — система оркестрации контейнеров: она запускает и держит в рабочем состоянии множество контейнеров на кластере машин, сама перезапускает упавшие, масштабирует под нагрузку и балансирует трафик. Если Docker отвечает на вопрос «как упаковать и запустить один контейнер», то Kubernetes — «как надёжно крутить сотни контейнеров в проде». Проект родился в Google (из системы Borg), сейчас развивается под эгидой CNCF и стал отраслевым стандартом.

Проблема: Compose не тянет прод-кластер

Docker Compose поднимает связку сервисов на одной машине — этого хватает для разработки. В проде появляются задачи, которых Compose не решает:

  • контейнер упал ночью — кто его перезапустит?
  • нагрузка выросла — кто добавит копии и распределит трафик?
  • обновляем версию — как выкатить без простоя и откатить при сбое?
  • сервисов десятки на десятке серверов — как ими управлять как одним целым?

Kubernetes делает это автоматически: ты описываешь желаемое состояние, а он постоянно приводит реальность к нему.

Как устроено

        КЛАСТЕР
┌──────────────────────────────────────────┐
│  Control Plane (управление)               │
│  API server · scheduler · controllers · etcd │
├──────────────────────────────────────────┤
│  Node 1            Node 2            Node 3│
│  ┌──────┐          ┌──────┐         ┌──────┐│
│  │ Pod  │          │ Pod  │         │ Pod  ││
│  └──────┘          └──────┘         └──────┘│
└──────────────────────────────────────────┘
  • Кластер — набор машин, управляемых как одно целое.
  • Node (узел) — машина (VM или физическая), где реально крутятся контейнеры.
  • Control Plane — «мозг»: API-сервер (точка входа, kubectl ходит сюда), scheduler (раскладывает поды по узлам), controllers (следят за желаемым состоянием), etcd (хранилище состояния кластера).

Основные объекты

  • Pod — наименьшая единица развёртывания: один (обычно) или несколько контейнеров, разделяющих сеть и хранилище. Поды эфемерны — умирают и пересоздаются, IP меняется.
  • Deployment — декларирует желаемое состояние: сколько реплик пода держать, какой образ. Сам пересоздаёт упавшие поды (self-healing), катит новые версии и откатывает (rollout/rollback). Под капотом управляет ReplicaSet (поддерживает N копий).
  • Service — стабильный сетевой адрес и балансировщик для группы подов. Поды меняются — Service остаётся точкой входа (решает проблему эфемерных IP).
  • Ingress — HTTP(S)-маршрутизация снаружи в сервисы (по хосту/пути), TLS.
  • ConfigMap / Secret — конфигурация и секреты отдельно от образа (secret — для паролей/токенов).
  • Namespace — логическое разделение кластера (dev/prod, команды).

Декларативность: желаемое состояние

Главная идея: ты не командуешь «запусти контейнер», а описываешь, что хочешь, в YAML — Kubernetes сам приводит кластер к этому состоянию и удерживает его (reconciliation loop).

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3                    # держать 3 копии пода
  selector:
    matchLabels: { app: web }
  template:                      # шаблон пода
    metadata:
      labels: { app: web }
    spec:
      containers:
        - name: web
          image: myapp:1.2
          ports: [{ containerPort: 8000 }]
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector: { app: web }         # какие поды обслуживать (по метке)
  ports:
    - port: 80
      targetPort: 8000
  type: ClusterIP                # ClusterIP (внутри) / NodePort / LoadBalancer (наружу)
kubectl apply -f deployment.yaml   # применить желаемое состояние

Убил один под руками — Deployment тут же поднимет новый: реальность всегда стремится к описанному.

Что даёт

  • Self-healing — упавший под/узел заменяется автоматически.
  • Масштабирование — вручную (kubectl scale) или авто (HPA — по нагрузке CPU/памяти).
  • Rolling update — выкатка новой версии по одному поду без простоя; сбой — автоматический откат.
  • Service discovery + балансировка — сервисы находят друг друга по имени, трафик делится между подами.
  • Декларативная инфраструктура — весь кластер описан в YAML под гитом (GitOps).

Docker Compose против Kubernetes

Docker Compose Kubernetes
Масштаб один хост кластер из многих узлов
Назначение разработка, простой прод продакшн под нагрузкой
Self-healing restart политики полноценный (поды, узлы)
Масштабирование вручную ручное и авто (HPA)
Обновления без простоя нет rolling update + откат
Сложность низкая высокая

Когда нужен — и когда нет

  • Нужен: много сервисов (микросервисы), высокая нагрузка/доступность, авто-масштабирование, несколько команд и окружений.
  • Не нужен: один-два сервиса, небольшой проект, стартап на старте — Compose или PaaS проще и дешевле. Kubernetes сложен в эксплуатации; не тащи его «на вырост» (та же ошибка, что с микросервисами на вырост).

kubectl — основные команды

kubectl apply -f app.yaml               # применить/обновить манифесты
kubectl get pods                        # список подов (-A — во всех namespace)
kubectl get deploy,svc                  # деплойменты и сервисы
kubectl describe pod <имя>              # детали и события пода (диагностика)
kubectl logs -f <имя>                   # логи пода потоком
kubectl exec -it <имя> -- bash          # войти внутрь пода
kubectl scale deployment/web --replicas=5
kubectl rollout status deployment/web   # статус выкатки
kubectl rollout undo deployment/web     # откатить к прошлой версии

Ловушки

Kubernetes «на вырост». Он решает проблемы масштаба, которых у маленького проекта нет, зато добавляет огромную операционную сложность (кластер, сеть, мониторинг). Пока Compose/PaaS справляются — не переходи.

Под ≠ контейнер. Под — обёртка над одним (обычно) контейнером; масштабируют и пересоздают именно поды. Не клади в один под несвязанные сервисы «чтобы рядом».

Секреты в манифестах. Secret в base64 — это не шифрование; не коммить секреты в гит открыто, используй внешние хранилища/шифрование (Веб-безопасность).

Поды эфемерны. Локальные данные пода исчезают при пересоздании — состояние держат во внешней БД или в persistent volume, не в поде.

Связи

  • Docker — упаковка приложения в образ/контейнер; Kubernetes оркеструет эти контейнеры;
  • Монолит и микросервисы — k8s — типичная среда для микросервисов (масштаб, изоляция);
  • CI CD — пайплайн собирает образ и выкатывает его в кластер (kubectl apply);
  • Развертывание проекта — деплой приложения; k8s — прод-уровень оркестрации;
  • RabbitMQ · Redis · PostgreSQL — сервисы, которые в проде часто крутятся рядом (или как managed);
  • YAML — язык манифестов Kubernetes.

Источники