zhikaichen123 opened a new issue #4874:
URL: https://github.com/apache/apisix/issues/4874


   ### Issue description
   
   #### 场景说明:
   通过核心网关配置,访问域名为yhk.market.alicloudapi.com的ai服务,调用报503异常,看日记记录提示:
   **failed to query the DNS server: recursion detected**
   
   简单说明:dns域名解析出现递归,apisix转发cname这块不支持2层以上,但是自己搭建的容器集群正常解析,只是生产环境阿里的容器解析有问题
   
   
   #### 日记记录:
   ```html
   2021/08/23 15:14:38 [error] 55#55: *309865 [lua] resolver.lua:35: 
parse_domain(): failed to parse domain: yhk.market.alicloudapi.com, error: 
failed to query the DNS server: recursion detected, client: 172.21.1.190, 
server: _, request: "POST /ai/ocr/idcard HTTP/1.1", host: "gw.winnermedical.com"
   2021/08/23 15:14:38 [error] 55#55: *309865 [lua] init.lua:178: 
parse_domain_for_nodes(): dns resolver domain: yhk.market.alicloudapi.com 
error: failed to query the DNS server: recursion detected, client: 
172.21.1.190, server: _, request: "POST /ai/ocr/idcard HTTP/1.1", host: 
"gw.winnermedical.com"
   2021/08/23 15:14:38 [error] 55#55: *309865 [lua] init.lua:482: 
http_access_phase(): failed to set upstream: no valid upstream node, client: 
172.21.1.190, server: _, request: "POST /ai/ocr/idcard HTTP/1.1", host: 
"gw.winnermedical.com"
   
   ```
   
   
   #### 找到报错原始位置
   ```html
   function _M.parse_domain(host)
       local ip_info, err = utils.dns_parse(host)
       if not ip_info then
           log.error("failed to parse domain: ", host, ", error: ",err)
           return nil, err
       end
   
       log.info("parse addr: ", json.delay_encode(ip_info))
       log.info("resolver: ", json.delay_encode(utils.get_resolver()))
       log.info("host: ", host)
       if ip_info.address then
           log.info("dns resolver domain: ", host, " to ", ip_info.address)
           return ip_info.address
       end
   
       return nil, "failed to parse domain"
   end
   
   
   function _M.resolve(self, domain, selector)
       local client = self.client
   
       -- this function will dereference the CNAME records
       local answers, err = client.resolve(domain)
       if not answers then
           return nil, "failed to query the DNS server: " .. err
       end
   
       if answers.errcode then
           return nil, "server returned error code: " .. answers.errcode
                       .. ": " .. answers.errstr
       end
   
       if selector == _M.RETURN_ALL then
           log.info("dns resolve ", domain, ", result: ", 
json.delay_encode(answers))
           for _, answer in ipairs(answers) do
               if answer.type == client.TYPE_SRV then
                   return resolve_srv(client, answers)
               end
           end
           return table.deepcopy(answers)
       end
   
       local idx = math_random(1, #answers)
       local answer = answers[idx]
       local dns_type = answer.type
       if dns_type == client.TYPE_A or dns_type == client.TYPE_AAAA then
           log.info("dns resolve ", domain, ", result: ", 
json.delay_encode(answer))
           return table.deepcopy(answer)
       end
   
       return nil, "unsupport DNS answer"
   end
   ```
   
   #### 找到最终原因
   resolver.lua:35: parse_domain(): failed to parse domain: 
yhk.market.alicloudapi.com, error: failed to query the DNS server: recursion 
detected 
   
   
   #### 文件路线:
   init.lua(384) -> upstream.lua(270)  -> resolver.lua(33)  ->  utils.lua()   
->  client.lua(102)
   
   
   ## 总结:暂时无解!
   
   
   
   ### Environment
   
   apisxi 2.6版本,在阿里的k8s容器运行
   
   
   ### Steps to reproduce
   
   如上说明
   
   ### Actual result
   
   如上说明
   
   ### Error log
   
   2021/08/23 15:14:38 [error] 55#55: *309865 [lua] resolver.lua:35: 
parse_domain(): failed to parse domain: yhk.market.alicloudapi.com, error: 
failed to query the DNS server: recursion detected, client: 172.21.1.190, 
server: _, request: "POST /ai/ocr/idcard HTTP/1.1", host: "gw.winnermedical.com"
   2021/08/23 15:14:38 [error] 55#55: *309865 [lua] init.lua:178: 
parse_domain_for_nodes(): dns resolver domain: yhk.market.alicloudapi.com 
error: failed to query the DNS server: recursion detected, client: 
172.21.1.190, server: _, request: "POST /ai/ocr/idcard HTTP/1.1", host: 
"gw.winnermedical.com"
   2021/08/23 15:14:38 [error] 55#55: *309865 [lua] init.lua:482: 
http_access_phase(): failed to set upstream: no valid upstream node, client: 
172.21.1.190, server: _, request: "POST /ai/ocr/idcard HTTP/1.1", host: 
"gw.winnermedical.com"
   
   
   ### Expected result
   
   _No response_


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to