Pozdrav, Habr! Predstavljam vam prijevod posta:
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 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:
- Konfiguriranje NGINX poslužitelja, strukture dnevnika i Gzip funkcionalnosti. Ovo je definirano globalno u svim slučajevima.
- Konfiguriranje NGINX-a za prihvaćanje zahtjeva hostu one.example.com na priključku 8080.
- 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
- Slušanje svakog slušatelja
- Prihvaćanje novih veza
- Stvaranje skupa filtara za vezu
- 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
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
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
Za više informacija o drugim pravilima za uravnoteženje opterećenja posjetite
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
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
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
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
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:
Envoy Proxy ne podržava posluživanje statičnog sadržaja. Dakle, tko može glasati za značajku:
U anketi mogu sudjelovati samo registrirani korisnici.
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