故障发生背景:
租户反馈生产业务服务连接到中间件的时候,偶尔会有连接失败的情况,然后我们查看对应组件服务正常,手动请求组件服务也显示正常,让租户查看业务服务日志发现报错无法解析对应的域名,我们手动是可以解析的,报错如下:
2023-06-01 17:21:32,653 [573462087] [lettuce-epollEventLoop-6-2] WARN io.lettuce.core.RedisClient[605] - Cannot connect Redis Sentinel at redis://zzpod6clusterprod-redis-tydb-1-sentinel.paas-middleware:26379: java.util.concurrent.CompletionException: io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException: Failed to resolve ‘zzpod6clusterprod-redis-tydb-1-sentinel.paas-middleware’ and search domain query for configured domains failed as well: [tydb.svc.cluster.local, svc.cluster.local, cluster.local]
故障处理过程
根据业务日志反馈的报错,我们在手动验证集群coredns解析没问题的同时,查看了下coredns的日志,发现日志中确实解析成功的也有解析失败的,如下:
按理说手动测试解析一直没有问题,而且不是所有服务都是这种情况,查看了下租户解析有问题的服务,发现租户解析有问题服务中都配置了外部dns server,如下:
这个外部dns服务器之前租户是有这个需求的,想着k8s集群内的服务能请求到特定的域名,后面我把这个外部dns服务地址给他配置到k8s集群的cordens配置里,实现访问特定域名地址可以通过coredns转给外部dns服务器进行解析。coredns配置外部dns服务如下:
从如上分析来看,既然在coredns中已经配置了外部转发dns服务,租户如果继续在服务中还配置外部dns服务地址,就会导致应用服务会有两个dns nameserver,首先会访问集群内部域名地址会解析到pod中配置的那个外部dns服务中,会出现解析不了的情况,就反馈失败,然后轮到集群内部定义的dns服务就会正常解析成功。
故障处理结果
把在服务中配置dnscongfig相关参数去掉,让服务统一走集群内的coredns进行转发处理即可。