Migracija s Nginx-a na Envoy Proxy

Pozdrav, Habr! Predlažem vam prijevod objave: Migracija s Nginx-a na Envoy Proxy.

Envoy je visokoučinkoviti distribuirani proxy poslužitelj (napisan u C++), namijenjen pojedinačnim uslugama i aplikacijama, a također služi kao komunikacijska sabirnica i 'universal data plane', razvijen za velike mikroslužbene arhitekture 'service mesh'. Tijekom njegovog stvaranja uzeta su u obzir rješenja problema koja su se javila prilikom razvoja takvih poslužitelja kao što su NGINX, HAProxy, hardverski balansirnici opterećenja i oblačni balansirnici opterećenja. Envoy radi uz svaku aplikaciju i apstrahira mrežu, pružajući zajedničke funkcije neovisno o platformi. Kada sav uslužni promet u infrastrukturi prolazi kroz mrežu Envoy, lako je vizualizirati problematična područja uz pomoć dosljedne promatračke strategije, podešavanje zajedničke izvedbe i dodavanje ključnih funkcija na određenom mjestu.

Mogućnosti

  • Arhitektura izvan procesa: envoy je autonomni, visokoučinkoviti poslužitelj koji zauzima malo operativne memorije. Radi zajedno s bilo kojim programskim jezikom ili okvirom.
  • Podrška za http/2 i grpc: envoy ima vrhunsku podršku za http/2 i grpc za dolazne i odlazne veze. To je transparentni proxy od http/1.1 do http/2.
  • Proširena ravnoteža opterećenja: envoy podržava napredne funkcije ravnoteže opterećenja, uključujući automatske ponovne pokušaje, prekidanje veze, globalno ograničenje brzine, sjenčenje zahtjeva, lokalno balansiranje opterećenja zone itd.
  • API za upravljanje konfiguracijom: envoy pruža pouzdan API za dinamičko upravljanje svojom konfiguracijom.
  • Promatranje: duboko promatranje L7 prometa, ugrađena podrška za distribuirano praćenje i promatranje mongodb, dynamodb i mnogih drugih aplikacija.

Korak 1 — Primjer NGINX konfiguracije

U ovom scenariju koristi se posebno izrađena datoteka nginx.conf, koja se temelji na kompletnom primjeru iz NGINX Wiki. Možete pregledati konfiguraciju u uređivaču otvaranjem nginx.conf

Izvorna nginx konfiguracija

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

Konfiguracije NGINX obično imaju tri ključna elementa:

  1. Postavljanje poslužitelja NGINX, strukture logova i funkcionalnosti Gzip. To se određuje globalno u svim slučajevima.
  2. Postavke NGINX za primanje zahtjeva na host one.example.com na portu 8080.
  3. Postavke odredišnog mjesta, kako obraditi promet za različite dijelove URL-a.

Nije sva konfiguracija će se primjenjivati na Envoy Proxy, i ne trebate postaviti neke parametre. Envoy Proxy ima četiri ključna tipa, koja podržavaju osnovnu infrastrukturu koju nudi NGINX. Jezgra je:

  • Slušatelji: Oni određuju kako Envoy Proxy prima dolazne zahtjeve. Trenutno Envoy Proxy podržava samo slušatelje temeljene na TCP-u. Nakon uspostavljanja veze, ona se prosljeđuje na skup filtara za obradu.
  • Filteri: Oni su dio cjevovodne arhitekture koja može obraditi dolazne i odlazne podatke. Ova funkcionalnost uključuje filtre, poput Gzip-a, koji komprimira podatke prije slanja klijentu.
  • Usmjerivači: Oni preusmjeravaju promet na traženu destinaciju, definiranu kao klaster.
  • Klasteri: Oni određuju krajnju točku za promet i parametre konfiguracije.

Koristit ćemo ova četiri komponenta za izradu konfiguracije Envoy Proxy kako bi odgovarala određenoj konfiguraciji NGINX. Cilj Envoy-a je rad s API-jem i dinamička konfiguracija. U ovom slučaju, osnovna konfiguracija koristi statičke, kruto određene parametre iz NGINX-a.

Korak 2 — Konfiguracija NGINX

Prvi dio nginx.conf određuje određene unutarnje komponente NGINX-a koje trebaju biti postavljene.

Radne veze (Worker Connections)

Konfiguracija ispod određuje broj radnih procesa i veza. To označava kako će NGINX skalirati u skladu s potražnjom.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy različito upravlja radnim procesima i vezama.

Envoy stvara radni tok za svaku hardversku nit u sustavu. Svaki radni tok izvršava neblokirajuću petlju događaja koja je odgovorna za

  1. Slušanje svakog slušatelja (listener)
  2. Prihvaćanje novih veza
  3. Stvaranje skupa filtara za vezu
  4. Obrada svih operacija ulaza-izlaza tijekom trajanja veze.

Cijela daljnja obrada veze u potpunosti se izvršava u radnom toku, uključujući svako ponašanje preusmjeravanja.

Za svaki radni tok u Envoy postoji veza u poolu. Tako da HTTP/2 poolovi veza postavljaju samo jednu vezu za svaku vanjsku adresu odjednom, s četiri radna toka bit će četiri HTTP/2 veze za svaku vanjsku adresu u stabilnom stanju. Čuvajući sve u jednom radnom toku, gotovo sav kod može biti napisan bez blokada, kao da je jednonitni. Ako se dodijeli više radnih tokova nego što je potrebno, to može dovesti do neracionalne upotrebe memorije, stvaranja velikog broja neaktivnih veza i smanjenja broja povratnih veza u pool.

Za više informacija posjetite Envoy Proxy blog.

HTTP konfiguracija

Sljedeći blok konfiguracije NGINX određuje HTTP postavke, kao što su:

  • Koje mime vrste se podržavaju
  • Zadani vremenski intervali
  • Gzip konfiguracija

Ove aspekte možete prilagoditi pomoću filtara u Envoy Proxy, o čemu ćemo razgovarati kasnije.

Korak 3 — Konfiguracija servera

U bloku konfiguracije HTTP, NGINX konfiguracija određuje da sluša port 8080 i odgovara na dolazne zahtjeve za domene one.example.com i www.one.example.com.

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

Unutar Envoy-a time upravljaju Slušatelji.

Slušatelji Envoy-a

Najvažniji aspekt početka rada s Envoy Proxy je definiranje slušatelja. Trebate stvoriti konfiguracijski datoteku koja opisuje kako želite pokrenuti instancu Envoy.

Donji fragment će stvoriti novog slušatelja i povezati ga s portom 8080. Konfiguracija određuje Envoy Proxy na koje portove treba biti povezan za dolazne zahtjeve.

Envoy Proxy koristi YAML notaciju za svoju konfiguraciju. Kako biste se upoznali s ovom notacijom, pogledajte ovdje link.

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

Nema potrebe definirati server_name, jer će Envoy Proxy filtri to obraditi.

Korak 4 — Konfiguracija lokacije

Kada zahtjev dođe u NGINX, blok lokacije određuje kako obraditi i kamo usmjeriti promet. U sljedećem fragmentu sav promet na stranicu preusmjerava se u upstream (napomena prevoditelja: upstream obično predstavlja serverske aplikacije) klaster s imenom targetCluster. Upstream klaster određuje čvorove koji trebaju obraditi zahtjev. O tome ćemo raspraviti u sljedećem koraku.

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

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

U Envoyu, time se bave filtri.

Envoy Filters

Za statičku konfiguraciju, filtri određuju kako obraditi dolazne zahtjeve. U ovom slučaju postavljamo filtre koji odgovaraju server_names u prethodnom koraku. Kada dolazni zahtjevi odgovaraju određenim domenama i rutama, promet se usmjerava u klaster. Ovo je ekvivalent uzlaznoj konfiguraciji NGINX-a.

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

Ime envoy.http_connection_manager je ugrađeni filtr u Envoy Proxy. Ostali filtriraju uključuju Redis, Mongo, TCP. Možete pronaći cijeli popis u dokumentaciju.

Za više informacija o drugim politikama ravnoteže opterećenja posjetite Dokumentaciju Envoy.

Korak 5 — Proxy i Upstream konfiguracija

U NGINX, upstream konfiguracija određuje skup ciljanih servera koji će obraditi promet. U ovom slučaju dodijeljena su dva klastera.

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

U Envoyu, to se upravlja klasterima.

Envoy Clusters

Ekvivalent upstream definira se kao klasteri. U ovom slučaju određeni su hostovi koji će upravljati prometom. Način pristupa hostovima, kao što je vrijeme čekanja, definira se kao konfiguracija klastera. To omogućuje precizniju kontrolu nad aspektima kao što su vrijeme čekanja i ravnoteža opterećenja.

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

Prilikom korištenja otkrivanja usluga STRICT_DNS Envoy će neprekidno i asinkrono rješavati navedene DNS ciljeve. Svaka IP adresa vraćena kao rezultat DNS-a će se smatrati eksplicitnim hostom u uzlaznom klasteru. To znači da ako zahtjev vrati dvije IP adrese, Envoy će pretpostaviti da postoje dva hosta u klasteru i oba će biti uravnotežena prema opterećenju. Ako je host uklonjen iz rezultata, Envoy pretpostavlja da više ne postoji i počinje preusmjeravati promet iz bilo kojeg postojećeg skupa veza.

Za više informacija pogledajte Dokumentaciju proxy poslužitelja Envoy.

Korak 6 — Pristup dnevniku i pogreškama

Konačna konfiguracija — registracija. Umjesto da zapisuje pogreške na disk, Envoy Proxy koristi pristup u oblaku. Svi dnevnički zapisi aplikacija ispisuju se u stdout i stderr.

Kada korisnici izvrše zahtjev, dnevnički zapisi pristupa su neobavezni i prema zadanim postavkama su isključeni. Da biste omogućili dnevničke zapise pristupa za HTTP zahtjeve, uključite konfiguraciju access_log za HTTP upravitelja veza. Putanja može biti ili uređaj, poput stdout, ili datoteka na disku, ovisno o vašim zahtjevima.

Sljedeća konfiguracija preusmjerava sve dnevničke zapise pristupa u stdout (napomena prevoditelja — stdout je potreban za korištenje envoy unutar dockera. Ako se koristi bez dockera, zamijenite /dev/stdout putanjom do uobičajene log-datoteke). Kopirajte isječak u sekciju konfiguracije za upravljač veza:

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

Rezultati bi trebali izgledati ovako:

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

Prema zadanim postavkama, Envoy ima formatnu liniju koja uključuje detalje o HTTP zahtjevu:

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

Rezultat ove forme linije:

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

Sadržaj ispisa može se prilagoditi postavljanjem polja formata. Na primjer:

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"

Linija zapisa može se također prikazati u JSON formatu postavljanjem polja json_format. Na primjer:

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

Za dodatne informacije o tehnikama registracije poslanika posjetite

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

Vođenje registra nije jedini način da se stekne uvid u rad sa Envoy Proxy. Ugrađene su napredne mogućnosti praćenja i metrika. Možete saznati više u dokumentaciji o praćenju ili preko Scenarija interaktivnog praćenja.

Korak 7 — Pokretanje

Sada ste preveli konfiguraciju s NGINX-a na Envoy Proxy. Objava korak je pokrenuti instancu Envoy Proxy za testiranje.

Pokretanje od korisnika

Na vrhu konfiguracije NGINX linija user www www; ukazuje na pokretanje NGINX-a kao korisnika s niskim privilegijama radi povećane sigurnosti.

Envoy Proxy koristi pristup u oblaku za upravljanje onim tko je vlasnik procesa. Kada pokrenemo Envoy Proxy kroz kontejner, možemo odrediti korisnika s niskim privilegijama.

Pokretanje Envoy Proxy

Ispod navedena komanda pokreće Envoy Proxy kroz Docker kontejner na hostu. Ova komanda omogućava Envoy-u da sluša dolazne zahtjeve preko porta 80. Međutim, kako je navedeno u konfiguraciji slušatelja, Envoy Proxy sluša dolazni promet preko porta 8080. To omogućava procesu da se pokrene kao korisnik s niskim privilegijama.

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

Testiranje

S pokrenutim proxy-jem, testovi se sada mogu izvesti i obraditi. Sljedeća cURL komanda šalje zahtjev s zaglavljem hosta definiranom u konfiguraciji proxy-a.

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

HTTP zahtjev će rezultirati greškom 503To je zbog toga što uzlazne veze ne rade i nisu dostupne. Tako Envoy Proxy nema dostupne ciljne adrese za zahtjev. Sljedeća naredba pokrenut će niz HTTP usluga koje odgovaraju konfiguraciji definiranoj za Envoy.

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

S dostupnim uslugama, Envoy može uspješno proksirati promet prema odredištu.

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

Trebali biste vidjeti odgovor koji pokazuje koji je Docker kontejner obradio zahtjev. U zapisima Envoy Proxy-a također biste trebali vidjeti ispisanu pristupnu liniju.

Dodatni HTTP zaglavlja odgovora

U zaglavljima odgovora važećeg zahtjeva vidjet ćete dodatna HTTP zaglavlja. U zaglavlju se prikazuje vrijeme koje je nadređeni host potrošio na obradu zahtjeva. Izražava se u milisekundama. To je korisno ako klijent želi odrediti vrijeme obrade u usporedbi s kašnjenjem u mreži.

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

Završna konfiguracija

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 }

Dodatne informacije od prevoditelja

Upute za instalaciju Envoy Proxy možete pronaći na web stranici https://www.getenvoy.io/

Zadano u rpm ne postoji sistemska konfiguracija usluge systemd.

Dodajte sistemsku konfiguraciju usluge u /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

Trebate stvoriti direktorij \/etc\/envoy\/ i staviti konfiguraciju config.yaml unutra.

Postoji Telegram chat za Envoy Proxy: https://t.me/envoyproxy_ru

Envoy Proxy ne podržava dijeljenje statičkog sadržaja. Stoga tko može, glasujte za značajku: https://github.com/envoyproxy/envoy/issues/378

Samo registrirani korisnici mogu sudjelovati u anketi. Prijavite se, molimo.

Je li vas ovaj post potaknuo da instalirate i testirate Envoy Proxy?

  • da

  • ne

Glasalo je 75 korisnika. Uzdržalo se 18 korisnika.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster