В Kubernetes, как я могу масштабировать развертывание до нуля при простое - PullRequest
1 голос
/ 04 мая 2020

Я использую довольно ресурсоемкий сервис в кластере Kubernetes для поддержки операций CI. Требуется только одна реплика, но она использует много ресурсов (16 процессоров), и обычно она требуется только в рабочее время (будние дни, примерно с 8:00 до 18:00). Мой кластер работает в облаке и настроен с автоматическим масштабированием экземпляра, поэтому, если эта служба масштабируется до нуля, этот экземпляр можно прервать.

Служба представляет собой сторонний код, который нельзя изменить (ну, не легко ). Это довольно типичная служба HTTP, за исключением того, что ее работа довольно интенсивно использует процессор.

Какие существуют варианты автоматического масштабирования этого развертывания до нуля при простое?

Я бы не стал настраивать расписание увеличивать / уменьшать его в рабочее время, потому что иногда CI-операции выполняются вне обычных часов Я бы хотел, чтобы масштабирование было динамическим c (например, масштабирование до нуля, если он простаивает в течение> 30 минут, или масштабирование до единицы, когда приходит входящее соединение).

Ответы [ 4 ]

1 голос
/ 05 мая 2020

На самом деле Kubernetes поддерживает масштабирование до нуля только с помощью вызова API, так как Autoscaler с горизонтальным модулем поддерживает масштабирование только до 1 реплики.

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

Вы можете взглянуть на Knative или Keda . Они позволяют вашему приложению быть без сервера и делают это по-разному.

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

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

Оба поддерживают масштабирование до нуля в случае, если предопределенные условия выполняются в одинаково предопределенном окне.

Надеюсь, что это помогло.

1 голос
/ 04 мая 2020

Горизонтальный модуль автоматического масштабирования в настоящее время не позволяет установить для поля minReplicas значение 0, поэтому автоматическое масштабирование никогда не уменьшится до нуля, даже если модули ничего не делают. Разрешение уменьшения количества модулей до нуля может значительно увеличить использование вашего оборудования.

Когда вы запускаете сервисы, которые получают запросы только раз в несколько часов или даже дней, не имеет смысла иметь они бегают все время, поглощая ресурсы, которые могут быть использованы другими модулями.

Но вы все равно хотите, чтобы эти службы были доступны сразу же после поступления запроса клиента.

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

В настоящее время Kubernetes пока не предоставляет эту функцию, но в конечном итоге это произойдет.

1 голос
/ 04 мая 2020

Есть несколько способов, которыми это может быть достигнуто, возможно, наиболее "родным" способом является использование Knative с Istio. Kubernetes по умолчанию позволяет вам масштабировать до нуля, однако вам нужно что-то, что может повлиять на масштабируемые события, основанные на «входном событии», то есть что-то, что поддерживает архитектуру, управляемую событиями.

Вы можете посмотреть в официальных документах здесь: https://knative.dev/docs/serving/configuring-autoscaling/

0 голосов
/ 04 мая 2020

на основании документации он пока не поддерживает minReplicas = 0. прочитайте эту тему: - https://github.com/kubernetes/kubernetes/issues/69687. и для правильной настройки HPA вы можете использовать эту формулу для настройки требуемого модуля: -

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

вы также можете настроить HPA на основе метрик прометея, перейдя по этой ссылке: -

https://itnext.io/horizontal-pod-autoscale-with-custom-metrics-8cb13e9d475

...