Создание системы очередей с Argo Workflows

Я пытаюсь понять, как настроить очередь работы с Арго. Рабочие процессы Argo требуют больших вычислительных ресурсов. Нам нужно спланировать одновременное выполнение множества запросов. Элементы рабочего процесса добавляются в очередь работ через HTTP-запросы.

Поток можно продемонстрировать так:

client  
  => hasura # user authentication  
    => redis # work queue
      => argo events # queue listener
        => argo workflows 
          => redis + hasura # inform that workflow has finished
            => client 

Я никогда не строил кластер K8s, превышающий его ресурсы. Где я могу ограничить выполнение рабочих процессов? Или события и рабочие процессы Argo ограничивают их в соответствии с ресурсами в кластере?

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

client
  => argo events # HTTP request listener
    => argo workflows

1 ответ

Решение

Argo Workflows не имеет понятия очереди, поэтому у него нет возможности узнать, когда очередь заполнена. Если вам нужен контроль очереди, это должно произойти до отправки рабочих процессов.

После отправки рабочих процессов есть несколько способов ограничить использование ресурсов.

  1. Ресурсы модуля - каждый шаг рабочего процесса представлен модулем Kubernetes. Вы можете установить запросы ресурсов и ограничения, как если бы вы использовали модуль в развертывании.
  2. Ограничение параллелизма шагов - в рамках рабочего процесса вы можете ограничить количество шагов, выполняемых одновременно. Это может помочь, когда шаг особенно ресурсоемкий.
  3. Ограничение параллелизма рабочих процессов - вы можете ограничить количество рабочих процессов, выполняемых одновременно, настроив их для нас как семафор.

Существует ряд других оптимизаций производительности, таких как установка TTL рабочего процесса и Pod и выгрузка YAML для больших рабочих процессов в БД вместо их хранения в кластере.

Насколько мне известно, невозможно установить ограничение рабочего процесса, чтобы Арго отклонял дополнительные представления рабочего процесса до тех пор, пока не будет доступно больше ресурсов. Это проблема, если вы беспокоитесь о том, что Kubernetes etcd заполнится слишком большим количеством определений рабочего процесса.

Чтобы не взорвать etcd, вам понадобится другое приложение, находящееся в Argo, чтобы ставить в очередь представления рабочих процессов до тех пор, пока не станет доступно больше ресурсов.

Другие вопросы по тегам