Warum sind DNS-Suchen von bestimmten Pods so langsam?
Bestimmte Container, die auf Alpine Linuxbasieren, wie z. B. NGINX, haben Probleme bei der Behandlung von DNS-Abfragen, die dazu führen können, dass sie keine gültigen DNS-Antworten verarbeiten. Ein kleiner Prozentsatz der DNS-Suchen aus diesen Pods kann über 5 Sekunden dauern, anstatt die typischen <80mszu verwenden. Wenn das für Ihre Anwendung festgelegte Zeitlimit weniger als 5 Sekunden beträgt, können die DNS-Suchen das Zeitlimit überschreiten.
Um zu testen, ob Ihr Pod dieses Problem aufweist, melden Sie sich bei ihm an und überprüfen Sie, ob 'curl ' installiert ist. Sie können curl mit dem Befehl apk add curl
installieren. Führen Sie dann innerhalb des Pods den folgenden
Befehl aus.
for i in $(seq 1 50); do curl -k -w "time_namelookup: %{time_namelookup}\n" -so /dev/null "https://www.ibm.com/"; done
Dieses Problem kann durch die Art und Weise verursacht werden, wie DNS-Antworten in diesen Pods behandelt werden. Wenn beispielsweise eine IPv6-Antwort (AAAA-Datensatz) und eine IPv4-Antwort (A-Datensatz) nahezu gleichzeitig zurückgegeben werden, wird eine der beiden Antworten möglicherweise nicht verarbeitet, sodass der DNS-Client die Antwort nicht registriert. Nach einer Verzögerung von 5 Sekunden sendet der DNS-Client eine neue Anforderung.
Sie können dieses Problem auf eine der folgenden Arten beheben.
- (Bevorzugt) Verwenden Sie ein Basisimage für Ihren Container, das dieses Problem nicht aufweist, wie z. B. Alpine 3.18. Sie können auch Alpine durch ubi-minimalersetzen.
- Fügen Sie die Optionen
options single-request-reopen
oderoptions single-request
zur/etc/resolv.conf
-Datei des Client-Pods hinzu. Verwenden Sie beispielsweise den folgendenpostStart
-Befehl, um Ihrem Pod diese Optionen hinzuzufügen. Diese Optionen weisen den DNS-Client an, nur jeweils eine Anforderung (A oder AAAA) zu senden, und vermeiden das Problem, dass zwei Antworten nahezu gleichzeitig zurückgegeben werden.
lifecycle:
postStart:
exec:
command:
- /bin/sh
- -c
- "/bin/echo 'options single-request-reopen' >> /etc/resolv.conf"