ProHoster > Log > administrasjon > Fra livet med Kubernetes: Hvordan HTTP-serveren ikke favoriserte spanjolene
Fra livet med Kubernetes: Hvordan HTTP-serveren ikke favoriserte spanjolene
En representant for vår klient, hvis applikasjonsstabel ligger i Microsoft-skyen (Azure), løste et problem: nylig begynte noen forespørsler fra noen klienter fra Europa å ende med feil 400 (Dårlig forespørsel). Alle applikasjoner er skrevet i .NET, distribuert i Kubernetes...
En av applikasjonene er API, som all trafikk til slutt kommer gjennom. Denne trafikken lyttes til av HTTP-serveren Kestrel, konfigurert av .NET-klienten og vert i en pod. Med feilsøking var vi heldige i den forstand at det var en spesifikk bruker som konsekvent reproduserte problemet. Alt ble imidlertid komplisert av trafikkkjeden:
Det ser ut til at bare tcpdump vil bidra til å løse dette problemet ... men jeg vil gjenta om trafikkkjeden:
etterforskning
Det er klart det er bedre å lytte til trafikken på den spesifikke noden, hvor Kubernetes har distribuert en pod: volumet på dumpen vil være slik at det vil være mulig å finne i det minste noe ganske raskt. Og faktisk, når du undersøkte det, ble følgende ramme lagt merke til:
Ved nærmere inspeksjon av fyllingen ble ordet lagt merke til M.laga. Det er lett å gjette at det ikke er noen M.laga-by i Spania (men det er det Malaga). Med denne ideen så vi på Ingress-konfigurasjonene, der vi så den som ble satt inn for en måned siden (på klientens forespørsel) "ufarlig" utdrag:
Etter å ha deaktivert videresending av disse overskriftene, ble alt bra! (Det ble snart klart at selve applikasjonen ikke lenger trengte disse overskriftene.)
La oss nå se på problemet mer generelt. Det kan enkelt reproduseres inne i applikasjonen ved å gjøre en telnet-forespørsel til localhost:80:
Vil returnere 400 Bad request — i søknadsloggen vil vi motta en feil som allerede er kjent for 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
}
Resultater av
Nærmere bestemt Kestrel kan ikke korrekt behandle HTTP-overskrifter med de riktige tegnene i UTF-8, som finnes i navnene på et ganske stort antall byer.
Et tilleggsmoment i vårt tilfelle er at oppdragsgiver foreløpig ikke planlegger å endre implementeringen av Kestrel i applikasjonen. Imidlertid problemer i selve AspNetCore (№ 4318, № 7707) de sier at dette ikke vil hjelpe...
For å oppsummere: notatet handler ikke lenger om de spesifikke problemene til Kestrel eller UTF-8 (i 2019?!), men om det faktum at oppmerksomhet og konsekvente studier Hvert skritt du tar mens du leter etter problemer vil før eller siden bære frukter. Lykke til!