如何在AKS集群中将Redis+Sentinel暴露至外部?连接失败求助
问题排查与解决方案
核心原因
报错getaddrinfo ENOTFOUND redis-0.redis.stress-tr.svc.cluster.local的本质是:Sentinel向客户端返回了K8s集群内部的Redis节点域名,但该域名仅能在集群内部解析,外部客户端无法识别。你通过Ingress只暴露了Sentinel服务,但客户端连接Sentinel获取主节点地址后,尝试访问的是集群内部域名,自然无法解析。
具体排查与修复步骤
1. 检查Ingress的TCP协议支持配置
Sentinel使用的是TCP协议,而默认的Nginx Ingress仅处理HTTP/HTTPS流量,你的当前配置存在适配问题:
- 核对Sentinel Service端口:Sentinel默认端口是
26379,你的Ingress配置中填的是5000,需确认sentinelService的端口映射是否匹配。 - 配置Nginx Ingress的TCP转发:
- 创建TCP配置的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-tcp namespace: <Ingress Controller所在命名空间> data: # 格式:外部端口: 命名空间/服务名:服务端口 26379: "stress-tr/sentinel:26379" - 修改Nginx Ingress Controller的Deployment,挂载该ConfigMap并暴露对应端口:
在Deployment的volumes中添加:
在容器的- name: tcp-services configMap: name: nginx-ingress-tcpvolumeMounts中添加:
同时在容器的- name: tcp-services mountPath: /etc/nginx/tcp-services.dports中添加:- name: tcp-26379 containerPort: 26379 protocol: TCP - 更新Ingress配置,确保端口与TCP映射一致。
- 创建TCP配置的ConfigMap:
2. 修改Redis与Sentinel的公告地址配置
解决外部客户端无法解析集群内部域名的核心是让Redis节点和Sentinel向客户端返回外部可访问的地址:
- 对Redis主从节点,添加以下配置:
如果用NodePort暴露Redis,这里填Node的公网IP+NodePort;如果用LoadBalancer,填LoadBalancer的IP+Redis端口。# 主从节点都需要配置,指定外部可访问的IP/域名和端口 replica-announce-ip <外部可访问IP/域名> replica-announce-port <Redis对外暴露的端口> - 对Sentinel节点,添加以下配置:
# 指定Sentinel对外暴露的IP/域名和端口 sentinel announce-ip <外部可访问IP/域名> sentinel announce-port <Sentinel对外暴露的端口>
3. 替代方案:用LoadBalancer暴露Redis节点
如果不想配置Ingress的TCP转发,可以直接为Redis主从节点创建LoadBalancer类型的Service,让外部客户端能直接访问Redis节点的公网IP,同时配合上述公告地址配置,确保Sentinel返回正确的外部地址。
4. 临时测试验证
如果需要快速验证,可以在客户端机器的/etc/hosts中添加一条映射:
<Redis节点的公网IP> redis-0.redis.stress-tr.svc.cluster.local
这只是临时方案,不适合生产环境,仅用于排查问题。
内容的提问来源于stack exchange,提问作者RahulKumar Surati
相关产品推荐
相关产品推荐

