Migrazzjoni minn Nginx għal Envoy Proxy

Hello, Habr! Inġib għall-attenzjoni tiegħek traduzzjoni tal-post: Migrazzjoni minn Nginx għal Envoy Proxy.

Envoy huwa proxy server distribwit ta 'prestazzjoni għolja (miktub f'C++) iddisinjat għal servizzi u applikazzjonijiet individwali, huwa wkoll xarabank ta' komunikazzjoni u "pjan ta 'dejta universali" iddisinjat għal arkitetturi kbar ta' "malji ta 'servizz" ta' mikroservizzi. Meta ħoloqha, ġew ikkunsidrati soluzzjonijiet għall-problemi li qamu waqt l-iżvilupp ta 'servers bħal NGINX, HAProxy, bilanċaturi tat-tagħbija tal-ħardwer u balancers tat-tagħbija tas-sħab. Envoy jaħdem flimkien ma' kull applikazzjoni u jastraxxi n-netwerk biex jipprovdi funzjonalità komuni irrispettivament mill-pjattaforma. Meta t-traffiku kollu tas-servizz f'infrastruttura jgħaddi mill-malja tal-Envoy, isir faċli li jiġu viżwalizzati żoni problematiċi b'osservabilità konsistenti, tixgħel il-prestazzjoni ġenerali, u żżid il-funzjonalità ewlenija f'post speċifiku.

Kapaċitajiet

  • Arkitettura barra mill-proċess: envoy huwa server awtonomu ta 'prestazzjoni għolja li jieħu ammont żgħir ta' RAM. Jaħdem flimkien ma' kwalunkwe lingwa jew qafas ta' applikazzjoni.
  • http/2 u appoġġ grpc: l-envoy għandu appoġġ http/2 u grpc tal-ewwel klassi għal konnessjonijiet deħlin u ħerġin. Dan huwa prokura trasparenti minn http/1.1 sa http/2.
  • Ibbilanċjar Avvanzat tat-Tagħbija: l-envoy jappoġġja karatteristiċi avvanzati tal-ibbilanċjar tat-tagħbija inklużi tentattivi mill-ġdid awtomatiku, tkissir tal-katina, limitazzjoni tar-rata globali, shadowing tat-talba, ibbilanċjar tat-tagħbija taż-żona lokali, eċċ.
  • API tal-Ġestjoni tal-Konfigurazzjoni: l-envoy jipprovdi API robusta għall-ġestjoni dinamika tal-konfigurazzjoni tiegħek.
  • Osservabilità: Osservabbiltà profonda tat-traffiku L7, appoġġ nattiv għal traċċar distribwit u osservabilità ta 'mongodb, dynamodb u ħafna applikazzjonijiet oħra.

Pass 1 — Eżempju NGINX Config

Din l-iskrittura tuża fajl magħmul apposta nginx.conf, ibbażat fuq l-eżempju sħiħ minn NGINX Wiki. Tista 'tara l-konfigurazzjoni fl-editur billi tiftaħ nginx.conf

konfigurazzjoni tas-sors nginx

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;
    }
  }
}

Il-konfigurazzjonijiet NGINX tipikament għandhom tliet elementi ewlenin:

  1. Konfigurazzjoni ta 'server NGINX, struttura ta' log u funzjonalità Gzip. Dan huwa definit globalment fil-każijiet kollha.
  2. Konfigurazzjoni ta' NGINX biex jaċċetta talbiet lill-host one.eżempju.com fuq il-port 8080.
  3. Twaqqif tal-post fil-mira, kif timmaniġġja t-traffiku għal partijiet differenti tal-URL.

Mhux il-konfigurazzjoni kollha se tapplika għal Envoy Proxy, u m'għandekx bżonn tikkonfigura xi settings. Mibgħut Prokura għandu erba tipi ewlenin, li jappoġġjaw l-infrastruttura ewlenija offruta minn NGINX. Il-qalba hija:

  • Is-semmiegħa: Huma jiddeterminaw kif Envoy Proxy jaċċetta talbiet deħlin. Envoy Proxy bħalissa jappoġġja biss semmiegħa bbażati fuq TCP. Ladarba tiġi stabbilita konnessjoni, din tiġi mgħoddija lil sett ta 'filtri għall-ipproċessar.
  • Filtri: Huma parti minn arkitettura tal-pipeline li tista 'tipproċessa data li tidħol u ħierġa. Din il-funzjonalità tinkludi filtri bħal Gzip, li jikkompressa d-dejta qabel ma tibgħatha lill-klijent.
  • Routers: Huma jgħaddu t-traffiku lejn id-destinazzjoni meħtieġa, definita bħala cluster.
  • Clusters: Huma jiddefinixxu l-endpoint għat-traffiku u l-parametri tal-konfigurazzjoni.

Aħna se nużaw dawn l-erba 'komponenti biex noħolqu konfigurazzjoni Envoy Proxy biex taqbel ma' konfigurazzjoni speċifika NGINX. L-għan ta 'Envoy huwa li jaħdem ma' APIs u konfigurazzjoni dinamika. F'dan il-każ, il-konfigurazzjoni bażi se tuża settings statiċi u kkodifikati iebes minn NGINX.

Pass 2 - Konfigurazzjoni NGINX

L-ewwel parti nginx.conf jiddefinixxi xi NGINX interni li jeħtieġ li jiġu kkonfigurati.

Konnessjonijiet tal-Ħaddiema

Il-konfigurazzjoni ta' hawn taħt tiddetermina n-numru ta' proċessi u konnessjonijiet tal-ħaddiema. Dan jindika kif NGINX se tiskala biex tissodisfa d-domanda.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy jimmaniġġja l-flussi tax-xogħol u l-konnessjonijiet b'modi differenti.

L-envoy joħloq ħajt tal-ħaddiem għal kull ħajt tal-ħardwer fis-sistema. Kull ħajta tal-ħaddiem tesegwixxi ċirku ta 'avveniment li ma jimblokkax li huwa responsabbli għalih

  1. Nisimgħu lil kull semmiegħ
  2. Jaċċettaw konnessjonijiet ġodda
  3. Il-ħolqien ta' sett ta' filtri għal konnessjoni
  4. Ipproċessa l-operazzjonijiet I/O kollha matul il-ħajja tal-konnessjoni.

L-ipproċessar tal-konnessjoni ulterjuri kollu jiġi mmaniġġjat kollu kemm hu fil-ħajt tal-ħaddiem, inkluż kwalunkwe imġieba ta 'trażmissjoni.

Għal kull ħajta tal-ħaddiem f'Envoy, hemm pool ta' konnessjoni. Allura pools ta 'konnessjoni HTTP/2 jistabbilixxu biss konnessjoni waħda għal kull host estern kull darba, jekk ikun hemm erba' ħjut tal-ħaddiema se jkun hemm erba 'konnessjonijiet HTTP/2 għal kull host estern fi stat stabbli. Billi żżomm kollox f'ħajt wieħed tal-ħaddiem, kważi l-kodiċi kollu jista 'jinkiteb mingħajr imblukkar, bħallikieku kien ħajt wieħed. Jekk jiġu allokati aktar ħjut tal-ħaddiema milli meħtieġ, dan jista 'jwassal għal memorja moħlija, li toħloq numru kbir ta' konnessjonijiet inattivi, u tnaqqas in-numru ta 'drabi li l-konnessjonijiet jiġu rritornati lura lill-pool.

Għal aktar informazzjoni żur Mibgħut Proxy blog.

Konfigurazzjoni HTTP

Il-blokk tal-konfigurazzjoni NGINX li ġej jiddefinixxi settings HTTP bħal:

  • Liema tipi mime huma appoġġjati
  • Timeouts Default
  • Konfigurazzjoni Gzip

Tista' tippersonalizza dawn l-aspetti billi tuża filtri f'Envoy Proxy, li ser niddiskutu aktar tard.

Pass 3 - Konfigurazzjoni tas-Server

Fil-blokk tal-konfigurazzjoni HTTP, il-konfigurazzjoni NGINX tispeċifika li tisma' fuq il-port 8080 u tirrispondi għal talbiet deħlin għal dominji one.eżempju.com и www.one.example.com.

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

Ġewwa l-Envoy, huwa kkontrollat ​​mis-Semmiegħa.

Mibgħut semmiegħa

L-aktar aspett importanti biex tibda b'Envoy Proxy huwa li tiddefinixxi s-semmiegħa tiegħek. Trid toħloq fajl ta' konfigurazzjoni li jiddeskrivi kif trid tħaddem l-istanza Envoy.

Is-snippet hawn taħt se joħloq semmiegħ ġdid u jorbot mal-port 8080. Il-konfigurazzjoni tgħid lil Envoy Proxy liema portijiet għandha torbot għal talbiet deħlin.

Envoy Proxy juża notazzjoni YAML għall-konfigurazzjoni tiegħu. Għal introduzzjoni għal din in-notazzjoni, ara hawn rabta.

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

M'hemmx għalfejn tiddefinixxi server_name, peress li l-filtri tal-Prokura tal-Envoy se jimmaniġġjaw dan.

Pass 4 - Konfigurazzjoni tal-Post

Meta talba tidħol f'NGINX, il-blokka tal-lokazzjoni tiddetermina kif tipproċessa u fejn għandha rotta t-traffiku. Fil-framment li ġej, it-traffiku kollu lejn is-sit jiġi trasferit għal cluster upstream (nota tat-traduttur: upstream normalment ikun server ta' applikazzjoni) imsejjaħ targetCluster. Il-cluster upstream jiddefinixxi n-nodi li għandhom jipproċessaw it-talba. Aħna ser niddiskutu dan fil-pass li jmiss.

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

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

Fl-Envoy, Filters jagħmel dan.

Filtri tal-Mibgħut

Għal konfigurazzjoni statika, il-filtri jiddeterminaw kif jipproċessaw it-talbiet deħlin. F'dan il-każ aħna nissettjaw filtri li jaqblu ismijiet_server fil-pass preċedenti. Meta jaslu talbiet deħlin li jaqblu ma 'ċerti oqsma u rotot, it-traffiku jiġi mgħoddi lejn il-cluster. Dan huwa l-ekwivalenti ta 'konfigurazzjoni minn isfel għal fuq NGINX.

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

isem mibgħut.http_connection_manager huwa filtru mibni fl-Envoy Proxy. Filtri oħra jinkludu Ddistribwit mill-, mongo, TCP. Tista' ssib il-lista kompleta fuq dokumentazzjoni.

Għal aktar informazzjoni dwar politiki oħra tal-ibbilanċjar tat-tagħbija, żur Dokumentazzjoni tal-Mibgħut.

Pass 5 - Proxy u Konfigurazzjoni Upstream

F'NGINX, il-konfigurazzjoni upstream tiddefinixxi sett ta 'servers fil-mira li se jipproċessaw it-traffiku. F'dan il-każ, ġew assenjati żewġ gruppi.

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

F'Envoy, dan huwa ġestit minn clusters.

Mibgħuta Clusters

L-ekwivalenti upstream huwa definit bħala clusters. F'dan il-każ, ġew identifikati l-hosts li se jservu t-traffiku. Il-mod kif jiġu aċċessati l-hosts, bħal timeouts, huwa definit bħala konfigurazzjoni tal-cluster. Dan jippermetti aktar kontroll granulari fuq aspetti bħal latency u l-ibbilanċjar tat-tagħbija.

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 }}
    ]

Meta tuża l-iskoperta tas-servizz STRICT_DNS L-Envoy se jsolvi kontinwament u b'mod asinkroniku l-miri DNS speċifikati. Kull indirizz IP ritornat mir-riżultat tad-DNS se jitqies bħala host espliċitu fil-cluster upstream. Dan ifisser li jekk talba tirritorna żewġ indirizzi IP, Envoy jassumi li hemm żewġ hosts fil-cluster, u t-tnejn għandhom ikunu bilanċjati tat-tagħbija. Jekk host jitneħħa mir-riżultat, Envoy jassumi li m'għadux jeżisti u jiġbed it-traffiku minn kwalunkwe pool ta' konnessjoni eżistenti.

Għal aktar informazzjoni ara Dokumentazzjoni tal-prokura tal-Mibgħut.

Pass 6 — Log Aċċess u Żbalji

Il-konfigurazzjoni finali hija r-reġistrazzjoni. Minflok ma jimbotta zkuk tal-iżbalji fuq disk, Envoy Proxy jieħu approċċ ibbażat fuq il-cloud. Ir-reġistri tal-applikazzjoni kollha huma output għal stdout и stderr.

Meta l-utenti jagħmlu talba, ir-reġistri tal-aċċess huma fakultattivi u diżattivati ​​awtomatikament. Biex tippermetti r-reġistri tal-aċċess għal talbiet HTTP, ippermetti l-konfigurazzjoni access_log għall-maniġer tal-konnessjoni HTTP. Il-mogħdija tista 'tkun jew mezz bħal stdout, jew fajl fuq disk, skont ir-rekwiżiti tiegħek.

Il-konfigurazzjoni li ġejja se terġa 'tidderieġi l-logs ta' aċċess kollha lejn stdout (Nota tat-traduttur - stdout huwa meħtieġ li juża envoy ġewwa docker. Jekk jintuża mingħajr docker, imbagħad ibdel /dev/stdout bil-mogħdija għal log file regolari). Ikkopja s-snippet fit-taqsima tal-konfigurazzjoni għall-maniġer tal-konnessjoni:

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

Ir-riżultati għandhom jidhru bħal dan:

      - 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:

B'mod awtomatiku, Envoy għandu string format li jinkludi d-dettalji tat-talba 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

Ir-riżultat ta' din is-sekwenza tal-format huwa:

[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"

Il-kontenut tal-output jista 'jiġi personalizzat billi tissettja l-qasam tal-format. Pereżempju:

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"

Il-linja tar-reġistru tista 'wkoll toħroġ f'format JSON billi tistabbilixxi l-qasam json_format. Pereżempju:

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

Għal aktar informazzjoni dwar il-Metodoloġija tar-Reġistrazzjoni tal-Mibgħut, żur

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

L-illoggjar mhuwiex l-uniku mod biex tinkiseb għarfien dwar kif taħdem ma 'Envoy Proxy. Għandha kapaċitajiet avvanzati ta 'traċċar u metriċi mibnija fiha. Tista' ssir taf aktar fuq dokumentazzjoni tat-traċċar jew permezz Skript tat-traċċar interattiv.

Pass 7 - Tnedija

Issa emigrajt il-konfigurazzjoni tiegħek minn NGINX għal Envoy Proxy. L-aħħar pass huwa li tniedi istanza ta 'Envoy Proxy biex tittestjaha.

Mexxi bħala utent

Fil-quċċata tal-linja tal-konfigurazzjoni NGINX utent www www; jispeċifika li jħaddem NGINX bħala utent bi privileġġ baxx biex ittejjeb is-sigurtà.

Envoy Proxy jieħu approċċ ibbażat fuq il-cloud għall-ġestjoni ta' min għandu proċess. Meta nħaddmu Envoy Proxy permezz ta' kontenitur, nistgħu nispeċifikaw utent b'privileġġ baxx.

Tnedija tal-Mibgħut Proxy

Il-kmand hawn taħt se jmexxi Envoy Proxy permezz ta 'kontenitur Docker fuq l-ospitant. Dan il-kmand jagħti lil Envoy l-abbiltà li jisma 'għal talbiet deħlin fuq il-port 80. Madankollu, kif speċifikat fil-konfigurazzjoni tas-semmiegħ, Envoy Proxy jisma' għat-traffiku li jkun dieħel fuq il-port 8080. Dan jippermetti li l-proċess jaħdem bħala utent bi privileġġ baxx.

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

Ittestjar

Bil-prokura għaddejja, it-testijiet issa jistgħu jsiru u jiġu pproċessati. Il-kmand cURL li ġej joħroġ talba bl-header tal-host definit fil-konfigurazzjoni tal-prokura.

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

It-talba HTTP se tirriżulta fi żball 503. Dan għaliex il-konnessjonijiet upstream mhumiex qed jaħdmu u mhumiex disponibbli. Għalhekk, Envoy Proxy m'għandu l-ebda destinazzjoni disponibbli għat-talba. Il-kmand li ġej se jibda serje ta 'servizzi HTTP li jaqblu mal-konfigurazzjoni definita għall-Envoy.

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

Bis-servizzi disponibbli, l-Envoy jista’ jipprokura b’suċċess it-traffiku lejn id-destinazzjoni tiegħu.

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

Għandek tara tweġiba li tindika liema kontenitur Docker ipproċessa t-talba. Fir-reġistri tal-Prokura tal-Mibgħut għandek tara wkoll output ta' string ta' aċċess.

Headers ta' Rispons HTTP Addizzjonali

Se tara headers HTTP addizzjonali fl-intestaturi tar-rispons tat-talba attwali. L-intestatura turi l-ħin li l-host upstream qatta' jipproċessa t-talba. Espress f'millisekondi. Dan huwa utli jekk il-klijent irid jiddetermina l-ħin tas-servizz meta mqabbel mal-latency tan-netwerk.

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

Konfigurazzjoni finali

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 }

Informazzjoni addizzjonali mit-traduttur

L-istruzzjonijiet għall-installazzjoni ta' Envoy Proxy jistgħu jinstabu fuq il-websajt https://www.getenvoy.io/

B'mod awtomatiku, rpm m'għandux konfigurazzjoni tas-servizz systemd.

Żid systemd service config /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

Ikollok bżonn toħloq direttorju /etc/envoy/ u tpoġġi l-konfigurazzjoni config.yaml hemmhekk.

Hemm chat tat-telegramma bl-użu tal-prokura tal-mibgħut: https://t.me/envoyproxy_ru

Envoy Proxy ma jappoġġjax li jservi kontenut statiku. Għalhekk, min jista' jivvota għall-karatteristika: https://github.com/envoyproxy/envoy/issues/378

Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ. Idħol, ta 'xejn.

Din il-kariga ħeġġiġkom biex tinstalla u tittestja proxy tal-envoy?

  • iva

  • ebda

Ivvutaw 75 utent. 18 utenti astjenew.

Sors: www.habr.com

Żid kumment