连接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:这种类型只能集群内部访问,外部连不了。你可以先试试端口转发临时测试:
然后Python代码里用kubectl port-forward svc/myapp-redis 6379:6379 -n mw-devlocalhost: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
相关产品推荐
相关产品推荐

