ከኩበርኔትስ ጋር፡ የኤችቲቲፒ አገልጋይ እንዴት ስፔናውያንን እንደማይደግፍ

ከኩበርኔትስ ጋር፡ የኤችቲቲፒ አገልጋይ እንዴት ስፔናውያንን እንደማይደግፍ

የማመልከቻ ቁልል በማይክሮሶፍት ደመና (አዙር) ውስጥ የሚኖር የደንበኞቻችን ተወካይ አንድ ችግር አቅርቧል፡ በቅርቡ ከአውሮፓ አንዳንድ ደንበኞች አንዳንድ ጥያቄዎች በስህተት 400 ማለቅ ጀመሩ።ወድቅ ጥያቄ). ሁሉም አፕሊኬሽኖች የተፃፉት በ NET ፣ በ Kubernetes ውስጥ ተሰራጭተዋል ...

ከመተግበሪያዎቹ አንዱ ኤፒአይ ነው፣ በዚህም ሁሉም ትራፊክ በመጨረሻ ይመጣል። ይህ ትራፊክ በኤችቲቲፒ አገልጋይ ይደመጣል ኬስትሬል፣ በ NET ደንበኛ የተዋቀረ እና በፖድ ውስጥ ይስተናገዳል። በማረም፣ ችግሩን በቋሚነት የሚደግም አንድ የተወሰነ ተጠቃሚ በመኖሩ እድለኞች ነበርን። ሆኖም፣ ሁሉም ነገር በትራፊክ ሰንሰለት ውስብስብ ነበር፡-

ከኩበርኔትስ ጋር፡ የኤችቲቲፒ አገልጋይ እንዴት ስፔናውያንን እንደማይደግፍ

በ 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 ብቻ የሚረዳ ይመስላል… ግን ስለ የትራፊክ ሰንሰለት እደግማለሁ-

ከኩበርኔትስ ጋር፡ የኤችቲቲፒ አገልጋይ እንዴት ስፔናውያንን እንደማይደግፍ

ምርመራ

ትራፊክን ማዳመጥ የተሻለ እንደሆነ ግልጽ ነው። በዚያ የተወሰነ መስቀለኛ መንገድ ላይ, ኩበርኔትስ ፖድ ባሰማራበት ቦታ: የቆሻሻ መጣያው መጠን ቢያንስ ቢያንስ አንድ ነገር በፍጥነት ማግኘት የሚቻል ይሆናል. እና በእውነቱ ፣ እሱን ሲመረምሩ ፣ የሚከተለው ፍሬም ተስተውሏል-

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. በስፔን ውስጥ ም.ላጋ ከተማ እንደሌለ መገመት ቀላል ነው (ግን ግን አለ ማላጋ). ይህን ሃሳብ በመያዝ፣ Ingress configsን ተመለከትን፣ ከአንድ ወር በፊት የገባውን አይተናል (በደንበኛው ጥያቄ) "ጉዳት የሌለው" ቁርጥራጭ:

    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 ውስጥ ካሉ ትክክለኛ ቁምፊዎች ጋር ያካሂዳሉ ፣ እነዚህም ብዙ ቁጥር ባላቸው ከተሞች ስም ውስጥ ይገኛሉ።

በእኛ ጉዳይ ላይ ተጨማሪ ምክንያት ደንበኛው በአሁኑ ጊዜ በመተግበሪያው ውስጥ የ Kestrel ትግበራን ለመለወጥ እቅድ የለውም. ሆኖም፣ በAspNetCore ውስጥ ያሉ ጉዳዮች (ቁጥር .4318, ቁጥር .7707) ይህ አይጠቅምም ይላሉ።

ለማጠቃለል፡ ማስታወሻው ከአሁን በኋላ ስለ Kestrel ወይም UTF-8 ልዩ ችግሮች (በ2019?!) አይደለም፣ ነገር ግን ስለ ጥንቃቄ እና የማያቋርጥ ጥናት ችግሮችን በሚፈልጉበት ጊዜ የሚወስዱት እያንዳንዱ እርምጃ ይዋል ይደር እንጂ ፍሬ ያፈራል. መልካም ምኞት!

PS

በብሎጋችን ላይ ያንብቡ፡-

ምንጭ: hab.com

አስተያየት ያክሉ