ProHoster > Blog > Verwaltung > Aus dem Leben mit Kubernetes: Wie der HTTP-Server den Spaniern nicht gefiel
Aus dem Leben mit Kubernetes: Wie der HTTP-Server den Spaniern nicht gefiel
Ein Vertreter unseres Kunden, dessen Anwendungsstapel sich in der Microsoft-Cloud (Azure) befindet, ging auf ein Problem ein: Vor kurzem endeten einige Anfragen einiger Kunden aus Europa mit Fehler 400 (Bad Request). Alle Anwendungen sind in .NET geschrieben und in Kubernetes bereitgestellt ...
Eine der Anwendungen ist die API, über die letztlich der gesamte Datenverkehr läuft. Dieser Datenverkehr wird vom HTTP-Server abgehört Turmfalke, vom .NET-Client konfiguriert und in einem Pod gehostet. Beim Debuggen hatten wir insofern Glück, als es einen bestimmten Benutzer gab, der das Problem konsequent reproduzierte. Allerdings wurde alles durch die Verkehrskette kompliziert:
Es scheint, dass nur tcpdump dieses Problem lösen kann ... aber ich wiederhole es zur Verkehrskette:
Untersuchung
Natürlich ist es besser, auf den Verkehr zu hören auf diesem bestimmten Knoten, wo Kubernetes einen Pod bereitgestellt hat: Das Volumen des Dumps wird so groß sein, dass man zumindest ziemlich schnell etwas finden kann. Und tatsächlich ist bei der Untersuchung folgender Rahmen aufgefallen:
Bei näherer Betrachtung der Mülldeponie fiel das Wort auf M.laga. Es ist leicht zu erraten, dass es in Spanien keine M.laga-Stadt gibt (aber es gibt eine). Malaga). Wir griffen diese Idee auf und schauten uns die Ingress-Konfigurationen an. Dort sahen wir die vor einem Monat eingefügte Konfiguration (auf Wunsch des Kunden). „harmloser“ Ausschnitt:
Nachdem ich die Weiterleitung dieser Header deaktiviert hatte, war alles wieder gut! (Es wurde schnell klar, dass die Anwendung selbst diese Header nicht mehr benötigte.)
Schauen wir uns nun das Problem an allgemeiner. Es kann leicht innerhalb der Anwendung reproduziert werden, indem eine Telnet-Anfrage gestellt wird localhost:80:
Wird zurückkehren 400 Bad request — Im Anwendungsprotokoll erhalten wir einen uns bereits bekannten Fehler:
{
"@t":"2019-03-31T12:59:54.3746446Z",
"@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
"@x":"Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Malformed request: invalid headers.n at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)n at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.<ProcessRequestsAsync>d__185`1.MoveNext()",
"ConnectionId":"0HLLLR1J974L9",
"message":"Malformed request: invalid headers.",
"EventId":{
"Id":17,
"Name":"ConnectionBadRequest"
},
"SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
"ThreadId":71
}
Ergebnisse
Speziell Turmfalke kann nicht HTTP-Header mit den richtigen Zeichen in UTF-8, die in den Namen einer größeren Anzahl von Städten enthalten sind, korrekt verarbeiten.
Ein weiterer Faktor in unserem Fall ist, dass der Kunde derzeit nicht plant, die Implementierung von Kestrel in der Anwendung zu ändern. Allerdings gibt es Probleme in AspNetCore selbst (№ 4318, № 7707) Sie sagen, dass das nicht helfen wird...
Zusammenfassend: In dem Hinweis geht es nicht mehr um die spezifischen Probleme von Kestrel oder UTF-8 (im Jahr 2019?!), sondern um die Tatsache, dass Achtsamkeit und konsequentes Lernen Jeder Schritt, den Sie auf der Suche nach Problemen unternehmen, wird früher oder später Früchte tragen. Viel Glück!