Django + Celery + Redis на кластере K8s
У меня есть приложение Django, развернутое на кластере K8s. Мне нужно отправить несколько писем (некоторые из них запланированы, другие должны быть отправлены асинхронно), и идея заключалась в том, чтобы делегировать эти письма Celery.
Итак, я установил сервер Redis (с Sentinel) на кластере, развернул экземпляр для Celery worker и еще один для Celery beat.
Объект k8s, используемый для развертывания Celery worker, довольно похож на тот, что используется для приложения Django. Основное различие заключается в команде, введенной на celery worker: ['celery', '-A', 'saleor', 'worker', '-l', 'INFO']
Запланированные письма отправляются без проблем (celery worker и celery beat не имеют проблем с подключением к серверу Redis). Однако асинхронные письма - "делегированные" приложением Django - не отправляются, потому что невозможно подключиться к серверу Redis (ERROR celery.backends.redis Connection to Redis lost: Retry (1/20) in 1.00 second. [PID:7:uWSGIWorker1Core0]
)
Ошибка 1:
socket.gaierror: [Errno -5] No address associated with hostname
Ошибка 2:
redis.exceptions.ConnectionError: Error -5 connecting to redis:6379. No address associated with hostname.
Сервер Redis, Celery worker и Celery beat находятся в пространстве имен "redis", а все остальное, включая приложение Django, - в пространстве имен "development".
Вот переменные, которые я определяю:
- name: CELERY_PASSWORD
valueFrom:
secretKeyRef:
name: redis-password
key: redis_password
- name: CELERY_BROKER_URL
value: redis://:$(CELERY_PASSWORD)@redis:6379/1
- name: CELERY_RESULT_BACKEND
value: redis://:$(CELERY_PASSWORD)@redis:6379/1
Я также попытался определить CELERY_BACKEND_URL
(с тем же значением, что и CELERY_RESULT_BACKEND
), но это ничего не изменило.
Какова может быть причина отсутствия подключения к серверу Redis? Может быть, мне не хватает каких-то переменных? Может ли это быть из-за того, что стручки находятся в другом пространстве имен?
Спасибо!