Från livet med Kubernetes: Hur HTTP-servern inte gynnade spanjorerna
En representant för vår klient, vars applikationsstack finns i Microsofts moln (Azure), åtgärdade ett problem: nyligen började några förfrågningar från vissa klienter från Europa sluta med fel 400 (Dålig förfrågan). Alla applikationer är skrivna i .NET, distribuerade i Kubernetes...
En av applikationerna är API:t, genom vilket all trafik i slutändan kommer. Denna trafik lyssnas på av HTTP-servern Kestrel, konfigurerad av .NET-klienten och värd i en pod. Med felsökning hade vi tur i den meningen att det fanns en specifik användare som konsekvent reproducerade problemet. Men allt komplicerades av trafikkedjan:
Det verkar som att endast tcpdump hjälper till att lösa det här problemet... men jag ska upprepa om trafikkedjan:
Undersökning
Självklart är det bättre att lyssna på trafiken på den specifika noden, där Kubernetes har distribuerat en pod: volymen på dumpningen kommer att vara sådan att det kommer att vara möjligt att hitta åtminstone något ganska snabbt. Och faktiskt, när man undersökte det, märktes följande ram:
Vid närmare granskning av soptippen märktes ordet M.laga. Det är lätt att gissa att det inte finns någon stad i M.laga i Spanien (men det finns det Malaga). Med tanke på den här idén tittade vi på Ingress-konfigurationerna, där vi såg den infogade för en månad sedan (på kundens begäran) "ofarligt" utdrag:
Efter att ha inaktiverat vidarebefordran av dessa rubriker blev allt bra! (Det stod snart klart att själva applikationen inte längre behövde dessa rubriker.)
Låt oss nu titta på problemet mer allmänt. Det kan enkelt reproduceras i applikationen genom att göra en telnet-förfrågan till localhost:80:
Kommer att återvända 400 Bad request — i applikationsloggen kommer vi att få ett fel som redan är bekant för oss:
{
"@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
}
Resultat av
Närmare bestämt Kestrel kan inte korrekt bearbeta HTTP-rubriker med rätt tecken i UTF-8, som finns i namnen på ett ganska stort antal städer.
En ytterligare faktor i vårt fall är att kunden för närvarande inte planerar att ändra implementeringen av Kestrel i applikationen. Men problem i själva AspNetCore (№ 4318, № 7707) de säger att det här inte kommer att hjälpa...
För att sammanfatta: anteckningen handlar inte längre om de specifika problemen med Kestrel eller UTF-8 (år 2019?!), utan om det faktum att mindfulness och konsekventa studier Varje steg du tar när du letar efter problem kommer förr eller senare att bära frukt. Lycka till!