Как стать автором
Поиск
Написать публикацию
Обновить
48.71

Kubernetes: шестимесячный марафон по прокачке dBrain.cloud

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров2.3K

За последние полгода наши инженеры проделали значительную работу по развитию и оптимизации платформы dBrain.cloud, ключевым инструментом которой является Kubernetes. В этой статье мы подробно расскажем об изменениях, произошедших в нашей инфраструктуре, о внедрении новых функций и фишках, которые, мы надеемся, будут интересны DevOps-сообществу.

Распределение нагрузки с Trimaran

В связи со значительным ростом наших кластеров Kubernetes (до 80-100 тысяч подов) перед нами встала задача более эффективного распределения нагрузки. Ранее шедулер опирался исключительно на реквесты и лимиты, что часто приводило к неравномерному использованию ресурсов физических серверов - некоторые были перегружены, тогда как другие недогружены.

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

Разработка собственного шедулера в данном случае оказалась неоправданной, а существующие комплексные решения были чрезмерно сложными и не соответствовали в полной мере нашим задачам. Поэтому мы остановились на промежуточном легковесном варианте. Изучив доступные альтернативные решения, мы выбрали Trimaran, поскольку оно предлагает логичное расширение функционала и позволяет более грамотно распределять поды по физическим нодам, анализируя расширенные параметры. Таким образом, Trimaran стал дополнительным инструментом к дефолтному шедулингу, обеспечивающим рациональное использование ресурсов наших кластеров.

Переход на Cgroup V2

Cgroup (Control Groups) - это механизм ядра Linux, используемый Kubernetes для управления и распределения ресурсов, а также установки лимитов для контейнеров по памяти и CPU. Долгое время использовалась первая версия Cgroup, однако последние несколько лет Linux активно переходит на Cgroup V2, которая со временем стала стандартом. В более свежих версиях ядра Cgroup V1 был отключен по умолчанию, а затем и вовсе удален.

Поддержка Cgroup V2 реализована во многих ключевых компонентах, таких как Kubernetes, CRI-O, Crun, а также в некоторых прикладных языках, например, Go. Это позволяет им корректно работать с новыми механизмами ограничения ресурсов. Но, например, Java лишь недавно начала внедрять поддержку Cgroup V2 в своей JVM. Важно отметить, что эта поддержка появилась только в свежих версиях Java (начиная с 21-й и далее), тогда как в более старых версиях, например, 17-й, она пока не предусмотрена. Это означает, что для корректной работы с Cgroup V2 необходимо обновить Java-приложения минимум до 21-й версии, а лучше до самой актуальной.

Оптимизация сетевой инфраструктуры с Cilium

Изначально в платформе dBrain.cloud использовался MetalLB для балансировки нагрузки, но Cilium прекратил его поддержку, предложив свой встроенный механизм L2 Announcements. На тот момент встроенный IPAM Cilium был недостаточно функционален, что вынудило нас создать гибридное решение: контроллер MetalLB отвечал за управление и выделение IP-адресов сервисам, а Cilium анонсировал эти адреса. Несмотря на свою необычность, это решение работало стабильно.

Теперь, когда Cilium значительно улучшил свой IPAM, сделав его полностью подходящим нашим требованиям, мы можем полностью отказаться от MetalLB. Вся логика управления и анонсирования адресов теперь находится под контролем Cilium.

Кроме того, была улучшена поддержка Gateway API версии 1.3, который Kubernetes предлагает как замену Ingress и Nginx. Этот модульный подход позволяет создавать L4-роутеры для TCP-форвардинга, автоматически интегрирующиеся с балансировщиком нагрузки Cilium. Также можно настраивать роутеры для различных прикладных протоколов (HTTP, gRPC и т.д.) с полноценным конфигурированием, аналогичным Nginx.

Преимущество такого подхода заключается в унификации инфраструктуры. Отказ от разрозненных решений в пользу единого, комплексного инструмента, такого как Cilium, позволяет упростить сетевую архитектуру, сократить количество промежуточных звеньев и повысить общую производительность. Cilium, изначально выполняя роль CNI, теперь полностью взял на себя функции IPAM, балансировщика нагрузки, а также расширил поддержку Network Policies и Gateway API. Таким образом, все аспекты, связанные с сетью в нашей платформе, теперь полностью управляются Cilium.

Повышение эффективности LostNodeCleaner

LostNodeCleaner - это наше собственное решение, предназначенное для обработки ситуаций с потерянными нодами в кластере. Изначально написанный на Python, LostNodeCleaner хорошо справлялся со своими задачами в меньших масштабах. Однако, по мере значительного увеличения размера наших кластеров, мы столкнулись с проблемой производительности: Python-версия не успевала обрабатывать возросшие объемы данных, что приводило к неверной работе и ошибочной очистке нод.

Для устранения этого узкого места было принято решение полностью переписать LostNodeCleaner на языке Go. Выбор Go обусловлен его высокой производительностью и эффективностью при работе с большими потоками данных, что критически важно для наших масштабируемых кластеров. В результате этого перехода производительность LostNodeCleaner увеличилась практически в два раза, обеспечивая стабильную и быструю обработку даже в самых крупных инсталляциях.

Внешний S3

Для повышения гибкости и надежности системы резервного копирования в платформе dBrain.cloud обновлена и расширена функциональность Velero. Теперь, помимо резервного копирования в наш внутренний S3 (Ceph), появилась возможность подключения внешних S3-хранилищ.

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

Поддержка GPU Time Slicing

В контексте активного развития направлений, связанных с машинным обучением и нейросетями, мы также уделили значительное внимание расширению возможностей Kubernetes по работе с GPU. В частности, был добавлен функционал GPU Time Slicing.

GPU Time Slicing - это механизм, который позволяет эффективно распределять ресурсы одной видеокарты между несколькими подами. Это не просто расширение списка поддерживаемых видеокарт, а инструмент, обеспечивающий возможность совместного использования одного GPU несколькими потребителями. Данная функция значительно повышает эффективность использования аппаратных ресурсов, что особенно актуально для наших заказчиков, активно использующих кластеры для обучения нейросетей, и позволяет запускать несколько задач по обучению на одной видеокарте.

Эти и другие изменения, внедренные за последние полгода, повысили эффективность, надежность и масштабируемость платформы dBrain.cloud. Мы продолжим использовать элементы Kubernetes, внедряя передовые решения, будем делиться своим опытом с сообществом и предлагать заказчикам современные и производительные решения.

Читайте также:

Теги:
Хабы:
+5
Комментарии1

Публикации

Информация

Сайт
dbrain.cloud
Дата регистрации
Дата основания
2016
Численность
101–200 человек
Местоположение
Россия