ProHoster > Blog > Pangangasiwa > Mula sa buhay kasama ang Kubernetes: Paano hindi pinapaboran ng HTTP server ang mga Espanyol
Mula sa buhay kasama ang Kubernetes: Paano hindi pinapaboran ng HTTP server ang mga Espanyol
Isang kinatawan ng aming kliyente, na ang application stack ay naninirahan sa cloud mula sa Microsoft (Azure), ay tumugon sa isang problema: kamakailan, ang ilang mga kahilingan mula sa ilang mga kliyente mula sa Europa ay nagsimulang magwakas sa error 400 (Masamang Kahilingan). Ang lahat ng mga application ay nakasulat sa .NET, na-deploy sa Kubernetes...
Ang isa sa mga application ay ang API, kung saan dumarating ang lahat ng trapiko. Ang trapikong ito ay pinakikinggan ng HTTP server kestrel, na-configure ng .NET client at naka-host sa isang pod. Sa pag-debug, masuwerte kami sa kahulugan na mayroong isang partikular na user na patuloy na nag-reproduce ng problema. Gayunpaman, ang lahat ay kumplikado ng kadena ng trapiko:
Mukhang ang tcpdump lang ang makakatulong sa paglutas ng problemang ito... ngunit uulitin ko ang tungkol sa kadena ng trapiko:
Pagsisiyasat
Obviously, mas masarap makinig sa traffic sa partikular na node na iyon, kung saan nag-deploy ng pod ang Kubernetes: ang dami ng dump ay magiging posible na makahanap ng kahit isang bagay na medyo mabilis. At sa katunayan, kapag sinusuri ito, napansin ang sumusunod na frame:
Sa masusing pagsisiyasat sa tambakan, napansin ang salita M.laga. Madaling hulaan na walang lungsod ng M.laga sa Spain (ngunit mayroon malaga). Sa pagkuha sa ideyang ito, tiningnan namin ang Ingress configs, kung saan nakita namin ang ipinasok noong isang buwan (sa kahilingan ng kliyente) "hindi nakakapinsala" na snippet:
Matapos i-disable ang pagpapasa ng mga header na ito, naging maayos ang lahat! (Sa lalong madaling panahon naging malinaw na ang application mismo ay hindi na kailangan ang mga header na ito.)
Ngayon tingnan natin ang problema mas pangkalahatan. Madali itong mai-reproduce sa loob ng application sa pamamagitan ng paghiling sa telnet localhost:80:
Magbabalik 400 Bad request β sa log ng application makakatanggap kami ng error na pamilyar na sa amin:
{
"@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
}
Mga resulta ng
Partikular na si Kestrel hindi pwede wastong iproseso ang mga header ng HTTP na may mga tamang character sa UTF-8, na nakapaloob sa mga pangalan ng medyo malaking bilang ng mga lungsod.
Ang isang karagdagang kadahilanan sa aming kaso ay ang kliyente ay hindi kasalukuyang nagpaplano na baguhin ang pagpapatupad ng Kestrel sa aplikasyon. Gayunpaman, ang mga isyu sa AspNetCore mismo (β 4318, β 7707) sabi nila hindi ito makakatulong...
Upang ibuod: ang tala ay hindi na tungkol sa mga partikular na problema ng Kestrel o UTF-8 (sa 2019?!), ngunit tungkol sa katotohanan na pag-iisip at pare-parehong pag-aaral Ang bawat hakbang na gagawin mo habang naghahanap ng mga problema ay magbubunga sa malao't madali. Good luck!