Ich habe eine OpenShift Origin-Installation (v. 1.2.1, aber reproduziert dieses Problem auch auf 1.3.0), und ich versuche, Pods IPs von DNS nach Dienstname zu bekommen . Nehmen wir an, mein Knoten hat IP 192.168.58.6, und ich suche nach Pods mit Headless-Service 'hz' im Projekt 'hz-test'. Wenn ich versuche, DNS-Anfrage an dnsmasq zu senden (die auf Knoten installiert ist und leitet Anfragen an Kubernetes' SkyDNS) über UDP, geht alles gut:DNS funktioniert nicht über TCP von Pod
# 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...>
Allerdings, wenn ich Transportprotokoll TCP wechseln, erhalte ich die folgende Fehlermeldung:
# 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
nach einem Blick auf tcpdump Ausgang habe ich entdeckt, dass nach einer TCP-Verbindung hergestellt wird (SYN - SYN/ACK - ACK) dnsmasq sofort sendet FIN/ACK, und wenn das DNS-Client versucht Um seine Anfrage über diese Verbindung zu senden, sendet dnsmasq anstelle der DNS-Antwort ein RST-Paket zurück. Ich habe versucht, die gleiche DNS-Abfrage über TCP vom Knoten selbst durchzuführen, und dnsmasq gab mir die übliche Antwort, d. H. Es funktionierte normal über TCP, und das Problem trat nur auf, als ich versuchte, eine Anfrage vom Pod auszuführen. Außerdem habe ich versucht, dieselbe Abfrage über TCP direkt vom Pod zum Kubernetes DNS zu senden (dnsmasq zu vermeiden), und diese Abfrage war auch OK.
Also, warum dnsmasq auf Knoten ignoriert TCP-Anfragen von Pods, und warum jede andere Kommunikation in Ordnung ist? Ist es Verhalten?
Jede Hilfe und Ideen sind willkommen.