K8s: ЦП узла упал до 1 после примерно 1 часа вычислений - PullRequest
1 голос
/ 22 марта 2020

Архитектура

Я использую Kubernetes для обработки заданий с помощью сканера / скребка. 4 узла (каждый 8G и 4 процессора). Без автоматического масштабирования кластера, с Digital Ocean.

Существует 3 различных контейнера:

  1. Очередь Redis (реплики 1), для хранения идентификаторов + связанная служба
  2. Cron. js работает в контейнере (rpeplicas 1, ограничения: 0,5 CPU / 1000Mi), добавляя 37000 идентификаторов в очередь Redis один раз в день.
  3. Crawler. js для сканирования элементов с помощью Puppeteer. Он берет идентификатор из очереди Redis, удаляет данные и затем удаляет идентификатор из очереди Redis. Он использует nodejs дочерний процесс для ускорения сканирования с 2 рабочими.

=> Crawler использование 1 реплика , и активируйте HPA до 15 модулей , если процессор идет до 75% (при запуске обработки заданий в очереди). Ресурсы искателя: Запросы: память 300Mi, ограничения на 0,3 процессора: 450Mi, 0,4 процессора

При сканировании контейнер искателя всегда потребляет 100% ЦП и 100% на запросах и приближается к пределам .


Ожидаемый объем:

Сканер должен начинать сканирование элементов один раз в день, используйте много ЦП, запускает HPA и затем 15 модулей работают для сканирования элементов. Он должен сканировать в течение нескольких часов (потребляя каждый идентификатор в очереди), а затем возвращаться к нормальному состоянию (1 реплика), когда сканирование завершено.

При очереди в 1000 элементов это должно занять около 10 мин для сканирования и все работает.

Проблема

Использование 37000 элементов в очереди: Через ~ 50 мин. ЦП каждого сканера на узле снижается до 1 (0%) но память остается вокруг запроса. Это происходит сначала с одним узлом, а затем через 10 минут на другом (Изображение из Grafana / Prometheus: Графическое изображение сбоя процессора. Вы можете ясно видеть некоторые стручки теряют процессор, все они принадлежат одному узлу). Память продолжает оставаться почти нормальной. Сканер остается неопределенным при запуске браузера кукловода и больше не сканирует.

Состояние исправно, все работает нормально

Стручки на одном узле имеют свой ЦП при снижении можно увидеть, что память остается стабильной

График модуля с процессором 1/0%

Ошибка 2-го узла

Узлы kubectl top nodes:

             CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
 ...e-zwl2   2261m        56%    2456Mi          36%
 ...e-zwll   2240m        56%    2809Mi          41%
 ...e-zwpb   123m         3%     2562Mi          38%
 ...e-zwss   159m         3%     2878Mi          43%

График, после ~ 1 часа сканирования

            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
...e-zwl2   1996m        49%    2395Mi          35%
...e-zwll   2106m        52%    2925Mi          43%
...e-zwpb   204m         5%     2554Mi          38%
...e-zwss   129m         3%     2875Mi          42%

Любые идеи, как отлаживать это?

Что я пробовал:

  • Увеличение лимитов и запросов для модуля.
  • Уменьшить количество рабочих до 1.
  • Добавить больше узлов (8G 4cpu).
  • Запустить его в разное время дня.
  • Удалить HPA.
  • Уничтожение неработающего модуля: он перезагружается и нормально сканируется.
  • Проверьте Redis CPU / Mem, регистрирует: все нормально.
  • Добавьте больше CPU и памяти к гусеничным коробочкам.

Примечания:

Что-то, что я заметил, стручки ресничек в системе kube иногда перезагружаются, я не знать, связано ли это с моей проблемой или полезно для точного.

Искатель не новый и был закодирован для работы на docker контейнере с pm2, он работает нормально в производство. Мы перемещаем его в Kubernetes.

Я должен использовать 2 других микросервиса и Cluster Auto Scale. Но для упрощения я остановлюсь на 3 микро сервисах, связанных с ошибкой. Кроме того, я отключил хранение списанных данных в другой внешней БД, чтобы упростить проблему и выделить ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...