Обрабатывать внезапное увеличение размера трафика (на несколько порядков) с помощью GKE

#kubernetes #google-kubernetes-engine #scalability #serverless

#kubernetes #google-kubernetes-engine #масштабируемость #бессерверный

Вопрос:

Если на веб-сайте есть распродажа, когда многие люди (~ 50 тыс.) ждут окончания обратного отсчета и переходят на страницу, как можно решить эту проблему с помощью GKE экономически эффективным способом?

Похоже, это причина существования GKE, решение может заключаться в том, что с помощью автоскалятора кластера и HPA GKE может обрабатывать трафик. На практике, однако, это другая история, когда автоскейлер пытается создать узлы и извлечь изображение для контейнеров, это может занять до определенного времени (возможно, до минуты или двух в некоторых случаях). За это время пользователи видят 5XX ошибок, что не идеально.

Что ж, чтобы справиться с этим, на ум приходит избыточная подготовка с помощью приостановленных модулей. Однако, учитывая, что серверы, как правило, очень малы по размеру (они должны обрабатывать только 100 запросов в обычный день) и внезапно 50 тыс. в секунду, как это может быть приемлемым решением? Приостановленные модули, похоже, только гарантируют, что автоскалер не удаляет узлы, которые не работают, поэтому в этом случае 50 узлов всегда должны быть заняты приостановленными модулями, которые, как я предполагаю, по-прежнему оплачиваются (поскольку узлы там просто ничего не делают) в GKE.

Какое было бы приемлемое решение для обслуживания 100 запросов с помощью n1-standard-1 каждый день, но также иметь возможность масштабироваться до ~ 50 тыс. менее чем за 10 секунд?

Комментарии:

1. GKE Существует официальная документация об обработке трафика с помощью : Cloud.google.com : Рекомендации по запуску экономически эффективного приложения Kubernetes на GKE . В частности, часть: подготовка облачных приложений kubernetes.

2. Очень хорошая статья Dawid. Спасибо.

Ответ №1:

Не так быстро, как 10 секунд. Это достижимо, только если вы отключите сервер.

Автоматическое масштабирование модулей лучше всего составляет 20-30 секунд (зависит от ваших тестов готовности, тестов балансировки нагрузки, кэша изображений и т. Д.). Но вам все равно нужно иметь пул узлов, чтобы соответствовать этой емкости, а это те же деньги — вы правы.

Автоматическое масштабирование узлов модулей занимает около 5 минут.

Если вы переходите на бессерверный режим, убедитесь, что вы знаете (увеличиваете?) лимиты своей учетной записи. Поскольку он масштабируется так быстро и оплачивается за лямбда-запуск, было очень легко случайно увеличить ваш счет. Таким образом, все провайдеры ограничили количество одновременных выполнений функций по умолчанию, например, AWS по умолчанию имеет 1000 на учетную запись. https://aws.amazon.com/about-aws/whats-new/2017/05/aws-lambda-raises-default-concurrent-execution-limit/. Это может быть увеличено за счет поддержки.

Я вспоминаю этот пост для AWS: https://aws.amazon.com/blogs/startups/from-0-to-100-k-in-seconds-instant-scale-with-aws-lambda /. К сожалению, я не видел похожих записей для функций Google, но я уверен, что у них очень похожие возможности.

Комментарии:

1. Макс, спасибо за твой ответ и предложения (особенно за последнюю ссылку). Проблема с бессерверным — это все конфигурации, которые больше не находятся под вашим контролем. Кроме того, даже для Lambda они предусмотрели параллелизм, который, по сути, удерживает некоторую мощность в режиме ожидания для обработки трафика. Меня интересует решение, которое использует GKE и каким-то образом обрабатывает большие (ожидаемые) нагрузки. Честно говоря, я подожду немного, чтобы узнать, может ли кто-нибудь или вы придумать решение, тогда я приму ваш ответ (честно говоря, я не знаю, доступно ли такое решение на данный момент.)

2. В качестве дикой идеи, не могли бы вы порекомендовать какое-либо полуавтоматическое / автоматическое планирование (что звучит избыточно по сравнению с автоскаляром и всей концепцией KE) для решения этой проблемы?

3. Да, лямбды тоже нужно «разогревать», но, тем не менее, это намного быстрее, чем 5 минут. Кроме того, предоставленный параллелизм работает на основе расписания, поэтому вы можете попробовать угадать ваше пакетное окно и подготовить: aws.amazon.com/blogs/compute /…

4. Говоря о угадывании пакетного окна: вы могли бы попробовать этот демон github.com/hjacobs/kube-downscaler#command-line-options с --upscale-period флагом в сочетании с автоскалером кластера cloud.google.com/kubernetes-engine/docs/concepts/… . В автоскалере кластера есть предикат PodFitsResources, который заметит, что вы запросили гораздо больше модулей, чем может вместить кластер, и увеличит масштаб. Даже без фактической загрузки количество узлов будет увеличиваться только для запуска всех модулей. Убедитесь, что вы установили запросы ресурсов и ограничения на развертывание в этом случае.

5. k8s — самый надежный и продвинутый планировщик на сегодняшний день, если вы все еще хотите использовать контейнеры, я бы точно придерживался его. Обратите внимание, что бессерверный режим также не ограничивается продуктами PaaS, есть openfaas.com/blog/introducing-faasd , но вам все равно придется иметь дело с прогнозируемым / планируемым масштабированием базовых серверов.