No dzīves ar Kubernetes: kā HTTP serveris nedeva priekšroku spāņiem
Mūsu klienta pārstāvis, kura lietojumprogrammu steks atrodas Microsoft mākonī (Azure), novērsa problēmu: nesen daži pieprasījumi no dažiem klientiem no Eiropas sāka beigties ar kļūdu 400 (Slikts pieprasījums). Visas lietojumprogrammas ir rakstītas .NET, izvietotas Kubernetes...
Viena no lietojumprogrammām ir API, caur kuru galu galā tiek nodrošināta visa trafika. Šo trafiku noklausās HTTP serveris lauka piekūns, ko konfigurējis .NET klients un mitināts podā. Ar atkļūdošanu mums paveicās tādā ziņā, ka bija konkrēts lietotājs, kurš konsekventi atkārtoja problēmu. Tomēr visu sarežģīja satiksmes ķēde:
Šķiet, ka tikai tcpdump palīdzēs atrisināt šo problēmu ... bet es atkārtošu par satiksmes ķēdi:
Izmeklēšana
Acīmredzot labāk ir klausīties satiksmi šajā konkrētajā mezglā, kur Kubernetes ir izvietojis podiņu: izgāztuves apjoms būs tāds, ka varēs diezgan ātri atrast vismaz kaut ko. Un patiešām, to pārbaudot, tika pamanīts šāds kadrs:
Uzmanīgāk apskatot izgāztuvi, vārds tika pamanīts M.laga. Ir viegli uzminēt, ka Spānijā nav M.lagas pilsētas (bet ir Malaga). Izmantojot šo ideju, apskatījām Ingress konfigurācijas, kur redzējām pirms mēneša ievietoto (pēc klienta pieprasījuma) "nekaitīgs" fragments:
Atgriezīsies 400 Bad request — lietojumprogrammu žurnālā mēs saņemsim kļūdu, kas mums jau ir pazīstama:
{
"@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
}
Rezultāti
Konkrēti Kestrel nevar pareizi apstrādāt HTTP galvenes ar pareizajām rakstzīmēm UTF-8, kuras ir ietvertas diezgan daudzu pilsētu nosaukumos.
Papildu faktors mūsu gadījumā ir tas, ka klients šobrīd neplāno mainīt Kestrel ieviešanu aplikācijā. Tomēr problēmas pašā AspNetCore (№ 4318, № 7707) viņi saka, ka tas nepalīdzēs...
Rezumējot: piezīme vairs nav par Kestrel vai UTF-8 specifiskajām problēmām (2019. gadā?!), bet gan par to, ka uzmanīgums un konsekventa izpēte Katrs solis, ko spersi, meklējot problēmas, agri vai vēlu nesīs augļus. Veiksmi!