Технология контейнеризации позволяет запускать приложения в отдельных независимых средах — контейнерах. Они упрощают развертывание приложений, изолируют их друг от друга и ускоряют разработку. Но когда контейнеров становится слишком много, ими трудно управлять. Тут на помощь приходят системы оркестровки.

В статье разберем, чем может быть полезен Docker Swarm и в каких случаях стоит присмотреться к более продвинутым решениям.

Что такое Docker Swarm и чем он может быть полезен

При построении крупной продакшн-системы в нее обязательно закладывают требования по отказоустойчивости, производительности и масштабируемости. То есть система должна быть защищена от сбоев, не тормозить и иметь возможность для увеличения мощности.

Обычно для этого создают кластер — отдельностоящие хосты (серверы) объединяют под общим управлением, со стороны это выглядит как единая система. При этом она намного устойчивее к сбоям и производительнее:

  • Отказоустойчивость достигается благодаря избыточности хостов (в рамках кластера они называются нодами). Система работает сразу на нескольких нодах, если одна из них выйдет из строя, остальные спокойно продолжат работу.
  • Балансировка нагрузки позволяет равномерно нагрузить каждую ноду. Кластер следит за нагрузкой и сам распределяет внутри себя задачи: одну программу запустит на одной ноде, другую программу — на другой.
  • Масштабируемость помогает подстраивать производительность кластера под нагрузку. Если приложениям и сервисам не хватает ресурсов, можно быстро подключить дополнительные ноды.

При работе с контейнерами эти задачи решают системы оркестровки. Оркестровка — это управление и координация взаимодействия между контейнерами. Контейнеры запускаются на хостах, а хосты объединяют в кластер.

У Docker есть стандартный инструмент оркестровки — Docker Swarm Mode, или просто Docker Swarm. Он поставляется «из коробки», довольно прост в настройке и позволяет создать простой кластер буквально за минуту.

Кластер Swarm (Docker Swarm Cluster) состоит из нод, которые делят на два типа:

  • Управляющая нода (Manager). Это нода, которая принимает запросы и распределяет задачи между всеми нодами в кластере. Менеджеров может (и должно) быть несколько, но среди них обязательно есть одна самая главная нода — лидер, который управляет всем кластером.
  • Рабочая нода (Worker). Подчиненная нода, которая не принимает решений, а просто выполняет отправляемые ей задачи.
Схематичное устройство кластера Docker Swarm: три управляющих ноды и семь рабочих. Источник

В Docker Swarm вместо прямого использования контейнеров используются сервисы (Docker Swarm Service). Они похожи на контейнеры, но всё же это немного другое понятие.

Сервис — это что-то вроде уровня абстракции над контейнерами. В Swarm мы не запускаем контейнеры явно — этим занимаются сервисы. Для достижения отказоустойчивости мы лишь указываем сервису количество реплик — нод, на которых он должен запустить контейнеры. А Swarm уже сам проследит за тем, чтобы это требование выполнялось: найдет подходящие хосты, запустит контейнеры и будет следить за ними. Если один из хостов отвалится — создаст новую реплику на другом хосте.

Резюме: Docker Swarm — встроенное в Докер решение для оркестровки контейнеров, которое выполняет базовые функции и которое легко настроить.

Что такое Kubernetes и в чем его преимущества перед Swarm

Кроме стандартного Docker Swarm есть и другие инструменты оркестровки, например Kubernetes. Это сложная система, которая позволяет построить отказоустойчивую и масштабируемую платформу для управления контейнерами. Он умеет работать не только с контейнерами Docker, но и с другими контейнерами: rkt, CRI-O.

У Kubernetes довольно много возможностей, которые позволяют строить масштабные распределенные системы. Из-за этого порог вхождения в технологию гораздо выше, чем в Swarm. Нужно обладать определенным уровнем знаний, а на первоначальную установку и настройку может уйти несколько дней.

Всю сложность настройки Kubernetes можно переложить на плечи облачного провайдера. Например, на облачной платформе Mail.ru Cloud Solutions процессы установки и настройки автоматизированы и позволяют получить готовый кластер за 10 минут. И конечно же, вам не нужно беспокоиться о его поддержке.

Если смотреть глобально, то устройство Kubernetes похоже на Swarm. Кластер состоит из двух типов нод: главной (Master) и рабочих (Worker):

  • Master-нода следит за состоянием своего кластера, распределяет нагрузку и разворачивает контейнеры на нодах.
  • Рабочие ноды обрабатывают поступающие запросы.

Но если смотреть глубже, то устройство Kubernetes гораздо сложнее. В нем отдельные модули, например: proxy-балансировщик, etcd для хранения состояния кластера и другие компоненты. Не будем подробно всё это описывать. Достаточно понять, что Kubernetes устроен гораздо сложнее, чем Docker Swarm.

Глобально Kubernetes похож на Swarm. Но внутри все гораздо сложнее. Источник

Так зачем нужен Kubernetes со своими сложностями, когда уже есть «родной» и простой Docker Swarm?

Дело в том, что Kubernetes позволяет решать задачи, которые не под силу Docker Swarm. Для примера возьмем автомасштабирование: это когда система сама подстраивает свою мощность под нагрузку. Для этого в кластер автоматически добавляются/удаляются ноды, либо в существующих нодах для «тяжелых» задач будет выделяться больше/меньше ресурсов.

Например, в конце месяца бухгалтерия ведет особо активную работу: считает зарплату, сверяет счета на оплату и готовит отчеты. В такие периоды нагрузка на систему возрастает. Если ресурсов не будет хватать, то у бухгалтеров начнут тормозить программы и они не смогут нормально работать.

Но если система умеет масштабироваться, она отреагирует на возросшую нагрузку и увеличит ресурсы для этих задач. А когда нагрузка спадет, снова освободит эти мощности. Если кластер размещен в облаке, автомасштабирование сильно экономит деньги. В моменты простоя неиспользуемые ресурсы освобождаются, и за них не нужно переплачивать.

Так вот, в Kubernetes можно настроить автомасштабирование. Да, придется написать конфигурационный файл и выполнить другие настройки, но в результате вы получите рабочую и стабильную систему. А если развернуть кластер в облаке, которое поддерживает автомасштабирование, то на настройку уйдет всего несколько минут.

Docker Swarm не умеет делать этого «из коробки». Можно построить автомасштабируемую систему с использованием Swarm. Но для этого придется вручную писать скрипты или программы, которые будут следить за нагрузкой, принимать решения и посылать команды в Docker Swarm. Либо можно использовать сторонние разработки, вроде Orbiter, но его возможности тоже ограничены, и в любом случае это еще одна дополнительная надстройка над Swarm.

Теперь представьте, что кроме автомасштабирования у вас есть другие задачи, для которых приходится городить кучу инструментов над Swarm. Всё это нужно поддерживать, понимать как оно работает и тщательно тестировать при обновлениях. В Kubernetes такие сложности спрятаны внутри, и они стабильно работают.

Резюме: Kubernetes — это универсальный солдат. У него много возможностей, но потому он сложный для самостоятельного освоения и настройки, хотя использование готовых облачных сервисов значительно упрощает дело.
Kubernetes как сервис с сертификацией CNCF
Беспроблемная доставка ваших приложений

Docker Swarm vs Kubernetes: что выбрать?

Приведем краткое сравнение двух технологий: какие у них плюсы и минусы, в каких случаях их лучше использовать.

Docker Swarm

Docker Swarm — это встроенный инструмент кластеризации, который работает «из коробки». Он прост в использовании и настройке, но не очень гибок.

ПлюсыПростота и скорость настройки Docker Swarm: рабочий кластер Swarm можно поднять за минуту.

Инструменты, совместимые с Docker: большинство команд Docker CLI будет работать в Swarm.
МинусыУзкая функциональность: возможности ограничены Docker API. Это значит, что Swarm способен сделать лишь то, что позволяют возможности Docker.
Для кого подойдетДля небольших компаний или проектов, где не нужна гибкость Kubernetes.

Kubernetes

Kubernetes — это универсальное средство для создания распределенных систем. Это сложная система с большим количеством возможностей, которую не так просто настроить самостоятельно. Но если разместить Kubernetes как сервис в облаке, это значительно упрощает его настройку и использование.

ПлюсыМощный инструмент. У Kubernetes много возможностей, которые позволяют строить действительно сложные распределенные системы.

Не зависит от Docker. Kubernetes умеет работать с разными системами контейнеризации, хотя чаще всего используется Докер и его контейнеры.
МинусыСложность настройки: часто нужны более глубокие знания и больше времени на установку и настройку.

Для управления используется отдельный набор команд и инструментов, несовместимых с Docker CLI.
Для кого подойдетДля больших компаний или проектов, где нужна гибкая настройка всей инфраструктуры.

Резюме: что выбрать Kubernetes или Docker Swarm

  1. Docker Swarm — это стандартная система оркестровки Docker, которая решает базовые задачи. Он прост в установке и настройке, но не очень гибок.
  2. Kubernetes — мощная система оркестровки, которая позволяет строить масштабные распределенные системы. Но он не так прост в установке и настройке, не каждый инженер сходу сможет разобраться в нем.
  3. Облачные провайдеры позволяют устранить главный недостаток Kubernetes — сложность. С их помощью можно развернуть готовый кластер за 10 минут.