Redis Sentinel无法解析Redis主机名问题求助
Redis Sentinel无法解析K8s集群内Redis主机名的解决方案
问题定位
从日志看,Sentinel服务和客户端都无法解析Redis的StatefulSet Pod域名redis-0.redis.xxxx-service-platform.svc.cluster.local,属于Kubernetes集群内DNS解析异常,即便同集群部署也可能因配置疏漏导致。
分步排查与修复
1. 手动测试Pod内DNS解析
进入Sentinel Pod执行解析测试,确认DNS服务是否正常:
# 进入目标Sentinel Pod kubectl exec -it <your-sentinel-pod-name> -- /bin/sh # 用nslookup测试域名解析 nslookup redis-0.redis.xxxx-service-platform.svc.cluster.local # 或用dig工具(若Pod内已安装) dig redis-0.redis.xxxx-service-platform.svc.cluster.local
- 若解析失败,检查Pod内
/etc/resolv.conf文件,确认DNS服务器指向K8s集群DNS(通常是coredns.kube-system.svc.cluster.local或kube-dns.kube-system.svc.cluster.local) - 若resolv.conf配置错误,检查Pod所属Namespace的
dnsPolicy是否被手动修改(默认ClusterFirst即可)
2. 验证Redis Service与Pod关联
确保Redis的StatefulSet Podredis-0处于Running状态,且对应的Headless Service配置正确:
# 查看Redis Pod状态 kubectl get pods -n xxxx-service-platform # 查看Redis Headless Service详情 kubectl get svc redis -n xxxx-service-platform -o yaml
- 重点检查Service的
spec.selector是否与Redis Pod的标签完全匹配,不匹配会导致Service无法关联Pod,进而域名无解析记录
3. 修正Sentinel监控配置
检查ConfigMap中的Sentinel配置,确保监控地址正确:
# 示例正确的Sentinel配置片段 sentinel monitor mymaster redis-0.redis.xxxx-service-platform.svc.cluster.local 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000
- 推荐直接使用Headless Service域名
redis.xxxx-service-platform.svc.cluster.local,Sentinel会自动发现集群内所有Redis节点,避免单个Pod域名失效问题 - 确保配置中未设置
resolve-hostnames no(默认启用解析,无需手动修改)
4. 检查NetworkPolicy限制
确认Sentinel所在Namespace与Redis所在Namespace之间没有NetworkPolicy拦截DNS流量(UDP 53端口):
# 查看两个Namespace的NetworkPolicy kubectl get networkpolicy -n xxxx-service-platform kubectl get networkpolicy -n <sentinel-namespace>
- 若存在限制规则,添加允许访问K8s DNS服务的策略,示例:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns namespace: <sentinel-namespace> spec: podSelector: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53
5. 重建Sentinel Pod
若以上配置均无问题,删除并重建Sentinel Pod,确保加载最新配置与DNS设置:
kubectl delete pod <your-sentinel-pod-name> -n <sentinel-namespace>
内容的提问来源于stack exchange,提问作者Aykut MÜNÜK
相关产品推荐
相关产品推荐

