You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s集群跨namespace下Django调用Celery异步任务无法连接Redis问题排查

问题原因与解决方案

根因定位

  • 报错No address associated with hostname是典型的K8s跨命名空间服务DNS解析失败问题,和服务部署在不同命名空间直接相关:
    K8s默认的DNS解析规则为:同一命名空间下的服务可以直接通过服务名访问;跨命名空间访问时,必须在服务名后补充.所在命名空间后缀,否则DNS只会在当前Pod所在命名空间下查找同名服务,无法命中其他命名空间的服务。
    你的Celery worker、beat和Redis都在redis命名空间,所以直接用redis:6379可以正常解析;但Django应用在development命名空间,直接访问redis主机名时无法找到对应服务,因此触发连接报错。

修复配置

直接修改Django应用的Celery相关环境变量,将Redis主机名替换为跨命名空间的完整服务域名即可,无需新增其他配置项:

- name: CELERY_PASSWORD
  valueFrom:
    secretKeyRef:
      name: redis-password
      key: redis_password
- name: CELERY_BROKER_URL
  value: redis://:$(CELERY_PASSWORD)@redis.redis.svc.cluster.local:6379/1
- name: CELERY_RESULT_BACKEND
  value: redis://:$(CELERY_PASSWORD)@redis.redis.svc.cluster.local:6379/1

注:默认K8s集群的服务域名后缀为svc.cluster.local,如果你的集群修改过默认域名后缀,替换为对应后缀即可。

验证方法

修改配置重启Django Pod后,进入Pod容器内执行以下命令验证解析是否正常:
nslookup redis.redis.svc.cluster.local
如果返回正常的ClusterIP,说明解析配置生效,Redis连接即可恢复。

补充适配Sentinel高可用配置

你部署的是带Sentinel的Redis高可用集群,当前直连Redis 6379端口的配置在主节点故障切换时会失效,建议同步调整Celery配置为Sentinel连接模式:

CELERY_BROKER_URL = "sentinel://:${CELERY_PASSWORD}@sentinel-0.redis.svc.cluster.local:26379;sentinel://:${CELERY_PASSWORD}@sentinel-1.redis.svc.cluster.local:26379;sentinel://:${CELERY_PASSWORD}@sentinel-2.redis.svc.cluster.local:26379"
CELERY_BROKER_TRANSPORT_OPTIONS = {
    "master_name": "mymaster", # 替换为你实际的Redis主节点名称
    "sentinel_kwargs": {"password": "${CELERY_PASSWORD}"}
}

内容的提问来源于stack exchange,提问作者Sofia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:54:04