Я развертывал приложения в 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 со следующими
- с API-интерфейсами здоровья и живучести, обслуживаемыми приложением
- Appработает в kubernetes
- Если возможно без uwsgi (фундаментальный принцип докера - это отдельный процесс на модуль)
- Если с uwsgi, есть ли какие-либо конкретные настройки, которые мы можем применить для k8s env