В последнее время всё большую популярность получают контейнеры приложений (containerized applications). Аналитики Gartner прогнозируют, что к 2022 году более 75% организаций будут использовать эту технологию. Поэтому многие хотят узнать, что это, как она работает и для чего она нужна.
Задачи, которые решает Kubernetes
Когда разработчик пишет какое приложение и использует для этого свой компьютер, то его конфигурация (специфические библиотеки стандартных кодов, их зависимости и файлы) будет влиять на работу кода приложения. Это может привести к тому, что на других компьютерах этот код работать не сможет.
Между тем, среда исполнения этого приложения в корпоративной сети обычно имеет стандартные конфигурации и собственные служебные файлы. Можно, конечно, постараться эмулировать эту среду на компьютере разработчика, но при переносе в другую среду, при миграции приложения между физическими серверами в облачной среде, могут снова возникнуть проблемы.
Для решения этой проблемы предназначена технология контейнеров (например, Docker). Для оркестрации работы контейнеров была разработана платформа Kubernetes, которая сейчас является наиболее популярной платформой управления контейнерами.
Контейнеры
Контейнер – это законченный программный модуль, содержащий все необходимые библиотеки, файлы и связи между ними (среда исполнения, runtime), который может быть развернут в другой конфигурации серверов (другой продуктивной среде). При этом исключаются дополнительные подстройки и корректировки конфигурации исходного кода.
Содержимое контейнера может быть представлено как дистрибутивная установка ОС Linux, поставляемая со всем комплектом служебных файлов (RPM package), файлами конфигурации и пр. Однако, образ контейнера может быть установлен гораздо легче, чем новые копии операционной системы.
Рисунок 1. Упрощённая архитектура контейнера.
Для организаций, обладающих масштабными ИТ-системами, одиночных контейнеров будет, конечно, недостаточно для того, чтобы развернуть все требуемые приложения в нужном масштабе. Производительность одиночного контейнера будет достаточной для нескольких пользователей, но не более. Поэтому, множество контейнеров обычно взаимосвязаны друг с другом, обеспечивая таким образом, нужную производительность работы приложения в масштабе большой организации или облачной среды.
Такая архитектура контейнеров порождает проблемы масштабирования, связанные с управлением множеством взаимосвязанных контейнеров. Решение этих проблем необходимо предусматривать на этапе разработки приложений в контейнерах: варианты развёртывания на компьютерах различного типа в кластере, организация сетевых взаимодействий между ними, добавление ресурсов при повышении нагрузки на приложение и многое другое.
Решение этих проблем предусмотрено в Kubernetes – системе оркестрации контейнеров (оркестратор), предназначенной для управления жизненным циклом контейнеризованных приложений на всем парке установленного на предприятии оборудования. При этом становится возможным автоматизация развёртывания и масштабирования множества контейнеров одновременно. Контейнеры, в которых работает приложение, группируются вместе. Они являются репликами друг друга и работают в режиме балансировки нагрузки входящих в приложение запросов. Оркестратор, в свою очередь, администрирует эти группы контейнеров, обеспечивая их корректную работу.
Рисунок 2. Архитектура Kubernetes.
Основная задача оркестратора Kubernetes состоит в том, чтобы управлять совместной работой нескольких групп контейнеров, каждая из которых обеспечивает работу какого-либо приложения. Если, например, нужно перезапустить контейнер, чтобы получить больше ресурсов, то этим занимается оркестратор.
Терминология и архитектура Kubernetes
- Поды (Pods)
Под – это группа контейнеров, наименьший элемент, которым управляет Kubernetes. Под имеет уникальный IP-адрес, который предписывается каждому контейнеру в поде. Контейнеры в каждом поде пользуются одними и теми же ресурсами, такими как оперативная и дисковая память. Это позволяет рассматривать отдельные контейнеры в поде как одно приложение, работающее на обычном компьютере при обычной нагрузке пользователя.
В простейшем случае один под содержит один контейнер, в котором работает одно приложение, или процесс. Однако, в условиях, когда несколько процессов должны работать вместе и использовать при этом одни и те же тома данных в дисковом накопителе, то многоконтейнерные поды облегчают конфигурацию такого деплоймента, по сравнению с распределением общих ресурсов для разных контейнеров, которые нужно выполнять вручную.
Например, при разработке приложения для создания роликов GIF из серии изображений, один под может иметь несколько совместно работающих контейнеров, в задачу которых входит масштабирование исходных изображений. Основной контейнер может запускать неблокируемое микро-сервисное приложение, которое воспринимает запросы, и затем один или несколько подчинённых контейнеров исполняют пакет из нескольких процессов, либо очищают оставшиеся данные в томе данных диска.
- Деплойменты (deployments)
Kubernetes определяет масштаб, в котором нужно запускать приложение, давая возможность разработчику установить параметры того, как поды будут реплицироваться на рабочих узлах Kubernetes. Деплойменты задают число требуемых реплик идентичных подов для работы приложения и стратегию обновления деплоймента, если в этом возникает необходимость.
Kubernetes следит за правильной работой подов, а также убирает или добавляет поды в соответствии с заданным состоянием деплоймента.
- Сервисы
В процессе работы пода, может меняться его IP-адрес, и все другие параметры, включая само его существование. В Kubernetes поды не рассматриваются как нечто долговременное. Если под сталкиваются с какой-то проблемой, он просто отключается. Kubernetes затем заменяет его на новый, и на работы приложения в целом такая операция не влияет.
Сервис – это нечто вроде интерфейса абстрагирования поверх пода. Поскольку поды могут заменяться, меняются их внутренние имена и IP-адреса. Сервис предоставляет имя отдельной машины или IP-адрес подов, где нижележащие имена и адреса не столь стабильны, однако через сервис для внешнего мира всё остаётся неизменным.
- Узлы (nodes)
Поды работают в рабочих узлах Kubernetes, которые администрируют работы подов. Узел – это машина (виртуальная или физическая), которая выполняет заданную работу. Так же, как и поды, которые собирают отдельные контейнеры, узлы собирают отдельные поды и организуют их совместную работу. При масштабировании приложения, которое требует больше ресурсов, узлы наращивают или уменьшают число подов, которые наращивают или уменьшают число контейнеров.
- Центральный сервер (Master Server)
Администраторы и пользователи управляют отдельными узлами подов через центральный сервер. Команды управления вводятся либо через графический интерфейс пользователя UI (User Inteface), или через подключение к машине в режиме интерфейса командной строки CLI (Command Line Interface), через который вводятся команды в виде скриптов.
- Кластер Cluster
Кластер – это все вышеперечисленные элементы, образующее единое устройство.
Компоненты Kubernetes
Теперь, когда есть некоторое представление об устройстве Kubernetes, можно рассмотреть различные программные компоненты, обеспечивающие нормальную работу этого устройства.
Как центральный сервер, и так отдельные рабочие узлы, имеют три основных компонента.
- Компоненты центрального сервера
- Сервер API
Сервер API предоставляет REST-интерфейс для кластера Kubernetes, через который выполняются все операции для подов, сервисов и отдельных контейнеров.
- Планировщик нагрузки (Scheduler)
Планировщик отвечает за задание работы для различных узлов. Он отслеживает наличие доступных ресурсов и обеспечивает работу узла в требуемых пределах нагрузки.
- Контроллер-менеджер (Controller-Manager)
Контроллер-менеджер отвечает за правильное совместное использование ресурсов в кластере.
- Компоненты рабочего узла
- Kubelet
Kubelet отслеживает состояние пода и нормальную работу его контейнеров. Каждые несколько секунд от оправляет опросное сообщение (heartbeat) на центральный сервер. Если котроллер репликации не отзывается, то узел помечается как отказавший.
- Kube Proxy
Kube proxy распределяет трафик внешних запросов, приходящий на узел от сервиса. Он направляет запросы на обработку на соответствующие контейнеры.
- etcd
etcd – это распределённое хранилище ключей, которые Kubernetes использует для публикации информации об общем состоянии кластера. Кроме того, через него узлы могут обращаться к данным глобальной конфигурации для того, чтобы перезапускать отказавшие поды и узлы.
Преимущества Kubernetes
Kubernetes – наиболее быстро развивающийся проект в истории открытого программного обеспечения (Open Source), благодаря следующим преимуществам:
- Переносимость
Kubernetes обеспечивает быстрый перенос приложений из одной среды исполнения в другую, и упрощает их развёртывание в новой среде. Это означает, что компании могут воспользоваться преимуществами использования услуг многих облачных провайдеров и могут быстро развивать свои ИТ-системы без необходимости перенастройки архитектуры.
- Масштабируемость
Благодаря способности Kubernetes управлять работой контейнеров в среде одного или нескольких облачных провайдеров, в виртуальных машинах, или развёртываться без операционных систем (bare metal), этот оркестратор контейнеров может быть развёрнут практически везде. Кроме того, это значительно ускоряет разработку приложений в режиме DevOps.
- Высокая доступность
Kubernetes обеспечивает высокую доступность НА (High Availability) как на уровне приложений, так и на уровне инфраструктуры. В сочетании с использованием надёжного хранилища данных, Kubernetes обеспечивает доступность «нагрузок с сохранением состояния» (stateful workloads). Кроме того, компоненты центрального сервера (master host) могут быть сконфигурированы с резервированием, и это ещё больше повышает доступность.
- Открытый код (Open Source)
Поскольку Kubernetes – это открытое ПО, оно обеспечивает обширную экосистему с другими открытыми средствами, разработанными для работы с Kubernetes, безо всяких лицензионных ограничений.