Создание системы очередей с 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 не имеет понятия очереди, поэтому у него нет возможности узнать, когда очередь заполнена. Если вам нужен контроль очереди, это должно произойти до отправки рабочих процессов.
После отправки рабочих процессов есть несколько способов ограничить использование ресурсов.
- Ресурсы модуля - каждый шаг рабочего процесса представлен модулем Kubernetes. Вы можете установить запросы ресурсов и ограничения, как если бы вы использовали модуль в развертывании.
- Ограничение параллелизма шагов - в рамках рабочего процесса вы можете ограничить количество шагов, выполняемых одновременно. Это может помочь, когда шаг особенно ресурсоемкий.
- Ограничение параллелизма рабочих процессов - вы можете ограничить количество рабочих процессов, выполняемых одновременно, настроив их для нас как семафор.
Существует ряд других оптимизаций производительности, таких как установка TTL рабочего процесса и Pod и выгрузка YAML для больших рабочих процессов в БД вместо их хранения в кластере.
Насколько мне известно, невозможно установить ограничение рабочего процесса, чтобы Арго отклонял дополнительные представления рабочего процесса до тех пор, пока не будет доступно больше ресурсов. Это проблема, если вы беспокоитесь о том, что Kubernetes etcd заполнится слишком большим количеством определений рабочего процесса.
Чтобы не взорвать etcd, вам понадобится другое приложение, находящееся в Argo, чтобы ставить в очередь представления рабочих процессов до тех пор, пока не станет доступно больше ресурсов.