Запуск Kubernetes cronjob на выделенном модуле

У меня есть API в качестве службы Kubernetes, и мне нужно запускать конечную точку в API каждый час. (тяжелый статистический расчет, занимает около 3-5 минут)

В настоящее время я использую curl для прямого вызова конечной точки:

containers:
- name: callout
    image: 'buildpack-deps:curl'
    args:
        - /bin/sh
        - '-ec'
        - 'curl http://api-service/v1/Stats/CalculateStats'

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

Как я могу создать выделенный модуль из того же образа API с более высоким запросом ЦП (чтобы он мог работать быстрее) и запустить на нем расчет, а затем удалить модуль и повторить процесс по следующему расписанию?

Спасибо


person dvdmn    schedule 25.04.2021    source источник
comment
Может ли CronJob вместо запуска curl запустить модуль, image: которого совпадает с вашим обычным приложением, но с другим command:, выполняющим задачу обновления?   -  person David Maze    schedule 26.04.2021
comment
@DavidMaze Я не уверен, поддерживает ли .Net Core это или нет. я проверю, спасибо   -  person dvdmn    schedule 26.04.2021


Ответы (1)


Вот что пришло мне на ум:

  1. Создайте отдельное развертывание для задачи cronjob. Это развертывание будет в основном идентично производственному развертыванию, но с более высоким требованием к ЦП и (важно!) отдельным тегом. Установите счетчик реплик на 0 по умолчанию. Это развертывание можно обновлять всякий раз, когда обновляется производственное развертывание, поэтому оба развертывания запускают одну и ту же версию приложения.
  2. Создайте отдельную службу, которая привязывается ко всем модулям к вновь созданному тегу в 1. Эта служба не должна быть доступна для общественности (например, в Интернете).

В кронджобе:

  • Увеличьте развертывание, созданное в 1., до 1.
  • Подождите, пока модуль развертывания будет готов.
  • Выполните curl-команду
  • Уменьшите масштаб развертывания, созданного в 1., обратно до 0

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

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

person Turing85    schedule 25.04.2021
comment
Я нашел команду «масштабировать развертывание вверх/вниз», но есть ли способ запускать команды kubectl в cronjob? kubectl scale --replicas=‹expected_replica_num› развертывание ‹deployment_name› - person dvdmn; 27.04.2021