Готовые готовые приложения Python на Kubernetes - PullRequest
3 голосов
/ 24 октября 2019

Я развертывал приложения в kubernetes за последние 2 года. И в моей организации все наши приложения (особенно без сохранения состояния) работают в kubernetes. У меня все еще есть фундаментальный вопрос, потому что совсем недавно мы обнаружили некоторые проблемы в отношении наших нескольких приложений на Python.

Первоначально, когда мы развернули наши приложения на Python (написанные на Flask и Django), мы запустили его с помощью python app.py. Известно, что из-за GIL python действительно не поддерживает системные потоки, и он может обслуживать только один запрос за раз, но в случае, если один запрос сильно загружен ЦП, он не сможет обрабатывать дальнейшие запросы. ,Это иногда приводит к тому, что API работоспособности не работает. Мы заметили, что в этот момент, если есть один запрос, который не является IO и выполняет какую-то операцию, он будет удерживать ЦП и не сможет реально обработать другой запрос параллельно. И поскольку он выполняет меньше операций, мы заметили, что загрузка ЦП также не увеличивается. Это влияет на то, как работает HorizontalPodAutoscaler, и не может масштабировать модули.

Из-за этого мы начали использовать uWSGI в наших модулях. Таким образом, в основном uWSGI может запускать несколько модулей под капотом, обрабатывать несколько запросов параллельно и автоматически вращать новый процесс по требованию. Но тут возникают и другие проблемы: uwsgi не хватает скорости автоматического масштабирования процесса для обслуживания запроса, и это вызывает HTTP 503 ошибок, из-за этого мы не можем обслуживать наши несколько API-интерфейсов при 100% доступности.

В то же время все наши другие приложения, написанные на nodejs, java и golang, обеспечивают 100% доступность.

Я смотрю, как лучше всегос помощью которого я могу запустить приложение Python в 100% (99,99) доступности в kubernetes со следующими

  1. с API-интерфейсами здоровья и живучести, обслуживаемыми приложением
  2. Appработает в kubernetes
  3. Если возможно без uwsgi (фундаментальный принцип докера - это отдельный процесс на модуль)
  4. Если с uwsgi, есть ли какие-либо конкретные настройки, которые мы можем применить для k8s env

1 Ответ

1 голос
/ 24 октября 2019

Мы используем WSGI-сервер Twisted с 30 потоками, и он отлично подходит для нашего приложения Django. Как вы упомянули, придерживается единой модели для каждого модуля, которая более точно соответствует ожиданиям Kubernetes. Да, GIL означает, что только один из этих 30 потоков может одновременно выполнять код Python, но, как и в большинстве веб-приложений, большинство этих потоков блокируются при вводе-выводе (обычно ожидая ответа от базы данных), подавляющее большинствовремя. Затем запустите несколько реплик для избыточности и для обеспечения истинного параллелизма на любом необходимом уровне (обычно мы используем 4-8 в зависимости от трафика сайта, некоторые большие до 16).

...