Iš gyvenimo su Kubernetes: kaip HTTP serveris nebuvo palankus ispanams
Mūsų kliento, kurio programų krūva yra „Microsoft“ debesyje (Azure), atstovas išsprendė problemą: neseniai kai kurios užklausos iš kai kurių klientų iš Europos pradėjo baigtis klaidos 400 (Bloga užklausa). Visos programos parašytos .NET, įdiegtos Kubernetes...
Viena iš programų yra API, per kurią galiausiai patenka visas srautas. Šio srauto klausosi HTTP serveris vėgėlė, sukonfigūruotas .NET kliento ir priglobtas podelyje. Derinant mums pasisekė ta prasme, kad buvo konkretus vartotojas, kuris nuolat kartojo problemą. Tačiau viską apsunkino eismo grandinė:
Atrodytų, kad tik tcpdump padės išspręsti šią problemą... bet pasikartosiu apie srauto grandinę:
tyrimas
Akivaizdu, kad geriau klausytis eismo tame konkrečiame mazge, kur Kubernetes dislokavo podą: sąvartyno tūris bus toks, kad bus galima gana greitai rasti bent ką nors. Ir iš tiesų, nagrinėjant jį, buvo pastebėtas toks kadras:
Atidžiau apžiūrėjus sąvartyną, šis žodis buvo pastebėtas M.laga. Nesunku atspėti, kad Ispanijoje nėra M.lagos miesto (bet yra Malaga). Pasinaudoję šia idėja, pažiūrėjome į Ingress konfigūracijas, kur pamatėme prieš mėnesį įdėtą (kliento pageidavimu) "nekenksmingas" fragmentas:
Grįš 400 Bad request — programos žurnale gausime mums jau pažįstamą klaidą:
{
"@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
}
rezultatai
Tiksliau Kestrel negaliu teisingai apdoroti HTTP antraštes su tinkamais UTF-8 simboliais, kurie yra gana daugelio miestų pavadinimuose.
Papildomas veiksnys mūsų atveju yra tai, kad klientas šiuo metu neplanuoja keisti Kestrel diegimo programoje. Tačiau problemos pačioje AspNetCore (№ 4318, № 7707) jie sako, kad tai nepadės...
Apibendrinant: pastaba jau ne apie konkrečias Kestrel ar UTF-8 problemas (2019 m.?!), o apie tai, kad sąmoningumas ir nuoseklus tyrimas Kiekvienas žingsnis, kurį žengsite ieškant problemų, anksčiau ar vėliau duos vaisių. Sėkmės!