Gikan sa kinabuhi uban sa Kubernetes: Giunsa ang HTTP server wala pabor sa mga Espanyol

Gikan sa kinabuhi uban sa Kubernetes: Giunsa ang HTTP server wala pabor sa mga Espanyol

Usa ka representante sa among kliyente, kansang application stack nagpuyo sa Microsoft cloud (Azure), nagsulbad sa usa ka problema: bag-o lang, ang pipila ka mga hangyo gikan sa pipila ka mga kliyente gikan sa Europe nagsugod sa pagtapos sa sayup 400 (Dili Maayo nga Pangayo). Ang tanan nga aplikasyon gisulat sa .NET, gi-deploy sa Kubernetes...

Usa sa mga aplikasyon mao ang API, diin ang tanan nga trapiko sa katapusan moabut. Kini nga trapiko gipaminaw sa HTTP server kestrel, gi-configure sa .NET nga kliyente ug gi-host sa usa ka pod. Sa pag-debug, swerte kami sa diwa nga adunay usa ka piho nga tiggamit nga kanunay nga nag-reproduce sa problema. Bisan pa, ang tanan komplikado sa kadena sa trapiko:

Gikan sa kinabuhi uban sa Kubernetes: Giunsa ang HTTP server wala pabor sa mga Espanyol

Ang sayup sa Ingress ingon niini:

{
   "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":{}
}

Sa samang higayon, si Kestrel mihatag:

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

Bisan sa pinakataas nga verbosity, ang Kestrel error adunay hilabihan gamay nga mapuslanon nga impormasyon:

{
   "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":{}
}

Morag ang tcpdump lang ang makatabang sa pagsulbad niini nga problema... pero sublion nako ang bahin sa traffic chain:

Gikan sa kinabuhi uban sa Kubernetes: Giunsa ang HTTP server wala pabor sa mga Espanyol

Imbestigasyon

Bitaw, mas maayong paminawon ang trapiko sa kana nga piho nga node, diin ang Kubernetes nag-deploy og pod: ang gidaghanon sa dump mahimong ingon nga posible nga makit-an ang labing menos usa ka butang nga dali ra. Ug sa tinuud, kung gisusi kini, namatikdan ang mosunod nga frame:

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

Sa pagsusi pag-ayo sa dump, namatikdan ang pulong M.laga. Sayon ang pagtag-an nga wala’y lungsod sa M.laga sa Espanya (apan adunay MΓ‘laga). Sa pag-ilog niini nga ideya, among gitan-aw ang Ingress configs, diin among nakita ang usa nga gisal-ut usa ka bulan ang milabay (sa hangyo sa kliyente) "dili makadaot" snippet:

    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;

Human ma-disable ang pagpasa niini nga mga ulohan, ang tanan nahimong maayo! (Sa wala madugay nahimong tin-aw nga ang aplikasyon mismo wala na magkinahanglan niini nga mga ulohan.)

Karon atong tan-awon ang problema mas kasagaran. Kini dali nga makopya sulod sa aplikasyon pinaagi sa paghangyo sa telnet sa 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

... mibalik 401 Unauthorized, ingon sa gipaabot. Unsa ang mahitabo kung atong buhaton:

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

?

Mobalik 400 Bad request β€” sa log sa aplikasyon makadawat kami usa ka sayup nga pamilyar na kanamo:

{
   "@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

Sa partikular, si Kestrel dili mahimo husto nga pagproseso sa mga ulohan sa HTTP nga adunay husto nga mga karakter sa UTF-8, nga naa sa mga ngalan sa medyo daghang mga lungsod.

Ang usa ka dugang nga hinungdan sa among kaso mao nga ang kliyente wala karon nagplano nga usbon ang pagpatuman sa Kestrel sa aplikasyon. Bisan pa, ang mga isyu sa AspNetCore mismo (Dili. 4318, Dili. 7707) giingon nila nga dili kini makatabang ...

Sa pag-summarize: ang nota dili na mahitungod sa mga piho nga problema sa Kestrel o UTF-8 (sa 2019?!), apan mahitungod sa kamatuoran nga pagkamahunahunaon ug makanunayon nga pagtuon Ang matag lakang nga imong buhaton samtang nangita sa mga problema sa madugay o sa madali mamunga. Good luck!

PS

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment