Облачные вычисления

Виртуализация и контейнеры

В 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-VVirtualBox, 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/` - при изменении кода зависимости не переустанавливаются.

ПараметрVMContainer
Размер образа1-10 GB50-500 MB
Время запуска30-60 секунд< 1 секунды
RAM overhead~500 MB (ядро ОС)~5-10 MB
ИзоляцияАппаратная (hypervisor)Программная (namespaces, cgroups)
Плотность~10 VM на сервер~100+ контейнеров на сервер
ОркестрацияVMware vSphereKubernetes, Docker Swarm

**Kubernetes (K8s)** - стандарт оркестрации контейнеров. Управляет тысячами контейнеров: автомасштабирование, self-healing (перезапуск упавших), rolling updates, service discovery. Google запускает 4 миллиарда контейнеров в неделю на Kubernetes.

Почему в Dockerfile сначала копируют package.json, устанавливают зависимости, и только потом копируют исходный код?

Serverless: функции как сервис

Сервис обработки изображений: загрузили фото - нужен thumbnail. Трафик непредсказуем: 0 запросов ночью, тысячи в час пик. VM простаивает 20 часов из 24. Платить за простой? **Serverless** - следующий шаг абстракции. Код пишется как функция, загружается в облако, выполняется в ответ на событие. Между вызовами функция не существует.

ПровайдерServerless-сервисЛимиты
AWSLambda15 мин макс, 10 GB RAM, 1000 параллельных вызовов
GCPCloud Functions60 мин макс, 32 GB RAM, 3000 параллельных вызовов
AzureFunctions230 сек (Consumption), без лимита (Premium)
CloudflareWorkers30 сек 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
Виртуализация и контейнеры

0

1

Войти