Компания, внедряющая виртуализацию, может утилизировать большее количество имеющихся ресурсов серверов путём одновременного использования серверов несколькими приложениями. В классическом подходе сервер выделяется для одного или нескольких приложений, однако нагрузка не перераспределяется если где-то есть дополнительные ресурсы, которые можно утилизировать. При таком подходе получается, что некоторые из серверов могут быть перегружены, а на некоторых будет не полная утилизация ресурсов что приведёт к меньшей эффективности работы приложений. Для устранения данной проблемы можно использовать систему оркестрации контейнерных приложений Kubernetes. Данная система будет выделять ресурсы по требованию, и иметь возможность переназначать приложения между хост-серверами что поможет улучшить утилизацию ресурсов и производительность приложений. Данное исследование направлено на применение системы Kubernetes для автоматического масштабирования, оценки его производительности при растущей нагрузке, а также моделирование стандартных сценариев использование серверов приложениями.
В последнее время информационные технологии играют определяющую роль в современных бизнес-процессах. Эта роль даёт одним предприятиям конкурентное преимущество над другими на рынке путём улучшения устойчивости к пиковым нагрузкам и снижения расходов на обслуживание серверов большой мощности. В этом помогают современные многопоточные центральные процессоры, которые позволяют обрабатывать десятки процессов одновременно, однако это порождает и другую проблему: переизбыток ресурсов на одном хосте, что приводит к неэффективному использованию и простою вычислительных мощностей. Проблема заключается в том, что не многие приложения поддерживают многопоточное исполнение и способны в полной мере утилизировать все доступные мощности. Существующие исследования показывают, что классический подход распределения ресурсов по хостам приводит к типичному простаиванию примерно 15–20 процентам вычислительной мощности что увеличивает затраты на обслуживание, а также общее число серверов [1]. Объединение ресурсов серверов в кластеры позволяет устранить дополнительные затраты на обслуживания, а также улучшает общую производительность систем. Однако объединение всех доступных вычислительных ресурсов в кластер не является простой задачей. Самый простой подход по максимальному наполнению всех хостов приложениями не даст эффективного использования ресурсов, а приведёт к конфликту между различными приложениями. Кластеризация требует сложного подхода, который включает в себя анализ требуемых, затрачиваемых и максимальных ресурсов, балансировка нагрузки, мониторинг и перераспределение ресурсов в случае отказа хостов и т. д. Для того чтобы уменьшить сложно подобных систем используют виртуализацию в различных проявлениях. Такой подход позволяет утилизировать один хост-сервер в качестве нескольких виртуальных и уже туда распределить исполняемые ресурсы. Ещё одним преимуществом является то, что виртуальные системы изолированы друг от друга и никак не влияют на дополнительные процессы, исполняемые на данном сервере. Также изоляция увеличивает гибкость и простоту переноса бизнес-нагрузки с одного хост-сервера на другой.
Классические виртуальные системы с полной виртуализацией всего аппаратного обеспечения имеют преимущество в том, что приложение может использовать все доступные ресурсы операционной системы, однако не может выйти за её пределы поскольку находит в строго изолированном виртуальном пространстве. Недостаток такой системы состоит в том, что для поддержания данного уровня изоляции требуются дополнительные ресурсы, поскольку эмулируются все аппаратные компоненты, что снижает эффективность данного подхода. Другим типом виртуализации является контейнерная — это тип виртуализации, который изолирует только один конкретный процесс приложения и требуемые ему ресурсы в рамках одной операционной системы. Такой подход имеет меньшую степень безопасности, однако существенно большую эффективность использования ресурсов в силу отсутствия дополнительных систем для эмуляции.
Путём совместного использования всех доступных ресурсов одного сервер-хоста данный тип виртуализации имеет значительно большую эффективность. Размер контейнера минимален и по большей части зависит от запускаемого приложения и не имеет встроенных ресурсов операционной системы, которые не будут использованы. Запуск происходит мгновенно, поскольку система, по сути, запускает самый обычный процесс, просто в изолированном окружении.
Однако контроль десятков и сотен контейнеров может оказаться проблематичным для ручного управления. Для работы с распределёнными контейнерными системами используется платформа Kubernetes. Kubernetes — платформа с открытым исходным кодом, предназначенная для управления контейнерными приложениями, обеспечения балансировки нагрузки как самих приложений, так и трафика между ними. Kubernetes предназначен для автоматизации развёртывания и масштабирования больших распределённых контейнерных систем. Kubernetes позволяет гибко настраивать паттерны и принципе масштабирования для достижения наибольшей эффективности.
Данное исследование направлено на применение Kubernetes для масштабирования приложений и оценки его производительности при растущем числе пользователей.
Методика исследования
Основными метриками будут: показатель нагрузки на сервер-хосте указывающая общую утилизацию одного сервера, и показатель нагрузки внутри конкретного контейнера, в котором запущено приложение и утилизация системы им, данная метрика будет снята при помощи системы cAdvisor.
Рис. 1. Источники метрик
Минимальный оперируемый объект внутри Kubernetes — это Pod, который может включать в себя несколько контейнеров. Для эффективного масштабирования используется принцип Horizontal Pod Auto-scaling, который увеличивает число исполнительных подов на основании некоторых метрик с определёнными задержками. В случае превышения порога по утилизации процессора одним из подов, он может создать ещё один и балансировать нагрузку между ними, таким образом распределяя нагрузку и увеличивая эффективность работы приложения. Так можно удерживать утилизацию процессора одним приложением в диапазоне 80–90 процентов имея при этом максимальную производительность и утилизацию ресурсов.
В данном исследовании в качестве нагрузки использовались эхо-сервера для проверки производительности относительно генерируемого количества запросов. Эхо-сервер — это максимально простой и производительный веб-сервер, который в качестве ответа отправляет то, что ему было отправлено в запросе. Что позволяет тестировать именно производительность системы, а не самого сервера поскольку в силу своей простоты он не может быть узким местом. Для генерации трафика была использована система для нагрузочного тестирования приложений с гибкой настройкой количества и размера запросов [4]. В качестве тестируемой системы использовался кластер состоящий из трёх узлов, один мастер-сервер и два сервера-исполнителя.
Рис. 2. Архитектура тестируемой системы
Kubernetes — самый популярный и доступный инструмент для оркестрации контейнерных приложений [3]. Он был создан компанией Google из внутренней системы Borg, которая использовалась для оркестрации большого количества приложений. Для эффективного управления контейнерами было принято создать сначала внутреннюю систему, а после и выпустить её в публичный доступ с открытым исходным кодом. Kubernetes имеет широкую поддержку сообщества и огромное количество расширений позволяющих настраивать систему максимально гибким образом.
Общая архитектура представляет собой две основные группы: мастер-ноды и исполнительные ноды. На мастер серверах исполняются процессы для контроля ресурсов, исполнительные ноды выполняют бизнес нагрузку системы.
В основном большинство приложений имеют три главных компонента: пользовательского интерфейса, бизнес-логики приложения и хранилища данных. В монолитной архитектуре все три компонента могут быть объеденины в одну большую систему, они напрямую зависят друг от друга и работают как единый процесс. В другом подходе — микросервисном, все компоненты разделены и не имеют прямой зависимости друг от друга. Они могут работать независимо и работать с различными копиями друг друга обеспечивая балансировку нагрузки. [2]
Для настройки масштабируемости Kubernetes нужны следующие параметры: минимальное и максимальное количество подов, граничные значения CPU — минимальное и максимальное. Алгоритм работает следующим образом: всегда поддерживается минимальное количество подов. Когда загрузка центрального процессора начинает расти и превышает верхнюю границу, начинается авто масштабирование и с ростом нагрузки на остальные поды до тех пор, пока не достигнет максимальной границы по количеству подов. Масштабирование в меньшую сторону работает аналогичным образом, если граница меньше нижнего порога, экземпляры подов начинают удаляться и вместе с нагрузкой уменьшаются до минимального количества подов.
Результаты:
Преимуществом виртуализации является сокращение общего числа систем и связанных с этим накладных расходов (операционное пространство и расходы человеко-часов).
Оценка производительности микросервисов включает в себя количество одновременных запросов, время отклика одного и нескольких серверов. Оценка производится по двум сценариям, первый: одновременное подключение 10000 одновременных подключений каждое из которых выполняет 10000 запросов. Второй: 100000 подключений, каждое из которых выполняет 1000 запросов. Каждый этап выполняется трижды. Пороговая граница авто масштабирования: 80 % загрузки эхо-сервера.
Сценарий 1:
Этап |
Нагрузка ЦПУ (милиядра), один сервер. Без масштабирования. |
Нагрузка ЦПУ (милиядра) на нескольких серверах с масштабированием. |
1 |
619.00 |
210.00 |
2 |
591.00 |
217.00 |
3 |
609.00 |
230.00 |
Среднее |
606.34 |
219.00 |
Сценарий 2:
Этап |
Нагрузка ЦПУ (милиядра), один сервер. Без масштабирования. |
Нагрузка ЦПУ (милиядра) на нескольких серверах с масштабированием. |
1 |
580.00 |
215.00 |
2 |
484.00 |
340.00 |
3 |
552.00 |
324.00 |
Среднее |
555.00 |
293.00 |
В дополнение к результатам нагрузки на центральный процессор, так же были записаны времена ответа серверов при каждом сценарии, в таблице представлено среднее:
Время ответа (мс) |
Один сервер (без масштабирования) |
Несколько серверов (масштабирование) |
Сценарий 1 |
43 мс |
12 мс |
Сценарий 2 |
58 мс |
32 мс |
Вывод:
Использование контейнерной виртуализации обеспечивает максимальную гибкость для использования всей ёмкости ресурсов на одном сервере. В данной работе я провёл исследование с использованием двух сценариев нагрузки центрального процессора на одном и нескольких серверах [5]. При использовании нескольких серверов была использована система автоматического масштабирования для работы с клиентскими запросами. Использование масштабирования для контейнеров уменьшило общую загрузку центрального процессора на всех системах путём распределения нагрузки по контейнерам, которые работали с отдельными потоками процессора.
Также было измерено время отклика каждой из систем, в случае масштабирования оно существенно меньше, так как очередь из запросов уменьшается и позволяет серверам быстрее обслуживать каждый новый поступающий запрос.
Литература:
- Scalability of a Web Server: How Does Vertical Scalability Improve the Performance of a Server? Ancuta-Petronela Barzu; Mihai Carabas; Nicolae Tapus https://doi.org/10.1109/CSCS.2017.22
- Обзор методов масштабирования веб-приложений. Протозанов Е. С., Овсянников В. К. https://www.elibrary.ru/item.asp?id=23192031
- Automated Resource Management System based on Kubernetes Technology. Jirayus Sithiyopasakul; Tuanjai Archevapanich; Boonchana Purahong; Paisan Sithiyopasakul; Chawalit Benjangkaprasert. https://doi.org/10.1109/ECTI-CON51831.2021.9454911
- Тестирование сайта с помощью онлайн-инструмента нагрузочного тестирования. Колот Александр Владиславович, Щелкунова Марина Евгеньевна. https://www.elibrary.ru/item.asp?id=48375082
- Использование kubernetes для построения облачной платформы для удаленного запуска учебных сервисов. Ивченко М. С., Тарасов В. Г. https://www.elibrary.ru/item.asp?id=43835834