Облачные вычисления
Виртуализация и контейнеры
В 2013 году Docker выпустил первую версию, и индустрия изменилась навсегда. До Docker деплой выглядел как: «у меня на машине работает, а на сервере - нет». После Docker: один образ работает одинаково везде - на ноутбуке, в CI, в production. Как прошли путь от гигабайтных VM до контейнеров, которые стартуют за миллисекунды?
- **Google** запускает 4 миллиарда контейнеров в неделю - каждый поисковый запрос обрабатывается в контейнере
- **Spotify** мигрировал 1200 микросервисов в Kubernetes - время деплоя сократилось с часов до минут
- **AWS Lambda** обрабатывает триллионы вызовов в месяц - от IoT-сенсоров до API для мобильных приложений
От mainframe к контейнерам: 60 лет изоляции
1966 год, IBM CP/CMS - первая система виртуализации для mainframe. Один дорогой компьютер делили между десятками пользователей, каждый думал, что работает на выделенной машине. 1979 год: Unix chroot - первый примитив изоляции процессов в файловой системе. 2000 год: FreeBSD jails - полноценная изоляция процессов. 2008 год: Linux LXC (Linux Containers) - первые нативные контейнеры. 2013 год: Docker абстрагирует LXC и делает контейнеры доступными для всех. Спустя 60 лет та же идея мейнфрейма - один контейнер обходится в USD 0.0001 за секунду.
Предварительные знания
Hypervisor: менеджер виртуальных машин
2006 год, Amazon Web Services запускает EC2. Впервые в истории можно арендовать сервер за минуту и платить по секундам. Технология, которая это сделала возможным - **hypervisor**: программа, позволяющая запускать несколько операционных систем на одном физическом сервере. Каждая ОС получает виртуализированные ресурсы и думает, что владеет настоящим железом.
| Характеристика | Type 1 (Bare-metal) | Type 2 (Hosted) |
|---|---|---|
| Где работает | Прямо на железе | Поверх хост-ОС |
| Примеры | VMware ESXi, KVM, Xen, Hyper-V | VirtualBox, VMware Workstation, Parallels |
| Производительность | Высокая (прямой доступ к hardware) | Ниже (через хост-ОС) |
| Использование | Дата-центры, облака | Разработка, тестирование |
| Латентность | ~2-5% overhead | ~10-20% overhead |
**KVM (Kernel-based Virtual Machine)** - hypervisor, встроенный прямо в ядро Linux. Это основа AWS EC2, Google Cloud и большинства OpenStack-облаков. EC2-инстансы работают на KVM.
Hardware-assisted virtualization (Intel VT-x, AMD-V) - специальные инструкции процессора, которые позволяют hypervisor эффективно изолировать VM. Без них виртуализация была медленной и небезопасной.
AWS запускает EC2-инстансы для миллионов клиентов. Какой тип hypervisor используется?
Виртуальные машины
Стартап разворачивает 20 микросервисов. Каждый в отдельной VM - каждая со своим ядром Ubuntu. 20 ядер ОС по 500 MB RAM = 10 GB только на операционные системы. Диск: 10 GB x 20 = 200 GB впустую. **Виртуальная машина (VM)** - полная эмуляция компьютера с собственной ОС, ядром, драйверами и файловой системой. Полная изоляция - как отдельный физический сервер.
| Характеристика | Значение |
|---|---|
| Изоляция | Полная - отдельное ядро ОС, собственная память |
| Размер образа | Гигабайты (полная ОС + приложение) |
| Время запуска | Минуты (загрузка ОС, инициализация сервисов) |
| Overhead | Каждая VM - полная ОС (ядро ~500MB RAM минимум) |
| Безопасность | Высокая - аппаратная изоляция через hypervisor |
**AMI (Amazon Machine Image)** - снимок VM, из которого запускается новый инстанс. Включает ОС, предустановленный софт, конфигурацию. Можно создавать свои AMI или использовать готовые из Marketplace.
**Проблема VM:** если 20 микросервисов, каждый в своей VM - это 20 полных операционных систем. ~10 GB дискового пространства и ~500 MB RAM только на ядро ОС для каждой VM. Умножаем: 10 GB x 20 = 200 GB дисков впустую.
**Когда VM - правильный выбор:** 1. Нужна полная изоляция (multi-tenant) 2. Разные ОС на одном сервере 3. Compliance требует hardware-level изоляции 4. Legacy-приложение с зависимостями уровня ОС.
10 микросервисов на Node.js, каждый в отдельной VM (Ubuntu 22.04). Какая основная проблема этого подхода?
Контейнеры и Docker
2013 год. Solomon Hykes показывает на конференции PyCon пятиминутное демо Docker. Зал аплодирует стоя. «It works on my machine» - проблема, которую знает каждый разработчик, только что получила решение. **Контейнер** - изолированный процесс, использующий ядро хост-ОС вместо собственного. Нет отдельной ОС, нет отдельного ядра - только приложение и его зависимости.
**Docker Image vs Container:** Image - это blueprint (класс), Container - это запущенный экземпляр (объект). Из одного Image можно запустить 100 Containers. Image неизменяем (immutable), Container - живой процесс.
**Layers и кеширование** - ключевая оптимизация Docker. Каждая инструкция в Dockerfile создаёт слой. Если слой не изменился - Docker использует кеш. Поэтому `COPY package.json` идёт перед `COPY src/` - при изменении кода зависимости не переустанавливаются.
| Параметр | VM | Container |
|---|---|---|
| Размер образа | 1-10 GB | 50-500 MB |
| Время запуска | 30-60 секунд | < 1 секунды |
| RAM overhead | ~500 MB (ядро ОС) | ~5-10 MB |
| Изоляция | Аппаратная (hypervisor) | Программная (namespaces, cgroups) |
| Плотность | ~10 VM на сервер | ~100+ контейнеров на сервер |
| Оркестрация | VMware vSphere | Kubernetes, Docker Swarm |
**Kubernetes (K8s)** - стандарт оркестрации контейнеров. Управляет тысячами контейнеров: автомасштабирование, self-healing (перезапуск упавших), rolling updates, service discovery. Google запускает 4 миллиарда контейнеров в неделю на Kubernetes.
Почему в Dockerfile сначала копируют package.json, устанавливают зависимости, и только потом копируют исходный код?
Serverless: функции как сервис
Сервис обработки изображений: загрузили фото - нужен thumbnail. Трафик непредсказуем: 0 запросов ночью, тысячи в час пик. VM простаивает 20 часов из 24. Платить за простой? **Serverless** - следующий шаг абстракции. Код пишется как функция, загружается в облако, выполняется в ответ на событие. Между вызовами функция не существует.
| Провайдер | Serverless-сервис | Лимиты |
|---|---|---|
| AWS | Lambda | 15 мин макс, 10 GB RAM, 1000 параллельных вызовов |
| GCP | Cloud Functions | 60 мин макс, 32 GB RAM, 3000 параллельных вызовов |
| Azure | Functions | 230 сек (Consumption), без лимита (Premium) |
| Cloudflare | Workers | 30 сек CPU, 128 MB RAM, edge-локации по всему миру |
**Event-driven архитектура** - функция вызывается событием: HTTP-запрос, загрузка файла в S3, сообщение в очереди, расписание (cron). Между вызовами функция не существует - оплата только за фактическое время выполнения.
**Cold Start** - главный недостаток Serverless. При первом вызове (или после простоя) функция просыпается: создаётся контейнер, загружается код, инициализируются зависимости. Это занимает 100ms-3s в зависимости от языка и размера. Java/C# - медленнее, Node.js/Python - быстрее.
**Когда Serverless не подходит:** 1. Длительные вычисления > 15 мин 2. Нужен постоянный WebSocket 3. Высокочастотные вызовы (дешевле держать сервер) 4. Критичная латентность (cold start неприемлем).
Serverless значит 'без серверов' - код выполняется в облаке сам по себе
Серверы существуют, просто их не видно и не нужно ими управлять. AWS Lambda запускает код внутри Firecracker microVM - специальной микро-VM, созданной именно для этого
Название 'serverless' описывает опыт разработчика, а не архитектуру. Не нужно думать о серверах - но под капотом AWS автоматически создаёт и уничтожает контейнеры для каждого вызова функции
Сервис обрабатывает 100 запросов в час, каждый по 200ms. Что выгоднее: EC2 t3.micro или AWS Lambda?
Ключевые идеи
- **Hypervisor** делит физический сервер на VM. Type 1 (bare-metal) - для дата-центров, Type 2 (hosted) - для разработки
- **VM** - полная ОС с ядром. Полная изоляция, но тяжёлые (гигабайты) и медленный старт (минуты)
- **Контейнеры (Docker)** - процесс с изоляцией, использует ядро хост-ОС. Лёгкие (мегабайты), мгновенный старт
- **Serverless** - пишется только функция, всё остальное управляется облаком. Pay-per-execution
- Docker 2013: принцип «build once, run anywhere» теперь реальность - образ с ноутбука деплоится в production без изменений
Связанные темы
Виртуализация и контейнеры - это «как» работает облако. Дальше разберём «где» оно работает:
- Регионы, зоны и доступность — Где физически живут VM и контейнеры
- Введение в облачные вычисления — IaaS/PaaS/SaaS - уровни абстракции над виртуализацией
Вопросы для размышления
- На текущем проекте используются VM, контейнеры или serverless? Подходит ли этот выбор под нагрузку?
- При проектировании архитектуры для 50 микросервисов - что выбрать: VM, Docker + Kubernetes или Serverless? Почему?
- Какие задачи в проектах идеально подходят для Serverless (редкие, event-driven, short-lived)?
Связанные уроки
- cloud-01 — Введение в облако задаёт модель IaaS/PaaS/SaaS поверх виртуализации
- cloud-03 — Регионы и зоны - где физически живут VM и контейнеры
- devops-04 — Docker и Kubernetes - практика управления контейнерами
- devops-02 — Linux - фундамент: namespaces и cgroups под капотом контейнеров
- cloud-07 — Kubernetes оркестрирует контейнеры в масштабе кластера
- sec-05 — Безопасность контейнеров: изоляция, scan образов, runtime security
- os-12-virtualization