Iz života sa Kubernetesom: Kako HTTP server nije favorizovao Špance
Predstavnik našeg klijenta, čiji se stog aplikacija nalazi u Microsoft oblaku (Azure), pozabavio se problemom: nedavno su neki zahtjevi nekih klijenata iz Evrope počeli završavati greškom 400 (Loš zahtjev). Sve aplikacije su napisane u .NET-u, raspoređene u Kubernetes...
Jedna od aplikacija je API, preko kojeg na kraju dolazi sav promet. Ovaj saobraćaj sluša HTTP server Kestrel, konfiguriran od strane .NET klijenta i smješten u pod. Sa otklanjanjem grešaka, imali smo sreće u smislu da je postojao određeni korisnik koji je dosledno reproducirao problem. Međutim, sve je zakomplikovao saobraćajni lanac:
Čini se da će samo tcpdump pomoći u rješavanju ovog problema... ali ponovit ću o prometnom lancu:
Istraga
Očigledno, bolje je slušati saobraćaj na tom specifičnom čvoru, gdje je Kubernetes postavio pod: volumen dump-a će biti takav da će biti moguće pronaći barem nešto prilično brzo. I zaista, prilikom pregleda uočen je sledeći okvir:
Nakon detaljnijeg pregleda deponije, primijećena je riječ M.laga. Lako je pretpostaviti da u Španiji ne postoji grad M.laga (ali postoji Málaga). Uhvativši se za ovu ideju, pogledali smo Ingress konfiguracije, gdje smo vidjeli onu ubačenu prije mjesec dana (na zahtjev klijenta) "bezopasni" isječak:
Nakon onemogućavanja prosljeđivanja ovih zaglavlja, sve je postalo u redu! (Ubrzo je postalo jasno da samoj aplikaciji više nisu potrebna ova zaglavlja.)
Pogledajmo sada problem uopštenije. Može se lako reproducirati unutar aplikacije postavljanjem telnet zahtjeva localhost:80:
Će se vratiti 400 Bad request — u dnevniku aplikacije dobit ćemo grešku koja nam je već poznata:
{
"@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
}
Ishodi
Tačnije vetruška ne mogu ispravno obraditi HTTP zaglavlja s ispravnim znakovima u UTF-8, koji se nalaze u nazivima prilično velikog broja gradova.
Dodatni faktor u našem slučaju je to što klijent trenutno ne planira mijenjati implementaciju Kestrela u aplikaciji. Međutim, problemi u samom AspNetCore (No.4318, No.7707) kažu da ovo neće pomoći...
Da rezimiramo: napomena se više ne odnosi na specifične probleme Kestrela ili UTF-8 (2019.?!), već na činjenicu da svesnost i dosledno učenje Svaki korak koji napravite u potrazi za problemima će prije ili kasnije uroditi plodom. Sretno!