Предотвратить убийство некоторых стручков, когда возможно уменьшение? - PullRequest
2 голосов
/ 24 апреля 2019

Мне нужно масштабировать набор модулей, в которых работают работники на основе очередей.Работа для рабочих может выполняться долго (часы) и не должна прерываться.Количество стручков зависит от длины рабочей очереди.Для масштабирования можно использовать либо горизонтальное автоматическое масштабирование с использованием пользовательских метрик, либо простой контроллер, который изменяет количество реплик.

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

Каков был бы способ сделать это с низкой сложностью?Одна вещь, о которой я могу подумать, - это сделать это на основе использования процессором модулей.Не идеально, но это может быть достаточно хорошо.Другой способ может заключаться в том, чтобы работники каким-то образом выставляли приоритет, указывающий, являются ли они предпочтительным модулем, который нужно удалить.Этот приоритет может меняться каждый раз, когда работник выбирает новое задание.

В конечном итоге все задания будут краткосрочными, и эта проблема исчезнет, ​​но пока это долгосрочная цель.

1 Ответ

2 голосов
/ 24 апреля 2019

Во время процесса завершения капсулы Kubernetes отправляет сигнал SIGTERM в контейнер вашей капсулы.Вы можете использовать этот сигнал для корректного завершения работы вашего приложения.Проблема в том, что Kubernetes не ждет вашего приложения вечно, и в вашем случае вашему приложению может потребоваться много времени для его выхода.
В этом случае я рекомендую использовать preStop hook , которыйзавершено до того, как Kubernetes отправит сигнал KILL в контейнер.Вот пример здесь о том, как использовать обработчики:

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
...