Mudo o Nginx i Envoy Proxy

Hei Habr! Dyma gyfieithiad o'r post: Mudo o Nginx i Envoy Proxy.

Mae Envoy yn weinydd dirprwy dosbarthedig perfformiad uchel (wedi'i ysgrifennu yn C ++) sydd wedi'i gynllunio ar gyfer gwasanaethau a chymwysiadau unigol, mae hefyd yn fws cyfathrebu ac yn "awyren data cyffredinol" a gynlluniwyd ar gyfer pensaernïaeth microwasanaeth "rhwyll gwasanaeth" fawr. Pan gafodd ei greu, ystyriwyd atebion i broblemau a gododd yn ystod datblygiad gweinyddwyr fel NGINX, HAProxy, balanswyr llwyth caledwedd a balanswyr llwyth cwmwl. Mae Cennad yn gweithio gyda phob cymhwysiad ac yn crynhoi'r rhwydwaith i ddarparu swyddogaethau cyffredin waeth beth fo'r platfform. Pan fydd yr holl draffig gwasanaeth yn y seilwaith yn mynd trwy'r grid Envoy, mae'n dod yn hawdd delweddu meysydd problem trwy arsylwi cyson, tiwnio perfformiad cyffredinol, ac ychwanegu ymarferoldeb craidd mewn lleoliad penodol.

Galluoedd

  • Pensaernïaeth y tu allan i'r broses: gweinydd hunangynhwysol, perfformiad uchel yw cennad sy'n cymryd ychydig o RAM. Mae'n gweithio ar y cyd ag unrhyw iaith neu fframwaith cymhwysiad.
  • http/2 a chefnogaeth grpc: mae gan y llysgennad http/2 o'r radd flaenaf a chefnogaeth grpc ar gyfer cysylltiadau sy'n dod i mewn ac yn mynd allan. Mae'n ddirprwy tryloyw o http/1.1 i http/2.
  • Cydbwyso llwyth uwch: mae llysgennad yn cefnogi nodweddion cydbwyso llwyth uwch, gan gynnwys ail-geisiau awtomatig, terfynu cadwyn, cyfyngu ar gyfraddau byd-eang, cysgodi ymholiadau, cydbwyso llwyth lleol parth, ac ati.
  • API Rheolaeth Ffurfweddu: mae cennad yn darparu API cadarn ar gyfer rheoli ei ffurfweddiad yn ddeinamig.
  • Arsylwi: Arsylwi dwfn traffig L7, cefnogaeth frodorol ar gyfer olrhain gwasgaredig, ac arsylwi mongodb, dynamodb a llawer o gymwysiadau eraill.

Cam 1 - Enghraifft Ffurfwedd NGINX

Mae'r sgript hon yn defnyddio ffeil wedi'i saernïo'n arbennig nginx.conf, yn seiliedig ar yr enghraifft gyflawn o Wici. Gallwch weld y ffurfweddiad yn y golygydd trwy agor nginx.conf

Cyfluniad nginx cychwynnol

user  www www;
pid /var/run/nginx.pid;
worker_processes  2;

events {
  worker_connections   2000;
}

http {
  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 8k;
  gzip_types       text/plain;

  log_format main      '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';

  log_format download  '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

  server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

    access_log   /var/log/nginx.access_log  main;
    error_log  /var/log/nginx.error_log  info;

    location / {
      proxy_pass         http://targetCluster/;
      proxy_redirect     off;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
    }
  }
}

Yn nodweddiadol mae gan gyfluniadau NGINX dair elfen allweddol:

  1. Sefydlu gweinydd NGINX, strwythur logio, ac ymarferoldeb Gzip. Diffinnir hyn yn fyd-eang ym mhob achos.
  2. Wrthi'n ffurfweddu NGINX i dderbyn ceisiadau i'r gwesteiwr un.enghraifft.com ar borth 8080.
  3. Gosod lleoliad targed, sut i drin traffig ar gyfer gwahanol rannau o'r URL.

Ni fydd pob ffurfweddiad yn berthnasol i Envoy Proxy ac nid oes angen i chi ffurfweddu rhai gosodiadau. Mae gan Gennad Dirprwy pedwar math allweddol, sy'n cefnogi'r seilwaith sylfaenol a gynigir gan NGINX. Y cnewyllyn yw:

  • Gwrandawyr: Maent yn diffinio sut mae Envoy Proxy yn derbyn ceisiadau sy'n dod i mewn. Ar hyn o bryd dim ond gwrandawyr sy'n seiliedig ar TCP y mae Envoy Proxy yn eu cefnogi. Unwaith y bydd cysylltiad wedi'i sefydlu, caiff ei drosglwyddo i'r set hidlo i'w brosesu.
  • Hidlau: Maent yn rhan o bensaernïaeth biblinell sy'n gallu prosesu data sy'n dod i mewn ac sy'n mynd allan. Mae'r swyddogaeth hon yn cynnwys hidlwyr fel Gzip, sy'n cywasgu data cyn ei anfon at y cleient.
  • Llwybryddion: Maent yn ailgyfeirio traffig i'r gyrchfan a ddymunir, a ddiffinnir fel clwstwr.
  • Clystyrau: Maent yn diffinio'r pwynt terfyn ar gyfer opsiynau traffig a chyfluniad.

Byddwn yn defnyddio'r pedair cydran hyn i greu cyfluniad Envoy Proxy i gyd-fynd â chyfluniad NGINX penodol. Pwrpas Cennad yw gwaith API a chyfluniad deinamig. Yn yr achos hwn, bydd y ffurfweddiad sylfaen yn defnyddio'r opsiynau statig, cod caled o NGINX.

Cam 2 - Ffurfweddiad NGINX

Rhan gyntaf nginx.conf yn diffinio rhai mewnoliadau NGINX y mae'n rhaid eu ffurfweddu.

Cysylltiadau Gweithwyr

Mae'r ffurfweddiad isod yn pennu nifer y prosesau a'r cysylltiadau gweithwyr. Mae hyn yn dangos sut y bydd NGINX yn graddio i ateb y galw.

worker_processes  2;

events {
  worker_connections   2000;
}

Mae Envoy Proxy yn rheoli llifoedd gwaith a chysylltiadau mewn gwahanol ffyrdd.

Mae Cennad yn creu edefyn gweithiwr ar gyfer pob edefyn caledwedd yn y system. Mae pob edefyn gweithiwr yn gweithredu dolen digwyddiad di-rwystro sy'n gyfrifol amdani

  1. Gwrando ar bob gwrandäwr (gwrandäwr)
  2. Derbyn cysylltiadau newydd
  3. Creu set hidlydd ar gyfer cysylltiad
  4. Prosesu'r holl weithrediadau I/O yn ystod oes y cysylltiad.

Mae holl brosesu pellach y cysylltiad yn cael ei drin yn gyfan gwbl yn yr edefyn gweithiwr, gan gynnwys unrhyw ymddygiad anfon ymlaen.

Ar gyfer pob llinyn gweithiwr yn Envoy, mae cysylltiad yn y pwll. Felly dim ond un cysylltiad y mae pyllau cysylltiad HTTP/2 yn ei sefydlu ar gyfer pob gwesteiwr allanol ar y tro, gyda phedwar llinyn gweithiwr, bydd pedwar cysylltiad HTTP/2 ar gyfer pob gwesteiwr allanol mewn cyflwr sefydlog. Trwy gadw popeth ar edefyn gweithiwr sengl, gellir ysgrifennu bron pob cod yn rhydd o flociau fel pe bai'n un edau. Os bydd mwy o edafedd gweithwyr yn cael eu dyrannu nag sydd angen, gall hyn arwain at wastraffu cof, creu nifer fawr o gysylltiadau segur, a lleihau nifer y cysylltiadau sy'n dychwelyd yn ôl i'r pwll.

Am fwy o wybodaeth, ewch i Blog Cennad Dirprwy.

Ffurfweddiad HTTP

Mae'r bloc cyfluniad NGINX canlynol yn diffinio gosodiadau HTTP fel:

  • Pa fathau o feim sy'n cael eu cefnogi
  • Goramser rhagosodedig
  • Cyfluniad Gzip

Gallwch chi addasu'r agweddau hyn gyda hidlwyr yn Envoy Proxy, y byddwn yn eu trafod yn nes ymlaen.

Cam 3 - Ffurfweddu Gweinydd

Yn y bloc cyfluniad HTTP, mae'r ffurfweddiad NGINX yn nodi gwrando ar borth 8080 ac ymateb i geisiadau sy'n dod i mewn am barthau un.enghraifft.com и www.one.example.com.

 server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

Tu Mewn Cennad, Gwrandawyr sy'n rheoli hyn.

Gwrandawyr cenhadol

Yr agwedd bwysicaf ar ddechrau gyda Envoy Proxy yw diffinio'r gwrandawyr. Mae angen i chi greu ffeil ffurfweddu sy'n disgrifio sut rydych chi am redeg yr enghraifft Envoy.

Bydd y pyt isod yn creu gwrandäwr newydd ac yn ei rwymo i borthladd 8080. Mae'r ffurfweddiad yn dweud wrth Envoy Proxy pa borthladdoedd y dylai fod yn rhwym iddynt ar gyfer ceisiadau sy'n dod i mewn.

Mae Envoy Proxy yn defnyddio nodiant YAML ar gyfer ei ffurfweddiad. Am gyflwyniad i'r nodiant hwn, gweler yma cyswllt.

Copy to Editorstatic_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }

Nid oes angen diffinio gweinydd_name, gan y bydd yr hidlwyr Envoy Proxy yn trin hyn.

Cam 4 — Ffurfweddu Lleoliad

Pan fydd cais yn cyrraedd NGINX, mae'r bloc lleoliad yn pennu sut i drin a ble i gyfeirio'r traffig. Yn y darn canlynol, trosglwyddir yr holl draffig i'r safle i'r clwstwr i fyny'r afon (nodyn y cyfieithydd: gweinydd cymhwysiad yw i fyny'r afon fel arfer) a enwir targedClwstwr. Mae'r clwstwr i fyny'r afon yn diffinio'r nodau a ddylai brosesu'r cais. Byddwn yn trafod hyn yn y cam nesaf.

location / {
    proxy_pass         http://targetCluster/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
}

Yn Envoy, dyma beth mae Filters yn ei wneud.

Hidlau Cenhadol

Ar gyfer cyfluniad statig, mae hidlwyr yn pennu sut mae ceisiadau sy'n dod i mewn yn cael eu prosesu. Yn yr achos hwn, rydym yn gosod hidlwyr sy'n cyfateb gweinydd_enwau yn y cam blaenorol. Pan ddaw ceisiadau sy'n dod i mewn sy'n cyd-fynd â rhai parthau a llwybrau, mae traffig yn cael ei gyfeirio i'r clwstwr. Mae hyn yn cyfateb i ffurfweddiad NGINX i fyny'r afon.

Copy to Editor    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router

enw envoy.http_connection_manager yn hidlydd adeiledig yn Envoy Proxy. Mae hidlwyr eraill yn cynnwys Redis, Mongo, TCP. Gallwch ddod o hyd i'r rhestr gyflawn yn dogfennaeth.

I gael rhagor o wybodaeth am bolisïau cydbwyso llwythi eraill, ewch i Dogfennaeth Cennad.

Cam 5 - Ffurfweddu Dirprwy a Upstream

Yn NGINX, mae'r cyfluniad i fyny'r afon yn diffinio set o weinyddion targed a fydd yn prosesu'r traffig. Yn yr achos hwn, mae dau glwstwr wedi'u neilltuo.

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

Mewn Cennad rheolir hyn gan glystyrau.

Clystyrau Cenhadon

Diffinnir yr hyn sy'n cyfateb i fyny'r afon fel clystyrau. Yn yr achos hwn, mae'r gwesteiwyr a fydd yn gwasanaethu'r traffig wedi'u diffinio. Mae sut y ceir mynediad i westeion, megis terfyn amser, yn cael ei ddiffinio fel ffurfwedd clwstwr. Mae hyn yn caniatáu rheolaeth fanylach dros ronynnedd agweddau megis hwyrni a chydbwyso llwyth.

Copy to Editor  clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

Wrth ddefnyddio darganfod gwasanaeth STRICT_DNS Bydd y Cennad yn datrys y targedau DNS penodedig yn barhaus ac yn anghydamserol. Bydd pob cyfeiriad IP a ddychwelir o ganlyniad DNS yn cael ei ystyried yn westeiwr penodol yn y clwstwr i fyny'r afon. Mae hyn yn golygu, os bydd ymholiad yn dychwelyd dau gyfeiriad IP, bydd Envoy yn tybio bod dau westeiwr yn y clwstwr a dylai'r ddau fod yn gytbwys o ran llwyth. Os caiff gwesteiwr ei dynnu o'r canlyniad, mae Envoy'n tybio nad yw'n bodoli mwyach a bydd yn tynnu traffig o unrhyw byllau cysylltu presennol.

Am fwy o wybodaeth gweler Dogfennaeth dirprwy llysgennad.

Cam 6 - Mynediad Log a Gwallau

Y cyfluniad terfynol yw cofrestru. Yn lle gwthio logiau gwall i ddisg, mae Envoy Proxy yn defnyddio dull sy'n seiliedig ar gwmwl. Mae holl logiau cais yn allbwn i stdout и stderr.

Pan fydd defnyddwyr yn gwneud cais, mae logiau mynediad yn ddewisol ac yn anabl yn ddiofyn. I alluogi logiau mynediad ar gyfer ceisiadau HTTP, galluogwch y ffurfweddiad log_mynediad ar gyfer y rheolwr cysylltiad HTTP. Gall y llwybr naill ai fod yn ddyfais fel stdout, neu ffeil ar ddisg, yn dibynnu ar eich gofynion.

Bydd y ffurfweddiad canlynol yn ailgyfeirio'r holl logiau mynediad i stdout (nodyn y cyfieithydd - mae angen stdout i ddefnyddio cennad y tu mewn i'r docwr. Os caiff ei ddefnyddio heb docwr, rhowch y llwybr i'r ffeil log arferol yn lle /dev/stdout). Copïwch y pyt i'r adran ffurfweddu ar gyfer y rheolwr cysylltiad:

Copy to Clipboardaccess_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"

Dylai'r canlyniadau edrych fel hyn:

      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:

Yn ddiofyn, mae gan Envoy linyn fformat sy'n cynnwys manylion y cais HTTP:

[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n

Canlyniad y llinyn fformat hwn yw:

[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"

Gellir addasu'r cynnwys allbwn trwy osod y maes fformat. Er enghraifft:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n"

Gellir hefyd allbwn y llinell log yn fformat JSON trwy osod y maes json_fformat. Er enghraifft:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}

I gael rhagor o wybodaeth am y fethodoleg cofrestru llysgenhadon, ewch i

https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries

Nid mewngofnodi yw'r unig ffordd i gael teimlad o weithio gyda'r Envoy Proxy. Mae ganddo olrhain a metrigau datblygedig wedi'u hymgorffori. Gallwch ddarganfod mwy yn olrhain dogfennaeth neu drwodd Sgript Llwybro Rhyngweithiol.

Cam 7 - Lansio

Rydych chi bellach wedi mudo'r ffurfweddiad o NGINX i Envoy Proxy. Y cam olaf yw lansio enghraifft Envoy Proxy i'w brofi.

Rhedeg fel defnyddiwr

Ar frig y llinell ffurfweddu NGINX defnyddiwr www; yn nodi bod NGINX yn rhedeg fel defnyddiwr breintiedig isel i wella diogelwch.

Mae Envoy Proxy yn defnyddio dull sy'n seiliedig ar gwmwl i reoli pwy sy'n berchen ar broses. Pan fyddwn yn rhedeg Envoy Proxy trwy gynhwysydd, gallwn nodi defnyddiwr braint isel.

Rhedeg Dirprwy Genhadol

Bydd y gorchymyn isod yn lansio Envoy Proxy trwy gynhwysydd Docker ar y gwesteiwr. Mae'r gorchymyn hwn yn rhoi'r gallu i Envoy wrando am geisiadau sy'n dod i mewn ar borthladd 80. Fodd bynnag, fel y nodir yn y ffurfweddiad gwrandäwr, mae Envoy Proxy yn gwrando am draffig sy'n dod i mewn ar borthladd 8080. Mae hyn yn caniatáu i'r broses redeg fel defnyddiwr â breintiau isel.

docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy

Profi

Gyda'r dirprwy yn rhedeg, gellir gwneud a phrosesu profion nawr. Mae'r gorchymyn cURL canlynol yn cyhoeddi cais gyda'r pennawd gwesteiwr a ddiffinnir yn y ffurfweddiad dirprwy.

curl -H "Host: one.example.com" localhost -i

Bydd cais HTTP yn arwain at wall 503. Mae hyn oherwydd nad yw cysylltiadau i fyny'r afon yn gweithio ac nid ydynt ar gael. Felly, nid oes gan Envoy Proxy unrhyw gyrchfannau targed ar gael ar gyfer y cais. Bydd y gorchymyn canlynol yn cychwyn cyfres o wasanaethau HTTP sy'n cyd-fynd â'r cyfluniad a ddiffinnir ar gyfer Envoy.

docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;

Gyda'r gwasanaethau sydd ar gael, gall Cennad traffig dirprwyol llwyddiannus i'w gyrchfan.

curl -H "Host: one.example.com" localhost -i

Dylech weld ymateb yn nodi pa gynhwysydd Docker ymdriniodd y cais. Yn y logiau Envoy Proxy, dylech hefyd weld y llinyn mynediad wedi'i argraffu.

Penawdau Ymateb HTTP Ychwanegol (Ymateb HTTP)

Fe welwch benawdau HTTP ychwanegol ym mhenawdau ymateb cais dilys. Mae'r pennawd yn dangos yr amser a dreuliodd y gwesteiwr i fyny'r afon yn prosesu'r cais. Wedi'i fynegi mewn milieiliadau. Mae hyn yn ddefnyddiol os yw'r cleient am bennu amser gwasanaeth yn erbyn hwyrni rhwydwaith.

x-envoy-upstream-service-time: 0
server: envoy

Cyfluniad terfynol

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router
          clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9090 }

Gwybodaeth ychwanegol gan y cyfieithydd

Mae cyfarwyddiadau ar gyfer gosod Envoy Proxy ar y wefan https://www.getenvoy.io/

Nid oes unrhyw config gwasanaeth systemd yn rpm yn ddiofyn.

Ychwanegu cyfluniad gwasanaeth systemd i /etc/systemd/system/envoy.service:

[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
After=network-online.target
Requires=envoy-auth-server.service
Wants=nginx.service

[Service]
User=root
Restart=on-failure
ExecStart=/usr/bin/envoy --config-path /etc/envoy/config.yaml
[Install]
WantedBy=multi-user.target

Mae angen i chi greu'r cyfeiriadur /etc/envoy/ a rhoi'r config config.yaml yno.

Mae yna sgwrs telegram ar gyfer dirprwy cennad: https://t.me/envoyproxy_ru

Nid yw Envoy Proxy yn cefnogi gwasanaethu cynnwys statig. Felly pwy all bleidleisio dros nodwedd: https://github.com/envoyproxy/envoy/issues/378

Dim ond defnyddwyr cofrestredig all gymryd rhan yn yr arolwg. Mewngofnodios gwelwch yn dda.

A wnaeth y post hwn eich annog i osod a phrofi dirprwy cennad?

  • ie

  • dim

Pleidleisiodd 75 o ddefnyddwyr. Ataliodd 18 o ddefnyddwyr.

Ffynhonnell: hab.com

Ychwanegu sylw