د Kubernetes سره د ژوند څخه: څنګه د HTTP سرور د اسپانیایانو سره مینه نه درلوده

د Kubernetes سره د ژوند څخه: څنګه د HTTP سرور د اسپانیایانو سره مینه نه درلوده

زموږ د پیرودونکي استازی، چې د غوښتنلیک سټیک د مایکروسافټ کلاوډ (Azure) کې ژوند کوي، یوه ستونزه حل کړه: پدې وروستیو کې، د اروپا څخه د ځینو پیرودونکو ځینې غوښتنې د 400 غلطۍ سره پای ته رسیدلي (ناسمه غوښتنه). ټول غوښتنلیکونه په .NET کې لیکل شوي، په Kubernetes کې ځای پرځای شوي ...

یو له غوښتنلیکونو څخه API دی، چې له لارې یې ټول ټرافیک په نهایت کې راځي. دا ټرافیک د HTTP سرور لخوا لیست شوی کستریل، د .NET پیرودونکي لخوا ترتیب شوی او په پوډ کې کوربه شوی. د ډیبګ کولو سره، موږ په دې معنی کې خوشحاله یو چې یو ځانګړی کاروونکي شتون درلود چې په دوامداره توګه ستونزه بیا تولیدوي. په هرصورت، هرڅه د ټرافيکي سلسلې لخوا پیچلي وو:

د Kubernetes سره د ژوند څخه: څنګه د HTTP سرور د اسپانیایانو سره مینه نه درلوده

په Ingress کې تېروتنه داسې ښکارېده:

{
   "number_fields":{
      "status":400,
      "request_time":0.001,
      "bytes_sent":465,
      "upstream_response_time":0,
      "upstream_retries":0,
      "bytes_received":2328
   },
   "stream":"stdout",
   "string_fields":{
      "ingress":"app",
      "protocol":"HTTP/1.1",
      "request_id":"f9ab8540407208a119463975afda90bc",
      "path":"/api/sign-in",
      "nginx_upstream_status":"400",
      "service":"app",
      "namespace":"production",
      "location":"/front",
      "scheme":"https",
      "method":"POST",
      "nginx_upstream_response_time":"0.000",
      "nginx_upstream_bytes_received":"120",
      "vhost":"api.app.example.com",
      "host":"api.app.example.com",
      "user":"",
      "address":"83.41.81.250",
      "nginx_upstream_addr":"10.240.0.110:80",
      "referrer":"https://api.app.example.com/auth/login?long_encrypted_header",
      "service_port":"http",
      "user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
      "time":"2019-03-06T18:29:16+00:00",
      "content_kind":"cache-headers-not-present",
      "request_query":""
   },
   "timestamp":"2019-03-06 18:29:16",
   "labels":{
      "app":"nginx",
      "pod-template-generation":"6",
      "controller-revision-hash":"1682636041"
   },
   "namespace":"kube-nginx-ingress",
   "nsec":6726612,
   "source":"kubernetes",
   "host":"k8s-node-55555-0",
   "pod_name":"nginx-v2hcb",
   "container_name":"nginx",
   "boolean_fields":{}
}

په ورته وخت کې، Kestrel ورکړ:

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

حتی د اعظمي فعل سره ، د Kestrel تېروتنه خورا خورا شتون لري لږ ګټور معلومات:

{
   "number_fields":{"ThreadId":76},
   "stream":"stdout",
   "string_fields":{
      "EventId":"{"Id"=>17, "Name"=>"ConnectionBadRequest"}",
      "SourceContext":"Microsoft.AspNetCore.Server.Kestrel",
      "ConnectionId":"0HLL2VJSST5KV",
      "@mt":"Connection id "{ConnectionId}" bad request data: "{message}"",
      "@t":"2019-03-07T13:06:48.1449083Z",
      "@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()",
      "message":"Malformed request: invalid headers."
   },
   "timestamp":"2019-03-07 13:06:48",
   "labels":{
      "pod-template-hash":"2368795483",
      "service":"app"
   },
   "namespace":"production",
   "nsec":145341848,
   "source":"kubernetes",
   "host":"k8s-node-55555-1",
   "pod_name":"app-67bdcf98d7-mhktx",
   "container_name":"app",
   "boolean_fields":{}
}

داسې بریښي چې یوازې tcpdump به د دې ستونزې حل کولو کې مرسته وکړي ... مګر زه به د ترافیک سلسلې په اړه تکرار کړم:

د Kubernetes سره د ژوند څخه: څنګه د HTTP سرور د اسپانیایانو سره مینه نه درلوده

تفتیش

په ښکاره ډول، دا غوره ده چې ټرافیک ته غوږ ونیسئ په هغه ځانګړي نوډ کې، چیرې چې کوبرنیټس یو پوډ ځای په ځای کړی: د ډمپ حجم به داسې وي چې لږترلږه یو څه په چټکۍ سره موندل ممکن وي. او په حقیقت کې، کله چې دا معاینه کوي، لاندې چوکاټ لیدل شوی و:

GET /back/user HTTP/1.1
Host: api.app.example.com
X-Request-ID: 27ceb14972da8c21a8f92904b3eff1e5
X-Real-IP: 83.41.81.250
X-Forwarded-For: 83.41.81.250
X-Forwarded-Host: api.app.example.com
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Original-URI: /front/back/user
X-Scheme: https
X-Original-Forwarded-For: 83.41.81.250
X-Nginx-Geo-Client-Country: Spain
X-Nginx-Geo-Client-City: M.laga
Accept-Encoding: gzip
CF-IPCountry: ES
CF-RAY: 4b345cfd1c4ac691-MAD
CF-Visitor: {"scheme":"https"}
pragma: no-cache
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36
referer: https://app.example.com/auth/login
accept-language: en-US,en;q=0.9,en-GB;q=0.8,pl;q=0.7
cookie: many_encrypted_cookies; .AspNetCore.Identity.Application=something_encrypted; 
CF-Connecting-IP: 83.41.81.250
True-Client-IP: 83.41.81.250
CDN-Loop: cloudflare

HTTP/1.1 400 Bad Request
Connection: close
Date: Wed, 06 Mar 2019 12:34:20 GMT
Server: Kestrel
Content-Length: 0

د ډمپ له نږدې معاینه کولو سره، دا کلمه ولیدل شوه M.laga. دا اټکل کول اسانه دي چې په هسپانیه کې د M.laga ښار شتون نلري (مګر شتون لري مالګا). د دې مفکورې په اخیستلو سره، موږ د انګریس ترتیبونو ته وکتل، چیرته چې موږ ولیدل چې یوه میاشت دمخه داخل شوی (د پیرودونکي په غوښتنه) "بې ضرره" ټوټه:

    ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header X-Nginx-Geo-Client-Country $geoip_country_name;
      proxy_set_header X-Nginx-Geo-Client-City $geoip_city;

د دې سرلیکونو فارورډ کولو غیر فعال کولو وروسته ، هرڅه سم شول! (دا ژر څرګنده شوه چې غوښتنلیک پخپله نور دې سرلیکونو ته اړتیا نلري.)

اوس راځئ چې ستونزه وګورو په عمومي توګه. دا په اسانۍ سره په غوښتنلیک کې دننه تولید کیدی شي د ټیلنټ غوښتنه کولو سره localhost:80:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Desiree

... بیرته راګرځي 401 Unauthorizedلکه څنګه چې تمه کیده. څه پیښیږي که موږ وکړو:

GET /back/user HTTP/1.1
Host: api.app.example.com
cache-control: no-cache
accept: application/json, text/plain, */*
origin: https://app.example.com
Cookie: test=Désirée

?

بیرته به راشي 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
}

پایلې

په ځانګړې توګه Kestrel نشي کولی په UTF-8 کې د سمو حروفونو سره د HTTP سرلیکونه په سمه توګه پروسس کړئ، کوم چې د کافي لوی شمیر ښارونو په نومونو کې شتون لري.

زموږ په قضیه کې یو اضافي فاکتور دا دی چې پیرودونکي اوس مهال په غوښتنلیک کې د کیسټریل پلي کولو بدلولو پلان نلري. په هرصورت، پخپله په AspNetCore کې مسلې (نیکمرغه, نیکمرغه) دوی وايي چې دا به مرسته ونه کړي ...

د لنډیز لپاره: یادښت نور د Kestrel یا UTF-8 (په 2019 کې؟!) د ځانګړو ستونزو په اړه ندي ، مګر د حقیقت په اړه چې ذهنیت او دوامداره مطالعه هر ګام چې تاسو د ستونزو په لټه کې کوئ ژر یا وروسته به میوه ولري. غوره چانس!

PS

زموږ په بلاګ کې هم ولولئ:

سرچینه: www.habr.com

Add a comment