Задача сельдерея повторно помещается в очередь брокера при плавном завершении работы при локальном запуске, но теряется в кубернетах, несмотря на те же конфигурации
У меня есть сельдерей в стручке k8. Это мой манифест для сельдерея
apiVersion: apps/v1
kind: Deployment
metadata:
name: celery
labels:
deployment: celery
spec:
replicas: 2
selector:
matchLabels:
pod: celery
template:
metadata:
labels:
pod: celery
spec:
containers:
- name: celery
image: local_celery:latest
imagePullPolicy: Never
command: ['celery', '-A', 'proj', 'worker', '-E', '-l', 'info',]
resources:
limits:
cpu: 50m
requests:
cpu: 50m
terminationGracePeriodSeconds: 25
Мои конфигурации сельдерея в django settings.py
CELERY_TASK_ACKS_LATE = True
CELERY_WORKER_PREFETCH_MULTIPLIER = 1
CELERY_BROKER_URL = 'redis://redis:6379'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_WORKER_CONCURRENCY=1
CEELERY_TASK_REJECT_ON_WORKER_LOST=True
Когда я запускаю простое приложение django с сельдереем и redis в качестве брокера сообщений, моя задача снова помещается в очередь брокера, когда я это делаю
ctrl-C
инициировать теплый останов рабочего. Но когда одно и то же приложение развертывается в кубернетах с сельдереем, django и redis, работающими в трех разных модулях, мои задачи не возвращаются в очередь обратно в redis, когда стручок сельдерея корректно завершается. Я не могу понять почему? Мои настройки сельдерея в обоих случаях не изменились.
1 ответ
Вы уверены, что ваш celery worker корректно завершает работу в kubernetes?
Это недостаточно упоминается, когда говорят, что k8s отправляетSIGTERM
сигнал на модуле/контейнере, когда он заканчивается иSIGKILL
послеterminationgraceperiod
если модуль все еще существует, k8s отправляет этот SIGTERM процессу с идентификатором № 1 (). Итак, если ваш основной рабочий процесс сельдерея неPID 1
изящного выключения не произойдет. это происходит, если вы не используете встроенную команду celery и запускаете ее из файла сценария с помощью sh/bash.
также мы должны реализовать обработчик сигналов при запуске процесса в pid1. сельдерей в нашем случае явно имеет это. читать далее