我有一个 Openshift Origin 安装(v. 1.2.1,但也在 1.3.0 上重现了这个问题),我正在尝试通过服务名称从 DNS 获取 pod 的 IP。假设我的节点的 IP 为 192.168.58.6,我在项目“hz-test”中寻找无头服务“hz”的 pod。当我尝试通过 UDP 向 dnsmasq(安装在节点上并将请求转发到 Kubernetes 的 SkyDNS)发送 DNS 请求时,一切顺利:
# dig +notcp +noall +answer hz.hz-test.svc.cluster.local @192.168.58.6
hz.hz-test.svc.cluster.local. 14 IN A 10.1.2.5
<and so on...>
但是,当我将传输协议切换到 TCP 时,我收到以下错误:
# dig +tcp +noall +answer hz.hz-test.svc.cluster.local @192.168.58.6
;; communications error to 192.168.58.6#53: end of file
查看 tcpdump 输出后,我发现,在建立 TCP 连接(SYN - SYN/ACK - ACK)后,dnsmasq 立即发回 FIN/ACK,当 DNS 客户端尝试使用此连接发送其请求时,dnsmasq 发送返回 RST 数据包而不是 DNS 应答。我尝试从节点本身通过 TCP 执行相同的 DNS 查询,并且 dnsmasq 给了我通常的响应,即它通过 TCP 正常工作,并且仅当我尝试执行来自 pod 的请求时才出现问题。另外,我尝试通过 TCP 直接从 pod 发送相同的查询到 Kubernetes 的 DNS(避免 dnsmasq),这个查询也可以。
那么,为什么节点上的 dnsmasq 会忽略来自 pod 的 TCP 请求,以及为什么任何其他通信都可以?这是应该的行为吗?
任何帮助和想法表示赞赏。