Масштабирование приложений колб на Кубернетес и Гуникорн - PullRequest
1 голос
/ 25 июня 2019

У нас есть приложение Flask, которое подается через gunicorn с использованием работника eventlet. Мы развертываем приложение в модуле kubernetes с целью масштабирования количества модулей в зависимости от рабочей нагрузки.

Рекомендованные настройки для числа рабочих в оружейном кукурузе 2 - 4 x $NUM_CPUS. См. документы . Ранее я развертывал сервисы на выделенном физическом оборудовании, где такие вычисления имели смысл. На 4-х ядерном компьютере с 16 рабочими звучит нормально, и мы в итоге увеличили его до 32 рабочих.

Применяется ли этот расчет до сих пор в модуле kubernetes с использованием асинхронного рабочего, в частности:

  1. На одном узле может быть несколько модулей.
  2. Одна и та же служба будет работать в нескольких модулях.

Как мне установить количество рабочих-оружейников?

  1. Установить его на -w 1 и позволить kubernetes обрабатывать масштабирование с помощью стручков?
  2. Установите его на 2-4 x $NUM_CPU на узлах kubernetes. На один стручок или несколько?
  3. Что-то еще целиком?

Обновление

Мы решили пойти с 1-м вариантом, который является нашим текущим подходом. Установите количество работ с огнестрельным оружием на 1 и масштабируйте по горизонтали, увеличивая количество стручков. В противном случае будет слишком много движущихся частей, и мы не сможем максимально использовать Kubernetes.

1 Ответ

0 голосов
/ 25 июня 2019

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

Кроме того, в kubernetes есть различные механизмы для масштабирования вашего развертывания, такие как HPA, из-за загрузка ЦП и ( Как Python масштабируется с Gunicorn и Kubernetes? )

Вы также можете использовать Запросы ресурсов и лимиты Pod и Container.

Согласно Документация по Gunicorn

НЕ масштабируйте количество работников до числа клиентов, которых вы ожидаете иметь. Gunicorn нужно только 4-12 рабочих процессов для обработки сотен или тысяч запросов в секунду. Gunicorn полагается на операционную систему, которая обеспечивает балансировку нагрузки при обработке запросов. Как правило, мы рекомендуем (2 x $ num_cores) + 1 в качестве числа рабочих, с которых нужно начинать. Несмотря на то, что формула не слишком научна, она основана на предположении, что для данного ядра один работник будет читать или писать из сокета, в то время как другой работник обрабатывает запрос.

# обновление :

В зависимости от вашего подхода вы можете выбрать другое решение (развертывание, набор демонов), все вышеперечисленные операторы, которых вы можете достичь в kubernetes, обработав в соответствии с Назначение ресурсов ЦП контейнерам и блокам

  1. Использование развертывания с ресурсами (лимитами, запросами) дает вам возможность изменить размер вашего приложения на несколько модулей на одном узле в зависимости от аппаратных ограничений, но в зависимости от "загрузки приложения" это может быть недостаточно хорошим решением.

Запросы и ограничения ЦП связаны с контейнерами, но полезно думать о модуле как имеющем запрос и ограничение ЦП. Запрос ЦП для модуля - это сумма запросов ЦП для всех контейнеров в модуле. Аналогично, ограничение ЦП для модуля - это сумма ограничений ЦП для всех контейнеров в модуле.

Примечание:

Ресурс ЦП измеряется в единицах ЦП. Один процессор в Kubernetes эквивалентен: F.E. 1 ядро ​​GCP.

  1. Как уже упоминалось в посте, второй подход (масштабирование приложения на несколько узлов) также является хорошим выбором. В этом случае вы можете использовать f.e. Кроме того, установка состояния или развертывание в GKE с использованием « cluster austoscaler » позволяет добиться более расширяемого решения, когда вы пытаетесь создать новые модули, у которых недостаточно мощности для работы внутри кластера. В этом случае кластер автоматического масштабирования автоматически добавляет дополнительные ресурсы.

С другой стороны, вы можете рассмотреть возможность использования других решений, таких как Cerebral , что дает вам возможность создавать пользовательские политики для увеличения или уменьшения размера пулов узлов внутри вашего кластера.

Автоматическое масштабирование кластеров в GKE автоматически изменяет размеры кластеров в зависимости от требований рабочих нагрузок, которые вы хотите запустить. При включенном автоматическом масштабировании GKE автоматически добавляет новый узел в ваш кластер, если вы создали новые блоки, у которых недостаточно мощности для запуска; и наоборот, если узел в вашем кластере используется недостаточно и его модули могут быть запущены на других узлах, GKE может удалить этот узел.

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

Надеюсь, эта помощь.

...