同集群内Node.js Pod连接Redis Pod失败问题求助
看起来你遇到的问题主要来自两个关键配置疏漏,咱们一步步来排查和修复:
1. 修正Redis服务的DNS引用名称
你在Node.js应用里配置的连接地址是redis:6379,但你的Redis Service名称是redis-master——在Kubernetes的DNS系统中,Service的域名是<service-name>.<namespace>.svc.cluster.local(如果使用默认namespace就是redis-master.default.svc.cluster.local)。所以你的应用应该使用**redis-master:6379**作为连接地址,而不是redis:6379,这才是导致ENOTFOUND错误的直接原因。
2. 给Redis Pod添加匹配Service选择器的标签
你的Redis Service的selector指定了app: redis、role: master、tier: backend,但你的Redis Pod的metadata里完全没有这些标签!这会导致Service无法关联到对应的Pod,就算你用对了Service地址,请求也找不到后端实例。
修改你的Redis Pod YAML,在metadata部分补充匹配的labels:
apiVersion: v1 kind: Pod metadata: name: redis labels: # 新增这部分标签 app: redis role: master tier: backend spec: # 原有的spec内容保持不变 containers: - name: redis image: redis:5.0.4 # ... 其余配置省略
补充说明:为什么localhost不行?
当你用localhost:6379时,Node.js应用会尝试连接自己Pod内部的6379端口,但你的Node.js Pod里并没有运行Redis服务,所以会出现ECONNREFUSED错误——在Kubernetes中,每个Pod都是独立的网络实体,localhost只指向当前Pod本身,跨Pod访问必须通过Service或者Pod的IP(但Service是更可靠的生产级方式)。
完成以上修改后,重新部署Redis Pod,再重启你的Node.js应用Pod,应该就能正常连接Redis了。
内容的提问来源于stack exchange,提问作者Jacobdo

