[英]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.