2016-11-21 7 views
1

저는 Openshift Origin 설치 (1.2.1 버전뿐 아니라 1.3.0에서이 문제도 재현)되어 있으며 서비스 이름별로 포드 IP를 DNS에서 가져 오려고합니다 . 노드에 IP 192.168.58.6이 있다고 가정하고 프로젝트 'hz-test'에서 헤드리스 서비스 'hz'의 포드를 찾습니다. 내가 (노드에 설치하고는 Kubernetes 'SkyDNS에 요청을 전달한다) UDP를 통해하는 dnsmasq에 대한 DNS 요청을 보내려고하면, 모든 것이 순조롭게 진행 :DNS가 포드에서 TCP를 통해 작동하지 않습니다

# 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가 DNS 응답 대신 RST 패킷을 되돌려 보냅니다. 나는 iteself 노드에서 TCP를 통해 동일한 DNS 쿼리를 수행하려고 시도했으며 dnsmasq는 보통 응답을 보냈습니다. 즉, TCP를 통해 정상적으로 작동했으며 문제는 포드에서 요청을 수행하려고했을 때만 발생했습니다. 또한, 나는 TCP를 통해 동일한 쿼리를 포드에서 Kubernetes의 DNS (dnsmasq 사용하지 않음)로 직접 보내려고했지만이 쿼리도 괜찮았다.

그래서 노드의 dnsmasq이 창에서 TCP 요청을 무시하고 다른 통신이 정상적인 이유는 무엇입니까? 행동이라고 생각 하나?

도움과 아이디어를 제공해 주시면 감사하겠습니다.

답변

1

마지막으로, dnsmasq가 노드의 IP를 수신하도록 구성 되었기 때문입니다 (listen-adress = 192.168.58.6). 이러한 구성을 사용하면 dnsmasq는 에 모두 노드의 네트워크 인터페이스에 바인드되지만 사용자 공간에서 (즉 자체적으로) "잘못된"연결을 거부하려고합니다.

하는 dnsmasq가 192.168.58.6로 포드의 요청이 같은 구성으로 금지 된 결정 난 정말 왜 이해하지 않는다, 그러나 나는 강제

interface=eth0 
bind-interfaces 

에 "수신 주소"를 변경하여 작업을 얻었다 dnsmasq는 실제로 IP 192.168.58.6을 사용하는 NIC에만 바인딩합니다. 그 후 dnsmasq는 모든 TCP 요청을 받아들이 기 시작했습니다.