[英]Django + Celery + Redis on a K8s cluster
我在 K8s 集群上部署了一個 Django 應用程序。 我需要發送一些電子郵件(一些是預定的,另一些應該異步發送),我的想法是將這些電子郵件委托給 Celery。
因此,我在集群上設置了一個 Redis 服務器(帶有 Sentinel),並為 Celery worker 部署了一個實例,為 Celery beat 部署了另一個實例。
用於部署 Celery worker 的 k8s 對象與用於 Django 應用程序的對象非常相似。 主要區別在於 celery worker 上引入的命令: ['celery', '-A', 'saleor', 'worker', '-l', 'INFO']
發送預定的電子郵件沒有問題(celery worker 和 celery beat 連接到 Redis 服務器沒有任何問題)。 但是,由於無法連接到 Redis 服務器( ERROR celery.backends.redis Connection to Redis lost: Retry (1/20) in 1.00 second. [PID:7:uWSGIWorker1Core0]
因此不會發送異步電子郵件 - 由 Django 應用程序“委托” 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 服務器的原因可能是什么? 我是否缺少任何變量? 可能是因為 pod 位於不同的命名空間中嗎?
謝謝!
這是為了更好的可見性而發布的社區 wiki 答案。 隨意擴展它。
來自@sofia 的解決方案有助於解決此問題:
需要為 Redis 服務器和 Django 應用程序使用相同的命名空間。 在這種特殊情況下,將命名空間“redis”更改為部署應用程序的“development”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.