Zdravo, Habr! Predlažem vam prevod posta: .
Envoy je visokoperformantni distribuirani proxy server (napisan u C++), namenjen za pojedinačne servise i aplikacije, takođe služi kao komunikacijska magistrala i 'univerzalna data plane', razvijen za velike mikroservisne arhitekture 'service mesh'. Tokom njegovog stvaranja, uzeti su u obzir problemi koji su se javljali pri razvoju takvih servera kao što su NGINX, HAProxy, hardverski balansatori opterećenja i cloud balansatori opterećenja. Envoy radi zajedno sa svakom aplikacijom i apstrahuje mrežu, pružajući zajedničke funkcije bez obzira na platformu. Kada celi servisni saobraćaj u infrastrukturi prolazi kroz mrežu Envoy, postaje lako vizualizovati problematična mesta uz pomoć usklađene uočljivosti, podešavanja zajedničke performanse i dodavanja ključnih funkcija na određenom mestu.
Возможности
- Arhitektura van procesa: Envoy je samostalan, visokoperformantan server koji zauzima malo memorije. Radi u saradnji sa bilo kojim jezikom aplikacije ili okvirom.
- Podrška za http/2 i grpc: Envoy ima vrhunsku podršku za http/2 i grpc za ulazne i izlazne veze. Ovo je transparentni proxy od http/1.1 do http/2.
- Napredna 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, senčenje zahteva, lokalnu ravnotežu opterećenja zona itd.
- API za upravljanje konfiguracijom: Envoy pruža pouzdan API za dinamičko upravljanje svojom konfiguracijom.
- Uočljivost: duboka uočljivost L7 saobraćaja, ugrađena podrška za distribuirano praćenje i uočljivost za mongodb, dynamodb i mnoge druge aplikacije.
Korak 1 — Primer NGINX konfiguracije
U ovom scenariju koristi se posebno kreirana datoteka nginx.conf, zasnovana na potpunom primeru iz . 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:
- Podešavanje NGINX servera, strukture logova i funkcionalnosti Gzip. Ovo se definiše globalno u svim slučajevima.
- Podešavanje NGINX-a za prihvatanje zahteva na hostu one.example.com na portu 8080.
- Podešavanje ciljne lokacije, kako obraditi saobraćaj za različite delove URL-a.
Neće se sva konfiguracija primenjivati na Envoy Proxy, i nije potrebno podešavati neke parametre. Envoy Proxy ima četiri ključna tipa, koja podržavaju osnovnu infrastrukturu koju nudi NGINX. Osnovni delovi su:
- Slušaoci: Oni definišu kako Envoy Proxy prihvata dolazne zahteve. Trenutno, Envoy Proxy podržava samo TCP bazirane slušače. Kada je veza uspostavljena, prosleđuje se nizu filtera na obradu.
- Filters: Oni su deo arhitekture cevovoda koja može obraditi dolazne i odlazne podatke. Ova funkcionalnost uključuje filtre kao što je Gzip, koji kompresuje podatke pre nego što ih pošalje klijentu.
- Ruterima: Oni preusmeravaju saobraćaj na odredište koje je definisano kao klaster.
- Klasteri: Oni definišu krajnju tačku za saobraćaj i parametre konfiguracije.
Koristićemo ova četiri komponenta za izradu konfiguracije Envoy Proxy kako bismo bili usklađeni sa određenom NGINX konfiguracijom. Cilj Envoy-a je rad sa API-jem i dinamička konfiguracija. U ovom slučaju, osnovna konfiguracija koristiće statičke, čvrsto zadate parametre iz NGINX-a.
Korak 2 — Konfiguracija NGINX
Prvi del nginx.conf definiše neke unutrašnje komponente NGINX-a koje treba konfigurisati.
Worker Connections (Radna spojna mesta)
Navedena konfiguracija definira broj radnih procesa i veza. To označava kako će NGINX skalirati kako bi zadovoljio potražnju.
worker_processes 2;
events {
worker_connections 2000;
}Envoy Proxy na različite načine upravlja radnim procesima i vezama.
Envoy stvara radnu nit za svaki hardverski tok u sistemu. Svaka radna nit izvodi neblokirajuću petlju događaja koja je odgovorna za
- Slušanje svakog slušača (listener)
- Prihvatanje novih veza
- Kreiranje skupa filtera za vezu
- Obrada svih operacija ulaza-izlaza tokom trajanja veze.
Sva daljnja obrada veze se u potpunosti obrađuje u radnoj niti, uključujući bilo kakvo ponašanje preusmeravanja.
Za svaku radnu nit u Envoy postoji veza u bazenu. Tako, HTTP/2 bazeni uspostavljaju samo jednu vezu za svaku spoljnu domaćicu u jednom trenutku; u prisustvu četiri radne niti biće četiri HTTP/2 veze za svaku spoljnu domaćicu u stabilnom stanju. Držanjem svega unutar jedne radne niti, gotovo sav kod može biti napisan bez blokiranja, kao da je jednonitni. Ako se radne niti dodele više nego što je potrebno, to može dovesti do neracionalne upotrebe memorije, stvaranja velikog broja neaktivnih veza i smanjenja broja povrataka veza u bazen.
26. marec 2020, Apache Software Foundation ter razvijalci prostovoljci, skrbniki, .
HTTP konfiguracija
Naredni blok konfiguracije NGINX definiše HTTP postavke, kao što su:
- Koje MIME vrste se podržavaju
- Podrazumevani tajmauti
- Gzip konfiguracija
Možete podesiti ove aspekte pomoću filtera u Envoy Proxy, što ćemo detaljnije raspraviti kasnije.
Korak 3 — Konfiguracija Servera
U HTTP konfiguracionom bloku, NGINX konfiguracija definiše da sluša port 8080 i odgovara na dolazne zahteve za domene one.example.com in www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;Unutar Envoy, ovo upravljaju Slušači.
Slušači Envoy
Najvažniji aspekt započinjanja rada sa Envoy Proxy je definisanje slušača. Potrebno je da kreirate konfiguracioni fajl koji opisuje kako želite da pokrenete instancu Envoy.
Spodaj navedeni del kode bo ustvaril novega poslušalca in ga povezal z vrati 8080. Konfiguracija določa, na katera vrata se mora Envoy Proxy priključiti za prihajajoče zahteve.
Envoy Proxy uporablja YAML notacijo za svojo konfiguracijo. Za spoznavanje s to notacijo, poglejte tukaj .
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }Ni potrebe po definiciji server_name, saj se filtri Envoy Proxy z njim spopadejo.
Korak 4 — Konfiguracija lokacije
Ko zahteva pride v NGINX, blok lokacije določa, kako obdelati in kam usmeriti promet. V naslednjem delu vse promet na spletno mesto preusmeri v upstream (opomba prevajalca: upstream je običajno klaster aplikacijskih strežnikov) s imenom targetCluster. Upstream klaster določa vozlišča, ki morajo obdelati zahtevo. To bomo obravnavali v naslednjem koraku.
location \/ {
proxy_pass http:\/\/targetCluster\/(;\n proxy_redirect off;\n\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n}V Envoy to obravnavajo Filtri.
Envoy Filters
Za statično konfiguracijo filtri določajo, kako obdelati prihajajoče zahteve. V tem primeru nastavimo filtre, ki ustrezajo server_names v prejšnjem koraku. Ko prispejo prihajajoče zahteve, ki ustrezajo določenim domenam in potezam, se promet usmeri v klaster. To je ekvivalent vzvodni konfiguraciji 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.routerIme envoy.http_connection_manager je vgrajen filter v Envoy Proxy. Drugi filtri vključujejo Redis, Mongo, TCP. Celoten seznam lahko najdete v .
Za dodatne informacije o drugih politikah uravnoteženja obremenitve obiščite .
Korak 5 — Proxy in konfiguracija upstream
V NGINX konfiguracija upstream določa niz ciljnih strežnikov, ki bodo obdelali promet. V tem primeru sta bila dodeljena dva klastera.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}V Envoy to upravljajo klasterji.
Envoy Clusters
Ekvivalent upstream se določa kot gruče. V tem primeru so bili določeni gostitelji, ki bodo obravnavali promet. Način dostopa do gostiteljev, na primer čas čakanja, je določen kot konfiguracija gruče. To omogoča natančnejše obvladovanje grobih vidikov, kot sta čas čakanja in uravnoteženje obremenitve.
Kopiraj v urejevalnik gruče:
- ime: 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 }}
]Pri uporabi odkrivanja storitev STRICT_DNS Envoy bo nenehno in asinhrono razreševal navedene cilje DNS. Vsaka vrnjena IP-naslov v rezultatu DNS bo štela za jasnega gostitelja v vzponi grozdu. To pomeni, da če zahteva vrne dva IP-naslova, bo Envoy domneval, da v grozdu obstajata dva gostitelja, in oba morata biti uravnotežena po obremenitvi. Če je gostitelj odstranjena iz rezultata, Envoy domneva, da ne obstaja več, in bo obravnaval promet iz vseh obstoječih baz povezav.
Za dodatne informacije glejte. .
Korak 6 – Dostop do dnevnika in napak
Končna konfiguracija – beleženje. Namesto da bi dnevnike napak prenašali na disk, Envoy Proxy uporablja oblake. Vse aplikacijske dnevnike izpisuje v stdout in stderr.
Ko uporabniki pošljejo zahtevo, so dnevniki dostopa neobvezni in privzeto izklopljeni. Da omogočite dnevnike dostopa za HTTP zahteve, vključite konfiguracijo access_log za HTTP upravljalnik povezav. Pot je lahko bodisi naprava, kot je stdout, ali datoteka na disku, odvisno od vaših zahtev.
Naslednja konfiguracija bo preusmerila vse dnevnike dostopa v stdout (opomba prevajalca – stdout je potreben za uporabo envoy v dockerju. Če se uporablja brez dockerja, zamenjajte /dev/stdout z običajno potjo do dnevnike datoteke). Kopirajte ta del v razdelek konfiguracije za upravljalnik povezav:
Kopiraj v odložiščeaccess_log:
- ime: envoy.file_access_log
config:
path: "/dev/stdout"Rezultati morajo izgledati takole:
- ime: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
access_log:
- ime: envoy.file_access_log
config:
path: "/dev/stdout"
route_config:Privzeto ima Envoy niz formata, ki vključuje podrobnosti o HTTP zahtevi:
[%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%"nRezultat te strune formata:
[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 izlaza se može konfigurisati podešavanjem polja formata. Na primer:
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 dnevnika takođe može biti ispisana u JSON formatu podešavanjem polja json_format. Na primer:
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, posetite
Vođenje dnevnika nije jedini način da se dobije uvid u rad sa Envoy Proxy. Ima ugrađene napredne mogućnosti praćenja i metrika. Možete saznati više u ili putem .
Korak 7 - Pokretanje
Sada ste preveli konfiguraciju sa NGINX-a na Envoy Proxy. Poslednji korak je pokretanje instancije Envoy Proxy radi testiranja.
Pokretanje od korisnika
Na vrhu NGINX konfiguracije linija user www www; ukazuje na to da se NGINX pokreće kao korisnik sa niskim privilegijama radi boljeg bezbednosti.
Envoy Proxy koristi pristup zasnovan na oblaku za upravljanje ko je vlasnik procesa. Kada pokrećemo Envoy Proxy kroz kontejner, možemo odrediti korisnika sa niskim privilegijama.
Pokretanje Envoy Proxy
Donja komanda će pokrenuti Envoy Proxy kroz Docker kontejner na hostu. Ova komanda omogućava Envoy-u da sluša dolazne zahtjeve na portu 80. Međutim, kao što je navedeno u konfiguraciji slušača, Envoy Proxy sluša dolazni saobraćaj preko porta 8080. Ovo omogućava procesu da se pokrene kao korisnik sa niskim privilegijama.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoyTestiranje
Sa pokrenutim proxy-em, sada se mogu izvršiti i obraditi testovi. Sledeća cURL komanda šalje zahtev sa zaglavljem hosta definisanim u konfiguraciji proxy-a.
curl -H "Host: one.example.com" localhost -iHTTP zahtev će dovesti do greške 503To je posledica nefunkcionalnosti vzporednih povezav, zaradi česar Envoy Proxy nima dostopnih ciljnih naslovov za zahtevke. Naslednji ukaz bo zagnal serijo HTTP storitev, ki ustrezajo konfiguraciji, določeni za Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;Z razpoložljivimi storitvami lahko Envoy uspešno proxyira promet do cilja.
curl -H "Host: one.example.com" localhost -iMorali bi videti odgovor, ki kaže, kateri Docker kontejner je obdelal zahtevo. V dnevnikih Envoy Proxy bi tudi morali videti izpis dostopne vrstice.
Dodatni HTTP odzivni glavi
V glavi odziva veljavne zahteve boste videli dodatne HTTP glave. V glavi je prikazano, koliko časa je zgornji gostitelj porabil za obdelavo zahtevka. Izraženo je v milisekundah. To je koristno, če želi stranka določiti čas obdelave v primerjavi z zamudo v omrežju.
x-envoy-upstream-service-time: 0
server: envoyKonč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 prevajalca
Navodila za namestitev Envoy Proxy lahko najdete na spletni strani
Privzeto v rpm manjkajo systemd service konfiguracija.
Dodajte systemd service konfiguracijo \/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.targetUstvariti morate imenik \/etc\/envoy\/ in vanj postaviti konfiguracijo config.yaml.
Ob Envoy Proxy je telegram chat:
Envoy Proxy ne podpira gostovanja statičnih vsebin. Zato, kdo lahko, glasujte za funkcionalnost:
Samo registrovani korisnici mogu učestvovati u anketi. , molim vas.
Vas je ta objava spodbudila, da namestite in preizkusite Envoy Proxy?
da
ne
Glasovalo je 75 uporabnikov. 18 uporabnikov se je vzdržalo.
Izvor: habr.com
