Содержание:
- Что такое контейнеризация и почему она важна
- Что такое Docker
- Что такое Kubernetes
- Проблема оркестрации контейнеров
- В чем разница Kubernetes и Docker Swarm
- Заключение
Говоря о технологии виртуализации вообще и контейнеризацию в частности, невозможно обойти вниманием два ключевых для этого направления инструмента — Docker и Kubernetes. Ведь они не только крайне популярны, но и напрямую связаны друг с другом по функционалу — позволяют создавать и обслуживать среды для запуска контейнеризованных приложений.
В этой статье разберём базовые различия между Kubernetes и Docker, основные области их применения, а также некоторые проблемы, связанные с этими технологиями, например вопрос мониторинга. Но сначала немного погрузимся в теорию.
Почему контейнеризация важна
Что такое контейнер приложения
Контейнеризация (контейнерная виртуализация) — это метод виртуализации, при котором единое «пользовательское пространство» в ядре операционной системы разделяется на несколько независимых логических разделов. Один экземпляр такого раздела называется контейнером или зоной. В каждом контейнере можно запускать одно приложение, изолированное от остальной системы.
Контейнер функционирует как экземпляр исполняемого ПО, где двоичный код приложения соседствует со всеми необходимыми для его запуска компонентами — от конфигурационных файлов до среды исполнения. Каждое приложение в контейнере получает свою собственную частную сеть и виртуальную файловую систему, которая не используется совместно с другими контейнерами или хостом.
Чем отличается контейнеризация от виртуализации
По своему функционалу и назначению контейнеры приложений похожи на виртуальные машины (VM), которые действуют на основе аппаратной виртуализации. Однако, не следует напрямую отождествлять понятия «контейнеризация» и «аппаратная виртуализация». Это отдельные технологии виртуализации, которые решают схожие задачи разными способами.
Виртуальная машина — это полноценная операционная система внутри другой ОС, с собственным ядром и другими изолированными ресурсами. Контейнер — не готовый «компьютер», а лишь изолированный механизм для запуска одного приложения.
В отличие от аппаратной виртуализации, контейнеризация обеспечивает разделение ресурсов не на аппаратном уровне, а на базе ядра операционной системы. Контейнеры более легковесны, менее требовательны и полностью зависимы от «материнской» ОС, чем VM.
Зачем нужна контейнеризация
Контейнеры решают критически важную проблему переносимости кода. Они сводят на нет возможные противоречия между собственной локальной средой разработки и производственной средой приложения.
Упаковка в контейнеры позволяя отделить код от базовой инфраструктуры, в которой он работает. В производственной среде этот контейнер можно запускать на любом компьютере, на котором есть платформа контейнеризации. В продакшене код будет работать также хорошо, как и на машине программиста.
Преимущества контейнеризации
- Контейнеризация стала ключевым техническим компонентом для обеспечения непрерывного развертывания и уменьшения жизненного цикла инновации продукта. Благодаря тому, что предприятия разбивают монолитную архитектуру своих производств на гибкие контейнерные микросервисы, время вывода на рынок начинает отсчитываться не в месяцах, а в днях.
- Упрощение конфигурирования приложений. Стандартный контейнер Docker универсален. Упакованное в него приложение может работать без дополнительных настроек где угодно — на персональном компьютере (ПК, Mac, Linux), в облаке, на локальных серверах и даже на пограничных устройствах.
- Контейнерная технология крайне эффективна как средство повышения эффективности разработки. Небольшие группы могут разрабатывать и упаковывать свои приложения на локальных устройствах (например, ноутбуках), а затем развертывать его в практически любой тестовой или производственной среде. Время и усилия, сэкономленные при тестировании и развертывании, кардинально меняют правила игры во всем процессе автоматизации производства.
- Контейнеры легко воспроизвести, поэтому их удобно использовать для автоматического масштабирования приложений. Такой подход дает возможность легко подстраиваться под требования быстро растущего и меняющегося пользовательского трафика.
Практические примеры использования контейнеров
- Создание производственного кластера. Если перед DevOps стоит задача развёртывания надёжной и легко масштабируемой системы для автоматизированного управления контейнерным кластером, то он скорее всего не будет делать это вручную. К услугам специалиста ряд готовых решений на основе Docker и Kubernetes. Например, коммерческая платформа OpenShift от компании Red Hat и ее бесплатная опенсорсная версия OKD.
- Перенос кластерной инфраструктуры в облако. Миграция сервисов компании на облачную, мультиоблачную или гибридную платформу не только открывает новые возможности для развития, но и сулит ряд сложностей, связанных с совместимостью. Чтобы с легкостью переносить инфраструктуру между собственными сервисами и облаками различных производителей, компании используют такие удобные инструменты управления комбинированными средами, как Rancher.
- Платформа для машинного обучения. Контейнерные кластеры, оркестрируемые Kubernetes, прекрасно подходят для упрощенного развертывания систем ML. Примером реализации такой технологии служит специализированный сервис Kubeflow.
- Бессерверная вычислительная платформа. Благодаря системе оркестрации контейнеров Kubernetes и фреймворку для построения шаблонов бессерверных приложений Kubeless, каждый разработчик сможет создать собственную serverless инфраструктуру в любой среде.
Что такое Docker
Подобно тому, как название фирмы Xerox стало нарицательным именем для всех копировальных аппаратов или копий бумажных документов, а поисковик Google обогатил интернет-словарь глаголом «гуглить», Docker стал синонимом работы с контейнерами.
Однако Docker — больше, чем сами контейнеры. Это обширный набор инструментов для разработчиков, позволяющий создавать, публиковать, запускать и управлять контейнерными приложениями.
Для чего нужен Docker
Создание образов
Docker Build создает базовый образ контейнера, который включает все необходимое для запуска приложения — его код, двоичные файлы, сценарии, зависимости, конфигурацию, переменные среды и другое. Для определения и запуска многоконтейнерных приложений применяется инструмент Docker Compose.
Docker Build и Docker Compose тесно интегрированы с репозиториями кода (GitHub), а также с инструментами конвейера непрерывной интеграции и непрерывного развертывания — CI/CD (например, Jenkins).
Совместное использование образов
Docker Hub — служба реестра Docker, применяемая для поиска образов контейнеров, а также предоставления ограниченного (для разработчиков) или общего доступа к этим образам. Docker Hub по функциональности похож на GitHub.
Запуск контейнеров
Среда выполнения контейнеров Docker Engine работает практически на любой платформе — компьютерах Mac и Windows, серверах Linux и Windows, в облаке и на пограничных устройствах.
Docker Engine функционирует как обертка над движком containerd — исполняемой средой для запуска контейнеров с открытым исходным кодом, поддерживаемой независимым проектом Cloud Native Computing Foundation (DNCF).
Встроенная оркестрация контейнеров
Встроенный инструмент Docker Swarm управляет кластером модулей Docker или «роем» (от англ. swarm). Обычно такой кластер создается на разных нодах. Функционал Docker Swarm напрямую пересекается с Kubernetes.
Подробнее об устройстве и работе с Docker можно узнать из нашей статьи «Что такое Docker».
Что такое Kubernetes
Kubernetes (K8s) — портативная платформа оркестрации контейнеров с открытым исходным кодом. Этот инструмент используется для автоматизации развертывания контейнерных приложений на разных хостах, а также планового масштабирования и управления ими.
С помощью K8s можно не отвлекаться на обслуживание отдельной виртуальной или физической машины с развернутыми контейнерами, а управлять целым их кластером. В рамках кластера K8s можно планово запускать контейнеры (Docker, containerd и CRI-O), опираясь на объем имеющихся вычислительных мощностей и индивидуальные ресурсные потребности каждого контейнера.
Платформу Kubernetes выбирают 88% организаций, использующих контейнеризацию в производстве. Первоначально разработанный Google, теперь он доступен во многих дистрибутивах и широко поддерживается всеми поставщиками общедоступных облачных услуг. Собственный управляемый сервис Kubernetes есть у Amazon (Elastic Kubernetes Service), Microsoft (Azure Kubernetes Service) и Google (Kubernetes).
Включена K8s и во многие популярные дистрибутивы, включая Red Hat OpenShift, Rancher / SUSE, VMWare Tanzu и IBM Cloud. Такая широкая поддержка позволяет Kubernetes избежать привязки к конкретным производителям софта. Это дает использующим ее DevOps-инжинерам больше возможностей сосредоточиться на собственном продукте.
Как работает Kubernetes
Контейнеры в Kubernetes объединяются в логические объекты под названием поды (pods) — наборы из одной или более базовых единиц, готовых к развертыванию на нодах («узлах» физических или виртуальных машин).
Настройка и управление подами осуществляется с помощью трех базовых агентов или утилит: kubectl, kubelet и kubeadm. Помимо основного управляющего агента kubelet, на каждом «узле» работает сетевой прокси kube-proxy, который настраивает правила сети.
Жизненным циклом подов можно легко управлять и масштабировать их до нужного состояния. За счет этого обеспечивается высокий уровень контроля за стабильностью и качеством работы развернутых приложений.
Для чего нужен Kubernetes
- Управление контейнерами на нескольких хостах одновременно.
- Оптимизация ресурсов используемого оборудования.
- Автоматическое развертывание и обновления приложений.
- Подключение и добавление хранилищ для запуска приложений с отслеживанием состояния.
- Масштабирование контейнерных приложений и их ресурсов на лету.
- Декларативное управление службами, что гарантирует полный контроль над развернутыми приложениями.
- Автоматический контроль работоспособность и восстановление приложений с помощью функций автозапуска, автозамены, авторепликации и автомасштабирования.
Взаимодействие Kubernetes и Docker
Долгое время средой выполнения контейнеров используемой Kubernetes по умолчанию был Docker. Но Docker никогда не предназначался для работы внутри Kubernetes.
По этой причине, разработчики Kubernetes реализовали собственное API — Container Runtime Interface (CRI). Этот интерфейс позволяет выбирать между различными средами выполнения контейнеров, делая платформу более гибкой и менее зависимой от Docker.
Однако, подобное изменение создало новую трудность для команды Kubernetes, поскольку Docker не поддерживает CRI. Поэтому вместе с собственным API, в Kubernetes был внедрен «адаптер» под названием Dockershim. Он переводит команды CRI на «язык» платформы Docker.
Сегодня прямая привязка Kubernetes к Docker осталась в прошлом. в 2021 компания официально заявила об отказе от ориентации на Docker — пост в официальном блоге получил говорящий заголовок «Без паники». Приоритет получили альтернативные среды выполнения контейнеров — containerd и CRI-O. Более того, начиная с релиза K8s 1.24, Docker (Dockershim) будет официально исключён из кодовой базы Kubernetes, хотя поддержка в более старых версиях останется.
Подробнее о теории и практике работы с Kubernetes можно узнать из отдельной статьи «Kubernetes для чайников».
Проблема оркестрации контейнеров
Главной точкой пересечения для Kubernetes и Docker является оркестрация (или оркестровка) контейнерных кластеров. Хотя Docker Swarm также является инструментом оркестрации, Kubernetes де-факто стал ведущим стандартом оркестровки контейнеров из-за его большей гибкости и возможностей масштабирования.
Хотя у Docker Swarm и Kubernetes оркестрация контейнеров организована немного по-разному, но они сталкиваются с одними и теми же проблемами. Современное приложение может состоять из десятков или сотен контейнерных микросервисов, которые должны бесперебойно работать вместе. Они размещаются на нескольких хост-машинах, называемых нодами («узлами»), которые могут быть соединены в один кластер.
Если рассмотреть схему взаимодействия контейнеров и нод, станет очевидно, что для координации такой распределенной системы необходим ряд специальных инструментов — платформ оркестровки. Системы оркестрации контейнеров часто сравнивают с дирижером, который искусно направляет отдельные инструменты оркестра для совместного исполнения сложных симфонических партий.
Задачи платформ оркестрации контейнеров
Развертывание контейнера
Платформа оркестрации способна не только получить образ контейнера из репозитория и развернуть его на ноде. Она обеспечивает автоматическое воссоздание отказавших экземпляров, их последовательное развертывание, во избежание простоя конечных пользователей, а также управление всем жизненным циклом контейнера.
Масштабирование
Это одна из самых важных задач платформы оркестровки. «Планировщик» (scheduler) главной ноды определяет размещение новых контейнеров, чтобы вычислительные ресурсы использовались наиболее эффективно. Контейнеры можно реплицировать или удалять «на лету», чтобы соответствовать изменяющемуся пользовательскому трафику.
Сеть
Контейнерные сервисы должны легко находить друг друга и обмениваться данными безопасным образом. Учитывая динамический характер контейнеров, это довольно сложно осуществить. Кроме того, некоторые службы (например, интерфейс) должны быть постоянно доступны конечным пользователям, а для распределения трафика между несколькими нодами требуется балансировщик нагрузки.
Наблюдаемость
Платформа оркестрации должна предоставлять данные о своих внутренних состояниях и действиях в форме журналов, событий, показателей или трассировки транзакций. Это позволяет операторам правильно оценить состояние и поведение контейнерной инфраструктуры, а также приложений, работающих в ней.
Безопасность
Платформа оркестрации имеет различные встроенные инструменты для предотвращения уязвимостей — безопасные конвейеры развертывания контейнеров, зашифрованный сетевой трафик, хранилища секретов и многое другое. Однако одних этих механизмов недостаточно для создания надежного контура безопасности. Необходим комплексный подход по модели DevSecOps.
Рассмотрев теоретические основы, можно подробнее рассмотреть различия между Kubernetes и Docker.
В чем разница Kubernetes и Docker Swarm
И Docker Swarm, и Kubernetes — это платформы для оркестрации контейнеров производственного уровня, но у каждой из них есть свои сильные стороны.
Платформа Docker Swarm
Встроенная утилита Docker Swarm (Docker in swarm mode, «Docker в режиме роя») — самый простой в развертывании и управлении оркестратор. Это хороший выбор для организации, которая только начинает использовать контейнеры в производстве.
Swarm надежно покрывает 80% всех возможных сценариев оркестровки контейнеров. При этом его инструментарий примерно в 5 раз легче освоить, чем Kubernetes.
Swarm легко интегрируется с остальной частью набора инструментов Docker, например с Docker Compose и Docker CLI. Это обеспечивает привычный пользовательский интерфейс с плавной кривой обучения. Для контейнеров Docker Swarm считается более безопасным и простым в устранении неполадок, чем Kubernetes.
Плюсы Docker Swarm
- Удобная установка. Для работы Docker Swarm использует тот же интерфейс командной строки, что и Docker. Это упрощает настройку и дальнейшую работу пользователей. Ведь им нужно изучить только один набор инструментов для создания сред и конфигураций.
- Совместимость. Docker Swarm работает поверх Docker и идеально совместим с другими инструментами этой экосистемы. Пользователи работают с одним и тем же интерфейсом командной строки Docker, который обеспечивает простую в использовании структуру команд.
- Скорость. Docker Swarm предоставляет динамичную среду, которая позволяет приложениям быстро запускаться в виртуальном пространстве.
- Хорошая документированность. Docker постоянно обновляет свою документацию, чтобы давать пользователям самую последнюю информацию по изменениям в своей экосистеме.
- Контроль версий. Пользователи могут легко отслеживать текущие версии docker-контейнера, чтобы контролировать расхождения с предыдущими версиями.
Минусы Docker Swarm
- Зависимость от платформы. Docker Swarm поддерживает несколько операционных систем, но только на базе Linux.
- Хранилище. В Docker нет встроенной реализации хранилища, поэтому Docker Swarm — не самое простое решение для подключения контейнеров к хранилищу.
- Мониторинг. В Docker Swarm нет встроенных инструментов расширенного мониторинга, позволяющих собрать больше данных в режиме реального времени.
Платформа Kubernetes
Главные «козыри» платформы оркестрации Kubernetes — почти безграничная масштабируемость, гибкая настраиваемость и богатая технологическая экосистема, включающая множество фреймворков с открытым исходным кодом для мониторинга, управления и безопасности.
Плюсы Kubernetes
- Ведение журнала и мониторинг. Поддержка нескольких вариантов ведения журнала и мониторинга при развертывании служб в кластере.
- Скорость. Kubernetes способен обновлять приложения в непрерывном режиме, добиваясь стабильного аптайма и отсутствия простоев.
- Декларативная конфигурация системы. Декларативный подход позволяет разработчику сообщить API-серверу о необходимом ему состоянии системы, а распределение ресурсов, организацию процессов и другие детали реализации берет на себя kubectl.
- Масштабирование инфраструктуры. Из-за неизменной и декларативной природы Kubernetes систему легко расширять с помощью методов горизонтального, автоматического и ручного масштабирования, а также применения контроллера репликаций.
- Хранилище. Kubernetes обменивается данными между контейнерами, надежно сохраняя данные на удаленном хранилище, пока пользователь не решит их удалить.
Минусы Kubernetes
- Настройка. Kubernetes использует разные настройки для каждой операционной системы, что усложняет процесс.
- Миграция. Если приложение уже кластеризовано или не имеет состояния, попытка миграции в Kubernetes приведет к сбою настройки подов и необходимости переработки конфигурации.
- Совместимость. Kubernetes несовместим с существующими инструментами Docker CLI и Compose.
Kubernetes vs Docker Swarm
Kubernetes | Docker Swarm |
Комплексная установка. | Облегченная установка поверх Docker. |
Более сложный — длительный процесс обучения, но более мощный инструмент. | Легкий и простой в освоении, но с ограниченной функциональностью. |
Поддерживает автоматическое масштабирование. | Масштабирование в ручном режиме. |
Встроенный мониторинг. | Требуются сторонние инструменты для мониторинга. |
Ручная настройка балансировщика нагрузки. | Автоматическая балансировка нагрузки. |
Необходим отдельный инструмент CLI. | Интегрирован с Docker CLI. |
Заключение
Kubernetes и Docker — технологии контейнеризации с разными сферами применения, которые успешно работают как по отдельности, так и вместе. Первый инструмент служит для определения и запуска контейнеров, а второй — это система оркестрации, которая представляет и управляет контейнерами в веб-приложении.
Возможность создание контейнеров — это главное, чем Docker отличается от Kubernetes. Сам Kubernetes не создает контейнеры, а полагается на готовый способ их реализации, такой как Docker или containerd.
Docker целесообразно применять для разработки программного обеспечения. Это включает настройку, создание и распространение контейнеров, с использованием конвейеров CI / CD и DockerHub в качестве реестра образов.
Kubernetes хорошо показывает себя в операциях с кластерами контейнеров, решая проблемы автоматизации развертывания, работы в сети, масштабирования и мониторинга. Хотя Docker Swarm является альтернативой в этой области, Kubernetes — лучший выбор при оркестровке больших распределенных приложений с сотнями подключенных микросервисов, включая базы данных, секреты и внешние зависимости.
Чтобы использовать возможности контейнеризации на 100%, Docker и Kubernetes нужна подходящая рабочая среда. Правильное решение — VPS от Eternalhost. Мощные виртуальные сервера с возможностью быстрого масштабирования ресурсов!