Ciao, Habr! Aghju purtatu à a vostra attenzione una traduzzione di u post:
Envoy hè un servitore proxy distribuitu d'altu rendiment (scrittu in C++) cuncepitu per i servizii è l'applicazioni individuali, hè ancu un bus di cumunicazione è un "pianu di dati universale" cuncepitu per grandi architetture di "serviziu mesh" di microserviziu. Quandu si creanu, i suluzioni à i prublemi chì si sò sviluppati durante u sviluppu di servitori cum'è NGINX, HAProxy, equilibratori di carica di hardware è equilibratori di carica di nuvola sò stati cunsiderati. Envoy travaglia à fiancu à ogni applicazione è astrae a rete per furnisce una funziunalità cumuni indipendendu da a piattaforma. Quandu tuttu u trafficu di serviziu in una infrastruttura scorri attraversu a mesh Envoy, diventa faciule visualizà e zone problematiche cun osservabilità coherente, sintonizza u rendiment generale è aghjunghje funziunalità core in un locu specificu.
Caratteristiche
- Architettura fora di prucessu: l'envoy hè un servitore autonomu, d'altu rendiment chì occupa una piccula quantità di RAM. Funziona in cunjunzione cù qualsiasi lingua o framework di l'applicazione.
- Supportu http/2 è grpc: l'envoy hà supportu http/2 è grpc di prima classe per e cunnessione in entrata è in uscita. Questu hè un proxy trasparente da http/1.1 à http/2.
- Equilibramentu Avanzatu di Carichi: Envoy supporta funzioni avanzate di bilanciamentu di carica cumpresi riprovazioni automatiche, rottura di a catena, limitazione di a tarifa globale, ombra di richieste, bilanciamentu di carica di zona lucale, etc.
- API di Gestione di Configurazione: Envoy furnisce una API robusta per a gestione dinamica di a vostra cunfigurazione.
- Osservabilità: Osservabilità profonda di u trafficu L7, supportu nativu per a traccia distribuita è osservabilità di mongodb, dynamodb è parechje altre applicazioni.
Passu 1 - Esempiu NGINX Config
Stu script usa un schedariu apposta nginx.conf, basatu annantu à l'esempiu cumpletu da
nginx source cunfig
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;
}
}
}
E cunfigurazioni NGINX sò tipicamente trè elementi chjave:
- Configurazione di u servitore NGINX, struttura di log è funziunalità Gzip. Questu hè definitu globalmente in tutti i casi.
- Configurazione di NGINX per accettà e dumande à l'ospite unu.esempiu.com nant'à u portu 8080.
- Configurazione di u locu di destinazione, cumu gestisce u trafficu per e diverse parti di l'URL.
Micca tutta a cunfigurazione s'applicà à Envoy Proxy, è ùn avete micca bisognu di cunfigurà certi paràmetri. Envoy Proxy hà quattru tippi chjave, chì sustene l'infrastruttura core offerta da NGINX. U core hè:
- Ascoltatori: Determinanu cumu Envoy Proxy accetta e richieste entrate. Envoy Proxy attualmente supporta solu ascoltatori basati in TCP. Quandu una cunnessione hè stabilita, hè passata à un settore di filtri per u processu.
- Filtri: Sò parti di una architettura di pipeline chì ponu processà e dati in entrata è in uscita. Questa funziunalità include filtri cum'è Gzip, chì compresses i dati prima di mandà à u cliente.
- Routers: Trasmettenu u trafficu à a destinazione necessaria, definita cum'è un cluster.
- Clusters: Defininu l'endpoint per u trafficu è i paràmetri di cunfigurazione.
Adupremu questi quattru cumpunenti per creà una cunfigurazione Envoy Proxy per currisponde à una cunfigurazione NGINX specifica. L'obiettivu di Envoy hè di travaglià cù API è cunfigurazione dinamica. In questu casu, a cunfigurazione di basa utilizerà paràmetri statici, codificati da NGINX.
Passu 2 - Configurazione NGINX
Prima parte nginx.conf definisce qualchi internu NGINX chì deve esse cunfigurati.
Cunnessioni di u travagliu
A cunfigurazione sottu determina u numeru di prucessi di travagliu è cunnessione. Questu indica cumu NGINX scala per risponde à a dumanda.
worker_processes 2;
events {
worker_connections 2000;
}
Envoy Proxy gestisce i flussi di travagliu è e cunnessione in modi diffirenti.
Envoy crea un filu di travagliu per ogni filu di hardware in u sistema. Ogni filu di u travagliu eseguisce un ciclu di l'avvenimentu senza bloccu chì hè rispunsevule
- Ascoltà ogni ascoltatore
- Accetta novi cunnessione
- Crià un settore di filtri per una cunnessione
- Prucessa tutte e operazioni I/O durante a vita di a cunnessione.
Tuttu u prucessu di cunnessione ulteriore hè trattatu interamente in u filu di u travagliu, cumpresu qualsiasi cumpurtamentu di spedizione.
Per ogni filu di travagliu in Envoy, ci hè un pool di cunnessione. Allora i pools di cunnessione HTTP / 2 stabiliscenu solu una cunnessione per host esternu à tempu, se ci sò quattru fili di u travagliu, ci saranu quattru cunnessione HTTP / 2 per host esternu in un statu stabile. Mantenendu tuttu in un filu di travagliu, quasi tuttu u codice pò esse scrittu senza bluccà, cum'è s'ellu era un filu unicu. Se più fili di travagliadori sò attribuiti di ciò chì hè necessariu, questu pò purtà à a memoria persa, creendu un gran numaru di cunnessione inattivu, è riducendu u numeru di volte chì e cunnessione sò tornate à a piscina.
Per più infurmazione visitate
Configurazione HTTP
U seguente bloccu di cunfigurazione NGINX definisce paràmetri HTTP cum'è:
- Chì tipi di mime sò supportati
- Timeouts predeterminati
- Configurazione Gzip
Pudete persunalizà questi aspetti utilizendu filtri in Envoy Proxy, chì discuteremu più tardi.
Passu 3 - Configurazione di u Server
In u bloccu di cunfigurazione HTTP, a cunfigurazione NGINX specifica à sente à u portu 8080 è risponde à e dumande entrate per i domini. unu.esempiu.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Dentru Envoy, hè cuntrullatu da Listeners.
Ascoltatori mandatari
L'aspettu più impurtante di cumincià cù Envoy Proxy hè di definisce i vostri ascoltatori. Avete bisognu di creà un schedariu di cunfigurazione chì descrive cumu vulete eseguisce l'istanza Envoy.
U snippet sottu hà da creà un novu listener è ligà à u portu 8080. A cunfigurazione dice à Envoy Proxy à quali porti deve ligà per e dumande entrate.
Envoy Proxy usa a notazione YAML per a so cunfigurazione. Per una introduzione à sta notazione, fighjate quì
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Ùn ci hè bisognu di definisce server_name, postu chì i filtri Envoy Proxy anu da trattà questu.
Passu 4 - Configurazione Location
Quandu una dumanda vene in NGINX, u bloccu di locu determina cumu processà è induve indirizzà u trafficu. In u frammentu seguente, tuttu u trafficu à u situ hè trasferitu à un cluster upstream (nota di u traduttore: upstream hè di solitu un servitore di applicazioni) chjamatu. targetCluster. U cluster upstream definisce i nodi chì devenu processà a dumanda. Discuteremu questu in u prossimu passu.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
À Envoy, Filtri faci questu.
Filtri Envoy
Per una cunfigurazione statica, i filtri determinanu cumu processà e richieste entrate. In questu casu avemu stabilitu filtri chì currispondenu server_names in u passu precedente. Quandu e dumande entrate arrivanu chì currispondenu à certi domini è rotte, u trafficu hè instradatu à u cluster. Questu hè l'equivalente di una cunfigurazione NGINX bottom-up.
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
nomu envoy.http_connection_manager hè un filtru integratu in Envoy Proxy. Altri filtri includenu Redis, Mongo, TCP. Pudete truvà a lista cumpleta à
Per più infurmazione nantu à altre pulitiche di bilanciamentu di carica, visitate
Passu 5 - Configurazione Proxy è Upstream
In NGINX, a cunfigurazione upstream definisce un settore di servitori di destinazione chì prucessarà u trafficu. In questu casu, dui gruppi sò stati attribuiti.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
In Envoy, questu hè gestitu da clusters.
Clusters di mandatari
L'equivalente upstream hè definitu cum'è clusters. In questu casu, l'ospiti chì serviranu u trafficu sò stati identificati. A manera di accede à l'ospiti, cum'è timeouts, hè definitu cum'è una cunfigurazione di cluster. Questu permette un cuntrollu più granulare nantu à aspetti cum'è a latenza è l'equilibriu di carica.
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 }}
]
Quandu si usa u serviziu di scuperta STRICT_DNS Envoy risolverà continuamente è asincronamente i miri DNS specificati. Ogni indirizzu IP restituitu da u risultatu DNS serà cunsideratu un host esplicitu in u cluster upstream. Questu significa chì se una dumanda torna dui indirizzi IP, Envoy assumerà chì ci sò dui ospiti in u cluster, è i dui devenu esse equilibrati di carica. Se un òspite hè eliminatu da u risultatu, Envoy assumerà chì ùn esiste più è tirarà u trafficu da ogni piscina di cunnessione esistente.
Per più infurmazione vede
Step 6 - Log Access and Errors
A cunfigurazione finale hè a registrazione. Invece di spinghje i logs d'errore à u discu, Envoy Proxy adopta un approcciu basatu in nuvola. Tutti i logs di l'applicazione sò in output stdout и stderr.
Quandu l'utilizatori facenu una dumanda, i logs d'accessu sò opzionali è disattivati per automaticamente. Per attivà i logs d'accessu per e dumande HTTP, attivate a cunfigurazione log_access per u gestore di cunnessione HTTP. U percorsu pò esse sia un dispusitivu cum'è stdout, o un schedariu nantu à u discu, secondu i vostri bisogni.
A seguente cunfigurazione redirigerà tutti i logs d'accessu à stdout (Nota di u traduttore - stdout hè necessariu d'utilizà envoy in docker. Se s'utilice senza docker, poi rimpiazzà /dev/stdout cù u percorsu à un schedariu di log regular). Copia u snippet à a sezione di cunfigurazione per u gestore di cunnessione:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
I risultati duveranu vede cusì:
- 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:
Per automaticamente, Envoy hà una stringa di furmatu chì include i dettagli di a dumanda 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
U risultatu di sta stringa di formatu hè:
[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"
U cuntenutu di pruduzzioni pò esse persunalizatu da mette u campu di furmatu. Per esempiu:
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"
A linea di logu pò ancu esse prodotta in u formatu JSON per stabilisce u campu json_format. Per esempiu:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Per più infurmazione nantu à a Metodologia di Registrazione di l'Envoy, visitate
Logging ùn hè micca l'unicu modu per acquistà insight à travaglià cù Envoy Proxy. Hà capacità avanzate di seguimentu è metrica integrate in questu. Pudete sapè di più à
Passu 7 - Lanciari
Avete avà migratu a vostra cunfigurazione da NGINX à Envoy Proxy. L'ultimu passu hè di lancià una istanza di Envoy Proxy per pruvà.
Eseguite cum'è utilizatore
À a cima di a linea di cunfigurazione NGINX utilizatore www www; specifica per eseguisce NGINX cum'è un utilizatore pocu privilegiatu per migliurà a sicurità.
Envoy Proxy adopta un approcciu basatu in nuvola per a gestione di quale pussede un prucessu. Quandu eseguimu Envoy Proxy à traversu un containeru, pudemu specificà un utilizatore à pocu privilegiu.
Lanciamentu di Envoy Proxy
U cumandimu quì sottu eseguirà Envoy Proxy attraversu un containeru Docker nantu à l'ospite. Questu cumandamentu dà à Envoy l'abilità di sente per e dumande in u portu 80. In ogni casu, cum'è specificata in a cunfigurazione di u listener, Envoy Proxy ascolta u trafficu in u portu 8080. Questu permette à u prucessu per eseguisce cum'è un usu privilegiatu.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Prucessioni
Cù u proxy in esecuzione, i testi ponu avà esse fatti è processati. U cumandimu cURL seguente emette una dumanda cù l'intestazione di l'ospite definita in a cunfigurazione proxy.
curl -H "Host: one.example.com" localhost -i
A dumanda HTTP hà da esse un errore 503. Questu hè perchè e cunnessione upstream ùn funziona micca è ùn sò micca dispunibili. Dunque, Envoy Proxy ùn hà micca destinazioni dispunibili per a dumanda. U cumandimu seguitu principià una seria di servizii HTTP chì currispondenu à a cunfigurazione definita per Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Cù i servizii dispunibuli, Envoy pò riesce u trafficu proxy à u so destinazione.
curl -H "Host: one.example.com" localhost -i
Duvete vede una risposta chì indica quale container Docker hà processatu a dumanda. In i logs di Envoy Proxy, duvete ancu vede un output di stringa d'accessu.
Intestazioni di risposta HTTP supplementari
Vederete intestazioni HTTP supplementari in l'intestazione di risposta di a dumanda attuale. L'intestazione mostra u tempu chì l'ospite upstream hà passatu à processà a dumanda. Spressa in millisecondi. Questu hè utile se u cliente vole determinà u tempu di serviziu cumparatu cù a latenza di a rete.
x-envoy-upstream-service-time: 0
server: envoy
Config finale
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 }
Informazioni supplementari da u traduttore
Istruzzioni per installà Envoy Proxy ponu esse truvati nantu à u situ web
Per automaticamente, rpm ùn hà micca una configurazione di serviziu di sistema.
Aghjunghjite a configurazione di u serviziu 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
Avete bisognu di creà un repertoriu /etc/envoy/ è mette a config.yaml config.
Ci hè un chat di telegramma cù proxy di l'envoy:
Envoy Proxy ùn sustene micca u serviziu di cuntenutu staticu. Dunque, quale pò votà per a funzione:
Solu l'utilizatori registrati ponu participà à l'indagine.
Questu post vi hà incuraghjitu à stallà è pruvà proxy di l'envoy?
-
sì
-
micca
75 utilizatori anu vutatu. 18 utilizatori si sò astenuti.
Source: www.habr.com