Технология контейнеризации позволяет запускать приложения в отдельных независимых средах — контейнерах. Они упрощают развертывание приложений, изолируют их друг от друга и ускоряют разработку. Но когда контейнеров становится слишком много, ими трудно управлять. Тут на помощь приходят системы оркестровки.
В статье разберем, чем может быть полезен Docker Swarm и в каких случаях стоит присмотреться к более продвинутым решениям.
Что такое Docker Swarm и чем он может быть полезен
При построении крупной продакшн-системы в нее обязательно закладывают требования по отказоустойчивости, производительности и масштабируемости. То есть система должна быть защищена от сбоев, не тормозить и иметь возможность для увеличения мощности.
Обычно для этого создают кластер — отдельностоящие хосты (серверы) объединяют под общим управлением, со стороны это выглядит как единая система. При этом она намного устойчивее к сбоям и производительнее:
- Отказоустойчивость достигается благодаря избыточности хостов (в рамках кластера они называются нодами). Система работает сразу на нескольких нодах, если одна из них выйдет из строя, остальные спокойно продолжат работу.
- Балансировка нагрузки позволяет равномерно нагрузить каждую ноду. Кластер следит за нагрузкой и сам распределяет внутри себя задачи: одну программу запустит на одной ноде, другую программу — на другой.
- Масштабируемость помогает подстраивать производительность кластера под нагрузку. Если приложениям и сервисам не хватает ресурсов, можно быстро подключить дополнительные ноды.
При работе с контейнерами эти задачи решают системы оркестровки. Оркестровка — это управление и координация взаимодействия между контейнерами. Контейнеры запускаются на хостах, а хосты объединяют в кластер.
У Docker есть стандартный инструмент оркестровки — Docker Swarm Mode, или просто Docker Swarm. Он поставляется «из коробки», довольно прост в настройке и позволяет создать простой кластер буквально за минуту.
Кластер Swarm (Docker Swarm Cluster) состоит из нод, которые делят на два типа:
- Управляющая нода (Manager). Это нода, которая принимает запросы и распределяет задачи между всеми нодами в кластере. Менеджеров может (и должно) быть несколько, но среди них обязательно есть одна самая главная нода — лидер, который управляет всем кластером.
- Рабочая нода (Worker). Подчиненная нода, которая не принимает решений, а просто выполняет отправляемые ей задачи.
В 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 со своими сложностями, когда уже есть «родной» и простой Docker Swarm?
Дело в том, что Kubernetes позволяет решать задачи, которые не под силу Docker Swarm. Для примера возьмем автомасштабирование: это когда система сама подстраивает свою мощность под нагрузку. Для этого в кластер автоматически добавляются/удаляются ноды, либо в существующих нодах для «тяжелых» задач будет выделяться больше/меньше ресурсов.
Например, в конце месяца бухгалтерия ведет особо активную работу: считает зарплату, сверяет счета на оплату и готовит отчеты. В такие периоды нагрузка на систему возрастает. Если ресурсов не будет хватать, то у бухгалтеров начнут тормозить программы и они не смогут нормально работать.
Но если система умеет масштабироваться, она отреагирует на возросшую нагрузку и увеличит ресурсы для этих задач. А когда нагрузка спадет, снова освободит эти мощности. Если кластер размещен в облаке, автомасштабирование сильно экономит деньги. В моменты простоя неиспользуемые ресурсы освобождаются, и за них не нужно переплачивать.
Так вот, в Kubernetes можно настроить автомасштабирование. Да, придется написать конфигурационный файл и выполнить другие настройки, но в результате вы получите рабочую и стабильную систему. А если развернуть кластер в облаке, которое поддерживает автомасштабирование, то на настройку уйдет всего несколько минут.
Docker Swarm не умеет делать этого «из коробки». Можно построить автомасштабируемую систему с использованием Swarm. Но для этого придется вручную писать скрипты или программы, которые будут следить за нагрузкой, принимать решения и посылать команды в Docker Swarm. Либо можно использовать сторонние разработки, вроде Orbiter, но его возможности тоже ограничены, и в любом случае это еще одна дополнительная надстройка над Swarm.
Теперь представьте, что кроме автомасштабирования у вас есть другие задачи, для которых приходится городить кучу инструментов над Swarm. Всё это нужно поддерживать, понимать как оно работает и тщательно тестировать при обновлениях. В Kubernetes такие сложности спрятаны внутри, и они стабильно работают.
Резюме: Kubernetes — это универсальный солдат. У него много возможностей, но потому он сложный для самостоятельного освоения и настройки, хотя использование готовых облачных сервисов значительно упрощает дело.
Docker Swarm vs Kubernetes: что выбрать?
Приведем краткое сравнение двух технологий: какие у них плюсы и минусы, в каких случаях их лучше использовать.
Docker Swarm
Docker Swarm — это встроенный инструмент кластеризации, который работает «из коробки». Он прост в использовании и настройке, но не очень гибок.
Kubernetes
Kubernetes — это универсальное средство для создания распределенных систем. Это сложная система с большим количеством возможностей, которую не так просто настроить самостоятельно. Но если разместить Kubernetes как сервис в облаке, это значительно упрощает его настройку и использование.
Резюме: что выбрать Kubernetes или Docker Swarm
- Docker Swarm — это стандартная система оркестровки Docker, которая решает базовые задачи. Он прост в установке и настройке, но не очень гибок.
- Kubernetes — мощная система оркестровки, которая позволяет строить масштабные распределенные системы. Но он не так прост в установке и настройке, не каждый инженер сходу сможет разобраться в нем.
- Облачные провайдеры позволяют устранить главный недостаток Kubernetes — сложность. С их помощью можно развернуть готовый кластер за 10 минут.
Автор: Марат Талипов
Источники: https://mcs.mail.ru/blog/docker-swarm-ili-kubernetes-chto-luchshe
Что еще почитать:
90+ полезных инструментов для Kubernetes: развертывание, управление, мониторинг, безопасность и не только
Лучшие практики и рекомендации для запуска контейнеров и Kubernetes в производственных средах
Рабочие узлы Kubernetes: много маленьких или несколько больших?