Migracija s Nginxa na Envoy Proxy

Pozdrav, Habr! Predstavljam vam prijevod posta: Migracija s Nginxa na Envoy Proxy.

Envoy je distribuirani proxy poslužitelj visokih performansi (napisan u C++) dizajniran za pojedinačne usluge i aplikacije, također je komunikacijska sabirnica i "univerzalna podatkovna ravnina" dizajnirana za velike mikroservisne "servisne mreže" arhitekture. Pri izradi su uzeta u obzir rješenja problema koji su nastali tijekom razvoja poslužitelja kao što su NGINX, HAProxy, hardware load balancers i cloud load balancers. Envoy radi uz svaku aplikaciju i apstrahira mrežu kako bi pružio zajedničku funkcionalnost bez obzira na platformu. Kada sav promet usluga u infrastrukturi teče kroz mrežu Envoy, postaje lako vizualizirati problematična područja s dosljednom vidljivošću, podesiti ukupnu izvedbu i dodati temeljnu funkcionalnost na određenoj lokaciji.

Sposobnosti

  • Izvanprocesna arhitektura: envoy je samostalan poslužitelj visokih performansi koji zauzima malu količinu RAM-a. Radi u kombinaciji s bilo kojim programskim jezikom ili okvirom.
  • http/2 i grpc podrška: envoy ima prvoklasnu http/2 i grpc podršku za dolazne i odlazne veze. Ovo je transparentni proxy od http/1.1 do http/2.
  • Napredno balansiranje opterećenja: envoy podržava napredne značajke balansiranja opterećenja uključujući automatske ponovne pokušaje, prekid lanca, globalno ograničenje brzine, sjenčanje zahtjeva, balansiranje opterećenja lokalne zone itd.
  • API za upravljanje konfiguracijom: envoy pruža robustan API za dinamičko upravljanje vašom konfiguracijom.
  • Opservabilnost: duboka vidljivost L7 prometa, izvorna podrška za distribuirano praćenje i vidljivost mongodb, dynamodb i mnogih drugih aplikacija.

Korak 1 — Primjer NGINX konfiguracije

Ova skripta koristi posebno izrađenu datoteku nginx.conf, na temelju cijelog primjera iz NGINX Wiki. Konfiguraciju možete vidjeti u uređivaču otvaranjem nginx.conf

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

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

  1. Konfiguriranje NGINX poslužitelja, strukture dnevnika i Gzip funkcionalnosti. Ovo je definirano globalno u svim slučajevima.
  2. Konfiguriranje NGINX-a za prihvaćanje zahtjeva hostu one.example.com na priključku 8080.
  3. Postavljanje ciljne lokacije, kako upravljati prometom za različite dijelove URL-a.

Neće se sva konfiguracija primijeniti na Envoy Proxy i ne morate konfigurirati neke postavke. Envoy Proxy ima četiri ključne vrste, koji podržavaju temeljnu infrastrukturu koju nudi NGINX. Jezgra je:

  • Slušatelji: Oni određuju kako Envoy Proxy prihvaća dolazne zahtjeve. Envoy Proxy trenutno podržava samo slušatelje temeljene na TCP-u. Nakon što se veza uspostavi, prosljeđuje se skupu filtara na obradu.
  • Filteri: Oni su dio arhitekture cjevovoda koji može obraditi dolazne i odlazne podatke. Ova funkcionalnost uključuje filtre kao što je Gzip, koji sažima podatke prije slanja klijentu.
  • Usmjerivači: Oni prosljeđuju promet do traženog odredišta, definiranog kao klaster.
  • Klasteri: Oni definiraju krajnju točku za promet i konfiguracijske parametre.

Koristit ćemo ove četiri komponente za izradu Envoy Proxy konfiguracije koja odgovara određenoj NGINX konfiguraciji. Envoyjev cilj je rad s API-jima i dinamičkom konfiguracijom. U ovom slučaju, osnovna konfiguracija će koristiti statičke, tvrdo kodirane postavke iz NGINX-a.

Korak 2 - Konfiguracija NGINX-a

Prvi dio nginx.conf definira neke unutarnje elemente NGINX-a koje je potrebno konfigurirati.

Radničke veze

Donja konfiguracija određuje broj radnih procesa i veza. Ovo pokazuje kako će se NGINX skalirati da zadovolji potražnju.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy upravlja tijekovima rada i vezama na različite načine.

Envoy stvara radnu nit za svaku hardversku nit u sustavu. Svaka radna nit izvršava neblokirajuću petlju događaja koja je odgovorna za

  1. Slušanje svakog slušatelja
  2. Prihvaćanje novih veza
  3. Stvaranje skupa filtara za vezu
  4. Obradite sve I/O operacije tijekom vijeka trajanja veze.

Sva daljnja obrada povezivanja u potpunosti se obrađuje u radnoj niti, uključujući bilo kakvo prosljeđivanje.

Za svaku radničku nit u Envoyu postoji spremište veza. Dakle, skupovi HTTP/2 veza uspostavljaju samo jednu vezu po vanjskom hostu odjednom, ako postoje četiri radne niti, bit će četiri HTTP/2 veze po vanjskom hostu u stabilnom stanju. Držeći sve u jednoj radnoj niti, gotovo sav kod se može napisati bez blokiranja, kao da je jednonit. Ako je više radničkih niti dodijeljeno nego što je potrebno, to može dovesti do gubitka memorije, stvaranja velikog broja neaktivnih veza i smanjenja broja vraćanja veza natrag u spremište.

Za više informacija posjetite Envoy Proxy blog.

HTTP konfiguracija

Sljedeći konfiguracijski blok NGINX definira HTTP postavke kao što su:

  • Koje su mime vrste podržane
  • Zadana istek vremena
  • Gzip konfiguracija

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

Korak 3 - Konfiguracija poslužitelja

U HTTP konfiguracijskom bloku, NGINX konfiguracija određuje slušanje na priključku 8080 i odgovaranje na dolazne zahtjeve za domene one.example.com и www.one.example.com.

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

Unutar Envoya njime upravljaju Slušatelji.

Izaslanik slušatelja

Najvažniji aspekt početka rada s Envoy Proxyjem je definiranje vaših slušatelja. Morate izraditi konfiguracijsku datoteku koja opisuje kako želite pokrenuti Envoy instancu.

Isječak u nastavku stvorit će novog slušatelja i vezati ga za priključak 8080. Konfiguracija govori Envoy Proxyju na koje se priključke treba vezati za dolazne zahtjeve.

Envoy Proxy koristi YAML notaciju za svoju konfiguraciju. Uvod u ovu notaciju potražite ovdje veza.

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

Nema potrebe za definiranjem ime_poslužitelja, jer će Envoy Proxy filtri to riješiti.

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 prema web-mjestu prenosi se na uzvodni (napomena prevoditelja: uzvodni je obično aplikacijski poslužitelj) klaster pod nazivom targetCluster. Uzvodni klaster definira čvorove koji bi trebali obraditi zahtjev. O tome ćemo razgovarati 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, Filters to radi.

Envoy filteri

Za statičku konfiguraciju filtri određuju kako obraditi dolazne zahtjeve. U ovom slučaju postavljamo filtre koji odgovaraju imena_poslužitelja u prethodnom koraku. Kada stignu dolazni zahtjevi koji odgovaraju određenim domenama i rutama, promet se usmjerava prema klasteru. Ovo je ekvivalent NGINX konfiguracije odozdo prema gore.

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 izaslanik.http_connection_manager je ugrađeni filtar u Envoy Proxy. Ostali filtri uključuju Redis, Mongo, TCP. Kompletan popis možete pronaći na dokumentacija.

Za više informacija o drugim pravilima za uravnoteženje opterećenja posjetite Dokumentacija izaslanika.

Korak 5 - Proxy i uzvodna konfiguracija

U NGINX-u uzvodna konfiguracija definira skup ciljnih poslužitelja koji će obrađivati ​​promet. U ovom slučaju dodijeljena su dva klastera.

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

U Envoyu to upravljaju klasteri.

Izaslanik Klastera

Uzvodni ekvivalent definiran je kao klasteri. U ovom slučaju identificirani su hostovi koji će opsluživati ​​promet. Način na koji se pristupa hostovima, kao što su timeouts, definiran je kao konfiguracija klastera. To omogućuje detaljniju kontrolu nad aspektima kao što su latencija i uravnoteženje 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 }}
    ]

Kada koristite otkrivanje usluge STRICT_DNS Envoy će kontinuirano i asinkrono rješavati navedene DNS ciljeve. Svaka vraćena IP adresa iz DNS rezultata smatrat će se eksplicitnim hostom u uzvodnom klasteru. To znači da ako zahtjev vrati dvije IP adrese, Envoy će pretpostaviti da postoje dva hosta u klasteru, a oba moraju biti uravnotežena. Ako se host ukloni iz rezultata, Envoy će pretpostaviti da više ne postoji i povući će promet iz svih postojećih skupova veza.

Za više informacija pogledajte Envoy proxy dokumentacija.

Korak 6 — Pristup zapisniku i pogreške

Konačna konfiguracija je registracija. Umjesto guranja zapisa pogrešaka na disk, Envoy Proxy koristi pristup temeljen na oblaku. Svi zapisnici aplikacije izlaze na stdout и stderr.

Kada korisnici podnose zahtjev, zapisnici pristupa su izborni i onemogućeni prema zadanim postavkama. Da biste omogućili zapisnike pristupa za HTTP zahtjeve, omogućite konfiguraciju pristup_log za upravitelja HTTP veze. Put može biti ili uređaj kao što je stdout, ili datoteku na disku, ovisno o vašim zahtjevima.

Sljedeća konfiguracija preusmjerit će sve zapise pristupa na stdout (napomena prevoditelja - stdout je potreban za korištenje envoy unutar dockera. Ako se koristi bez dockera, zamijenite /dev/stdout stazom do regularne datoteke dnevnika). Kopirajte isječak u konfiguracijski odjeljak za upravitelja 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 niz formata koji uključuje detalje HTTP zahtjeva:

[%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 ovog niza formata je:

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

Izlazni sadržaj 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"

Redak dnevnika također se može ispisati 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 više informacija o metodologiji registracije Envoy, posjetite

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

Logiranje nije jedini način da dobijete uvid u rad s Envoy Proxyjem. U njega su ugrađene napredne mogućnosti praćenja i mjerenja. Više možete saznati na tragalna dokumentacija ili putem Interaktivna skripta za praćenje.

Korak 7 - Pokretanje

Sada ste migrirali svoju konfiguraciju s NGINX na Envoy Proxy. Posljednji korak je pokretanje instance Envoy Proxyja kako bi se testirala.

Pokreni kao korisnik

Na vrhu konfiguracijske linije NGINX korisnik www www; navodi pokretanje NGINX-a kao korisnika s niskim privilegijama radi poboljšanja sigurnosti.

Envoy Proxy ima pristup koji se temelji na oblaku za upravljanje procesom. Kada pokrenemo Envoy Proxy kroz spremnik, možemo navesti korisnika s niskim privilegijama.

Pokretanje Envoy Proxyja

Naredba u nastavku pokrenut će Envoy Proxy kroz Docker spremnik na hostu. Ova naredba daje Envoyu mogućnost slušanja dolaznih zahtjeva na portu 80. Međutim, kao što je navedeno u konfiguraciji slušatelja, Envoy Proxy sluša dolazni promet na portu 8080. To omogućuje procesu da se izvodi 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

Kada je proxy pokrenut, testovi se sada mogu napraviti i obraditi. Sljedeća naredba cURL izdaje zahtjev sa zaglavljem hosta definiranim u proxy konfiguraciji.

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

HTTP zahtjev će rezultirati pogreškom 503. To je zato što uzvodne veze ne rade i nisu dostupne. Stoga Envoy Proxy nema dostupna odredišta 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;

Uz dostupne usluge, Envoy može uspješno proxy promet do svog odredišta.

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

Trebali biste vidjeti odgovor koji pokazuje koji je Docker spremnik obradio zahtjev. U Envoy Proxy zapisnicima također biste trebali vidjeti izlaz niza pristupa.

Dodatna zaglavlja HTTP odgovora

Vidjet ćete dodatna HTTP zaglavlja u zaglavljima odgovora stvarnog zahtjeva. Zaglavlje prikazuje vrijeme koje je uzvodno računalo provelo obrađujući zahtjev. Izraženo u milisekundama. Ovo je korisno ako klijent želi odrediti vrijeme usluge u usporedbi s kašnjenjem mreže.

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

Konač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 Proxyja možete pronaći na web stranici https://www.getenvoy.io/

Prema zadanim postavkama, rpm nema konfiguraciju usluge systemd.

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

Morate stvoriti direktorij /etc/envoy/ i tamo staviti config.yaml config.

Postoji telegram chat koristeći envoy proxy: https://t.me/envoyproxy_ru

Envoy Proxy ne podržava posluživanje statičnog sadržaja. Dakle, tko može glasati za značajku: https://github.com/envoyproxy/envoy/issues/378

U anketi mogu sudjelovati samo registrirani korisnici. Prijaviti se, molim.

Je li vas ovaj post potaknuo da instalirate i testirate envoy proxy?

  • da

  • ne

Glasovalo je 75 korisnika. Suzdržano je bilo 18 korisnika.

Izvor: www.habr.com

Dodajte komentar