ProHoster > блог > Администрација > Од животот со Кубернетес: Како серверот HTTP не ги фаворизираше Шпанците
Од животот со Кубернетес: Како серверот HTTP не ги фаворизираше Шпанците
Претставник на нашиот клиент, чиј стек апликации се наоѓа во облакот на Microsoft (Azure), реши проблем: неодамна, некои барања од некои клиенти од Европа почнаа да завршуваат со грешка 400 (Лошо барање). Сите апликации се напишани во .NET, распоредени во Kubernetes...
Една од апликациите е API, преку кој на крајот доаѓа целиот сообраќај. Овој сообраќај го слуша серверот HTTP Китрел, конфигуриран од клиентот .NET и хостиран во pod. Со дебагирање, имавме среќа во смисла дека имаше конкретен корисник кој постојано го репродуцираше проблемот. Сепак, сè беше комплицирано од сообраќајниот синџир:
Се чини дека само tcpdump ќе помогне да се реши овој проблем ... но ќе повторам за сообраќајниот синџир:
Истрага
Очигледно, подобро е да се слуша сообраќајот на тој специфичен јазол, каде што Kubernetes има распоредено подлога: волуменот на депонијата ќе биде таков што ќе биде можно да се најде барем нешто прилично брзо. И навистина при неговото испитување беше забележана следната рамка:
При поблиска проверка на депонијата, зборот бил забележан M.laga. Лесно е да се погоди дека не постои град М.Лага во Шпанија (но постои Малага). Искористувајќи ја оваа идеја, ги погледнавме конфигурациите на Ingress, каде што ја видовме онаа вметната пред еден месец (на барање на клиентот) „безопасен“ фрагмент:
По оневозможувањето на препраќањето на овие заглавија, сè стана во ред! (Наскоро стана јасно дека на самата апликација повеќе не и се потребни овие заглавија.)
Сега да го погледнеме проблемот поопшто. Може лесно да се репродуцира внатре во апликацијата со барање телнет до localhost:80:
Ќе се врати 400 Bad request — во дневникот на апликацијата ќе добиеме грешка што ни е веќе позната:
{
"@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
}
Резултатите од
Поточно кестрал не може правилно обработувајте ги заглавијата на HTTP со точните знаци во UTF-8, кои се содржани во имињата на прилично голем број градови.
Дополнителен фактор во нашиот случај е тоа што клиентот моментално не планира да ја промени имплементацијата на Kestrel во апликацијата. Сепак, проблемите во самиот AspNetCore (№ 4318, № 7707) велат дека ова нема да помогне...
Да резимираме: белешката повеќе не е за конкретните проблеми на Кестрел или UTF-8 (во 2019 година?!), туку за фактот дека внимателност и доследно проучување Секој чекор што го правите додека барате проблеми, порано или подоцна ќе вроди со плод. Со среќа!