ProHoster > Blogi > antaminen > Elämästä Kubernetesin kanssa: Kuinka HTTP-palvelin ei suosinut espanjalaisia
Elämästä Kubernetesin kanssa: Kuinka HTTP-palvelin ei suosinut espanjalaisia
Asiakkaamme edustaja, jonka sovelluspino sijaitsee Microsoftin pilvessä (Azure), ratkaisi ongelman: äskettäin jotkut pyynnöt joistakin asiakkailta Euroopasta alkoivat päättyä virheeseen 400 (Huono pyyntö). Kaikki sovellukset on kirjoitettu .NETissä, otettu käyttöön Kubernetesissa...
Yksi sovelluksista on API, jonka kautta kaikki liikenne lopulta tulee. HTTP-palvelin kuuntelee tätä liikennettä tuulihaukka, jonka .NET-asiakas määrittää ja isännöi podissa. Virheenkorjauksen kanssa olimme onnekkaita siinä mielessä, että oli tietty käyttäjä, joka toisti ongelman jatkuvasti. Kaikkea vaikeutti kuitenkin liikenneketju:
Vaikuttaa siltä, että vain tcpdump auttaa ratkaisemaan tämän ongelman... mutta toistan liikenneketjusta:
tutkimus
On selvää, että on parempi kuunnella liikennettä kyseisessä solmussa, jossa Kubernetes on ottanut käyttöön podin: kaatopaikan tilavuus tulee olemaan sellainen, että sieltä on mahdollista löytää ainakin jotain melko nopeasti. Ja todellakin, kun sitä tutkittiin, havaittiin seuraava kehys:
Kaatopaikkaa tarkemmin tarkasteltaessa sana huomattiin M.laga. On helppo arvata, että Espanjassa ei ole M.laga-kaupunkia (mutta on Malaga). Tartuimme tähän ideaan, katsoimme Ingress-konfiguraatioita, joissa näimme kuukausi sitten lisätyn (asiakkaan pyynnöstä) "vaaraton" katkelma:
Kun näiden otsikoiden edelleenlähetys oli poistettu käytöstä, kaikki sujui hyvin! (Pian kävi selväksi, että sovellus itse ei enää tarvinnut näitä otsikoita.)
Katsotaan nyt ongelmaa yleisemmin. Se voidaan helposti toistaa sovelluksen sisällä tekemällä Telnet-pyynnön localhost:80:
Palaa 400 Bad request — sovelluslokiin tulee meille jo tuttu virhe:
{
"@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
}
Tulokset
Nimenomaan Kestrel ei voi käsittelemään oikein HTTP-otsikot oikeilla merkeillä UTF-8:ssa, jotka sisältyvät melko useiden kaupunkien nimiin.
Lisätekijä meidän tapauksessamme on, että asiakas ei tällä hetkellä aio muuttaa Kestrelin toteutusta sovelluksessa. Kuitenkin ongelmat itse AspNetCoressa (№ 4318, № 7707) he sanovat, että tämä ei auta...
Yhteenvetona: muistiinpano ei enää koske Kestrelin tai UTF-8:n erityisongelmia (vuonna 2019?!), vaan siitä, että mindfulness ja johdonmukainen opiskelu Jokainen askel, jonka otat etsiessäsi ongelmia, kantaa ennemmin tai myöhemmin hedelmää. Onnea!