ProHoster > Blog > Uprava > Iz življenja s Kubernetesom: Kako strežnik HTTP ni bil naklonjen Špancem
Iz življenja s Kubernetesom: Kako strežnik HTTP ni bil naklonjen Špancem
Predstavnik našega odjemalca, katerega sklad aplikacij se nahaja v Microsoftovem oblaku (Azure), je obravnaval težavo: pred kratkim so se nekatere zahteve nekaterih odjemalcev iz Evrope začele končati z napako 400 (Slaba prošnja). Vse aplikacije so napisane v .NET, nameščene v Kubernetesu ...
Ena od aplikacij je API, prek katerega na koncu pride ves promet. Ta promet posluša strežnik HTTP Kestrel, ki ga konfigurira odjemalec .NET in gostuje v pod. Pri odpravljanju napak smo imeli srečo v smislu, da je obstajal določen uporabnik, ki je dosledno ponavljal težavo. Vse pa je zapletla prometna veriga:
Zdi se, da bo le tcpdump pomagal rešiti to težavo ... vendar bom ponovil o prometni verigi:
Preiskava
Očitno je bolje poslušati promet na tem specifičnem vozlišču, kjer je Kubernetes postavil pod: prostornina odlagališča bo tolikšna, da bo mogoče kaj hitro najti vsaj nekaj. In res, pri pregledu je bil opažen naslednji okvir:
Ob natančnejšem ogledu odlagališča je bilo opaziti slov M.laga. Zlahka je uganiti, da v Španiji ni mesta M.laga (je pa Malaga). Pograbili smo to idejo in pogledali konfiguracije Ingressa, kjer smo videli tisto, ki je bila vstavljena pred mesecem dni (na zahtevo stranke) "neškodljiv" delček:
Se bo vrnil 400 Bad request — v dnevniku aplikacije bomo prejeli napako, ki nam je že poznana:
{
"@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
}
Rezultati
Natančneje Kestrel ne morem pravilno obdelati glave HTTP s pravilnimi znaki v UTF-8, ki jih vsebujejo imena dokaj velikega števila mest.
Dodaten dejavnik v našem primeru je, da naročnik trenutno ne namerava spreminjati implementacije Kestrela v aplikaciji. Vendar težave v samem AspNetCore (№ 4318, № 7707) pravijo, da to ne bo pomagalo ...
Če povzamem: zapis ne govori več o specifičnih težavah Kestrela ali UTF-8 (leta 2019?!), temveč o tem, da pozornost in dosleden študij Vsak korak, ki ga naredite pri iskanju težav, bo prej ali slej obrodil sadove. Vso srečo!