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

连接Kubernetes Redis Service时出现Connection Refused错误求助

排查Python连接K8s Redis出现Connection Refused的问题

我来帮你一步步排查这个问题,结合你已经确认的Redis Pod内部可正常访问的信息,咱们从几个常见的方向入手:

1. 先核对Python代码的连接配置

这是最容易踩坑的点,你得确保代码里的参数和K8s Redis的配置完全匹配:

  • 主机地址:必须用Redis Service的ClusterIP或者完整的K8s内部域名(myapp-redis.mw-dev.svc.cluster.local),绝对不能用Pod的IP(Pod IP会随重启变化)。你可以用kubectl get svc myapp-redis -n mw-dev快速拿到ClusterIP。
  • 端口:和Service暴露的端口保持一致,用kubectl describe svc myapp-redis -n mw-dev看Port字段,一般默认是6379。
  • 密码:确保代码里写的是test,别出现拼写错误或者多余空格。

给你个正确的redis-py连接示例:

import redis

# 用K8s内部域名或者ClusterIP都可以
redis_conn = redis.Redis(
    host="myapp-redis.mw-dev.svc.cluster.local",
    port=6379,
    password="test",
    decode_responses=True
)

# 测试连接
try:
    print(redis_conn.ping())
except Exception as e:
    print(f"连接失败: {e}")

2. 检查Python运行环境到Redis Service的连通性

分两种场景排查:

如果Python代码在K8s集群内的其他Pod里

先进入这个Pod,用工具测试端口是否能通:

# 用telnet测试
telnet myapp-redis.mw-dev.svc.cluster.local 6379
# 或者用nc测试
nc -zv myapp-redis.mw-dev.svc.cluster.local 6379

如果不通,检查这两点:

  • 两个Pod是否在同一个Namespace?不在的话要使用完整服务域名,或者确认跨Namespace访问的NetworkPolicy规则。
  • 集群里是否有NetworkPolicy阻止了流量?可以临时禁用相关Policy试试,或者检查规则是否允许当前Pod访问Redis Service。

如果Python代码在K8s集群外部

那你得先确认Redis Service的类型:

  • 如果是ClusterIP:这种类型只能集群内部访问,外部连不了。你可以先试试端口转发临时测试:
    kubectl port-forward svc/myapp-redis 6379:6379 -n mw-dev
    
    然后Python代码里用localhost:6379连接。如果要长期外部访问,得把Service改成NodePort或LoadBalancer类型。
  • 如果是NodePort:确认你用的节点IP和NodePort是否正确,同时检查节点防火墙有没有开放这个端口。

3. 检查Redis的绑定地址配置

有时候Redis默认只绑定127.0.0.1,这样即使Service转发流量也会失败。你可以进入Pod查看配置:

kubectl exec -it myapp-redis-[xxx] -n mw-dev sh
cat /etc/redis/redis.conf | grep bind

如果输出是bind 127.0.0.1,就得修改配置让Redis监听所有地址:
在你的Redis.yaml里,给Redis容器添加启动参数--bind 0.0.0.0,比如:

containers:
- name: redis
  image: redis:latest
  command: ["redis-server", "--bind", "0.0.0.0", "--requirepass", "test"]

修改后重启Deployment即可。

4. 确认Service和Pod的关联是否正常

Service是通过Endpoints绑定Pod的,你可以用下面的命令检查:

kubectl get endpoints myapp-redis -n mw-dev

如果Endpoints是空的,说明Service的selector和Pod的标签不匹配。你可以分别查看Deployment和Service的标签/选择器:

# 查看Deployment的Pod标签
kubectl describe deployment myapp-redis -n mw-dev | grep -E "Labels|Selector"
# 查看Service的选择器
kubectl describe svc myapp-redis -n mw-dev | grep Selector

确保两者的标签完全一致,比如都是app: myapp-redis。

按照上面的步骤一步步排查,应该能快速定位到问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:39:03