我有一个 python gunicorn Web 应用程序,当我尝试使用 coredns 缓存解析内部 dns 名称时抛出以下错误:
raise ConnectionError(e, request=request)\nrequests.exceptions.ConnectionError: HTTPConnectionPool(host='lb.consul.local', port=80):
Max retries exceeded with url: /hello/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f414d5259b0>:
Failed to establish a new connection: [Errno -2] Name or service not known',))"
我可以使用 dig 解决同样的问题:
dig @172.1.0.54 lb.consul.local
; <<>> DiG 9.9.5-9+deb8u16-Debian <<>> lb.consul.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58411
;; flags: qr rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;lb.consul.local. IN A
;; ANSWER SECTION:
lb.consul.local. 1 IN A 172.10.9.0
;; Query time: 1 msec
;; SERVER: 172.1.0.54#53(172.1.0.54)
;; WHEN: Wed Feb 20 02:43:47 UTC 2019
;; MSG SIZE rcvd: 358
需要注意的一点是,从qr rd
. 如果我切换回/etc/resolv.conf
指向权威 dns 服务器而不是 coredns 服务器充当缓存,一切都会再次正常工作。
requests 库是否有任何从非权威来源解决的问题,或者有没有办法将库配置为接受来自非权威 dns 来源的响应?
编辑 2 月 20 日
运行应用程序的服务器已正确配置为与上面指定的 dns 服务器通信:
root@server-test-7bff545c5b-42ln5:/app# cat /etc/resolv.conf
nameserver 172.1.0.54
search nstest.svc.cluster.local svc.cluster.local cluster.local
ec2.internal
options ndots:5
编辑 2 月 20 日 8:50 AM PST
如果我立即背靠背运行它,我已经能够在机器内只使用 python shell 来重现它:
>>> import socket
>>> socket.getaddrinfo('lb.consul.local', 80, 0, socket.SOCK_STREAM)
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('172.10.9.0', 80))]
>>> socket.getaddrinfo('lb.consul.local', 80, 0, socket.SOCK_STREAM)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/socket.py", line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
dns端的日志:
2019-02-20T16:35:21.688Z [INFO] 172.10.112.60:41539 - 6366 "AAAA IN lb.consul.local. udp 57 false 512" NOERROR qr,aa,rd 134 0.003542729s
2019-02-20T16:35:21.717Z [INFO] 172.10.112.60:58468 - 40098 "AAAA IN lb.consul.local. udp 57 false 512" NOERROR qr,rd 134 0.000064083s
同样,失败的响应丢失了aa
。
编辑 2 月 20 日太平洋标准时间下午 6:05
又过了几个小时,我只是通过这个 PR 禁用 coredns 中的负缓存来解决这个问题:https ://github.com/coredns/coredns/pull/2588 。
这似乎解决了这个问题。但是话又说回来,我仍然不知道是什么原因导致来自 coredns 缓存的那些负面 ipv6 查询结果导致套接字库中的异常,而显然 ipv4 正在解决。