Warum sind DNS-Suchen von bestimmten Pods so langsam?

Beheben Sie langsame DNS-Lookups, die zu Verbindungsverzögerungen in Ihrem Cluster führen.

Bestimmte Container, die auf Alpine Linux basieren, wie z. B. NGINX, haben Probleme mit der Behandlung von DNS-Anfragen, die dazu führen können, dass sie keine gültigen DNS-Antworten verarbeiten. Ein kleiner Prozentsatz der DNS-Lookups von diesen Pods kann mehr als 5 Sekunden statt der üblichen weniger als 80 ms dauern. Wenn die für Ihre Anwendung eingestellte Zeitüberschreitung weniger als 5 Sekunden beträgt, können die DNS-Suchvorgänge eine Zeitüberschreitung verursachen.

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 anschließend 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 (AAAA-Datensatz) und eine IPv4 (A-Datensatz) Antwort fast zur gleichen Zeit zurückgegeben werden, kann eine der beiden Antworten nicht verarbeitet werden, was dazu führt, dass 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 Weisen 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 options single-request-reopen oder options single-request in die Datei /etc/resolv.conf des Client-Pods ein. Verwenden Sie beispielsweise den folgenden postStart-Befehl, um Ihrem Pod diese Optionen hinzuzufügen. Mit diesen Optionen wird der DNS-Client angewiesen, jeweils nur eine Anfrage (A oder AAAA) zu senden, um das Problem zu vermeiden, dass zwei Antworten fast gleichzeitig zurückkommen.
  lifecycle:
  postStart:
    exec:
      command:
      - /bin/sh
      - -c
      - "/bin/echo 'options single-request-reopen' >> /etc/resolv.conf"