Hello, Habr! Inġib għall-attenzjoni tiegħek traduzzjoni tal-post:
Envoy huwa proxy server distribwit ta 'prestazzjoni għolja (miktub f'C++) iddisinjat għal servizzi u applikazzjonijiet individwali, huwa wkoll xarabank ta' komunikazzjoni u "pjan ta 'dejta universali" iddisinjat għal arkitetturi kbar ta' "malji ta 'servizz" ta' mikroservizzi. Meta ħoloqha, ġew ikkunsidrati soluzzjonijiet għall-problemi li qamu waqt l-iżvilupp ta 'servers bħal NGINX, HAProxy, bilanċaturi tat-tagħbija tal-ħardwer u balancers tat-tagħbija tas-sħab. Envoy jaħdem flimkien ma' kull applikazzjoni u jastraxxi n-netwerk biex jipprovdi funzjonalità komuni irrispettivament mill-pjattaforma. Meta t-traffiku kollu tas-servizz f'infrastruttura jgħaddi mill-malja tal-Envoy, isir faċli li jiġu viżwalizzati żoni problematiċi b'osservabilità konsistenti, tixgħel il-prestazzjoni ġenerali, u żżid il-funzjonalità ewlenija f'post speċifiku.
Kapaċitajiet
- Arkitettura barra mill-proċess: envoy huwa server awtonomu ta 'prestazzjoni għolja li jieħu ammont żgħir ta' RAM. Jaħdem flimkien ma' kwalunkwe lingwa jew qafas ta' applikazzjoni.
- http/2 u appoġġ grpc: l-envoy għandu appoġġ http/2 u grpc tal-ewwel klassi għal konnessjonijiet deħlin u ħerġin. Dan huwa prokura trasparenti minn http/1.1 sa http/2.
- Ibbilanċjar Avvanzat tat-Tagħbija: l-envoy jappoġġja karatteristiċi avvanzati tal-ibbilanċjar tat-tagħbija inklużi tentattivi mill-ġdid awtomatiku, tkissir tal-katina, limitazzjoni tar-rata globali, shadowing tat-talba, ibbilanċjar tat-tagħbija taż-żona lokali, eċċ.
- API tal-Ġestjoni tal-Konfigurazzjoni: l-envoy jipprovdi API robusta għall-ġestjoni dinamika tal-konfigurazzjoni tiegħek.
- Osservabilità: Osservabbiltà profonda tat-traffiku L7, appoġġ nattiv għal traċċar distribwit u osservabilità ta 'mongodb, dynamodb u ħafna applikazzjonijiet oħra.
Pass 1 — Eżempju NGINX Config
Din l-iskrittura tuża fajl magħmul apposta nginx.conf, ibbażat fuq l-eżempju sħiħ minn
konfigurazzjoni tas-sors nginx
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;
}
}
}
Il-konfigurazzjonijiet NGINX tipikament għandhom tliet elementi ewlenin:
- Konfigurazzjoni ta 'server NGINX, struttura ta' log u funzjonalità Gzip. Dan huwa definit globalment fil-każijiet kollha.
- Konfigurazzjoni ta' NGINX biex jaċċetta talbiet lill-host one.eżempju.com fuq il-port 8080.
- Twaqqif tal-post fil-mira, kif timmaniġġja t-traffiku għal partijiet differenti tal-URL.
Mhux il-konfigurazzjoni kollha se tapplika għal Envoy Proxy, u m'għandekx bżonn tikkonfigura xi settings. Mibgħut Prokura għandu erba tipi ewlenin, li jappoġġjaw l-infrastruttura ewlenija offruta minn NGINX. Il-qalba hija:
- Is-semmiegħa: Huma jiddeterminaw kif Envoy Proxy jaċċetta talbiet deħlin. Envoy Proxy bħalissa jappoġġja biss semmiegħa bbażati fuq TCP. Ladarba tiġi stabbilita konnessjoni, din tiġi mgħoddija lil sett ta 'filtri għall-ipproċessar.
- Filtri: Huma parti minn arkitettura tal-pipeline li tista 'tipproċessa data li tidħol u ħierġa. Din il-funzjonalità tinkludi filtri bħal Gzip, li jikkompressa d-dejta qabel ma tibgħatha lill-klijent.
- Routers: Huma jgħaddu t-traffiku lejn id-destinazzjoni meħtieġa, definita bħala cluster.
- Clusters: Huma jiddefinixxu l-endpoint għat-traffiku u l-parametri tal-konfigurazzjoni.
Aħna se nużaw dawn l-erba 'komponenti biex noħolqu konfigurazzjoni Envoy Proxy biex taqbel ma' konfigurazzjoni speċifika NGINX. L-għan ta 'Envoy huwa li jaħdem ma' APIs u konfigurazzjoni dinamika. F'dan il-każ, il-konfigurazzjoni bażi se tuża settings statiċi u kkodifikati iebes minn NGINX.
Pass 2 - Konfigurazzjoni NGINX
L-ewwel parti nginx.conf jiddefinixxi xi NGINX interni li jeħtieġ li jiġu kkonfigurati.
Konnessjonijiet tal-Ħaddiema
Il-konfigurazzjoni ta' hawn taħt tiddetermina n-numru ta' proċessi u konnessjonijiet tal-ħaddiema. Dan jindika kif NGINX se tiskala biex tissodisfa d-domanda.
worker_processes 2;
events {
worker_connections 2000;
}
Envoy Proxy jimmaniġġja l-flussi tax-xogħol u l-konnessjonijiet b'modi differenti.
L-envoy joħloq ħajt tal-ħaddiem għal kull ħajt tal-ħardwer fis-sistema. Kull ħajta tal-ħaddiem tesegwixxi ċirku ta 'avveniment li ma jimblokkax li huwa responsabbli għalih
- Nisimgħu lil kull semmiegħ
- Jaċċettaw konnessjonijiet ġodda
- Il-ħolqien ta' sett ta' filtri għal konnessjoni
- Ipproċessa l-operazzjonijiet I/O kollha matul il-ħajja tal-konnessjoni.
L-ipproċessar tal-konnessjoni ulterjuri kollu jiġi mmaniġġjat kollu kemm hu fil-ħajt tal-ħaddiem, inkluż kwalunkwe imġieba ta 'trażmissjoni.
Għal kull ħajta tal-ħaddiem f'Envoy, hemm pool ta' konnessjoni. Allura pools ta 'konnessjoni HTTP/2 jistabbilixxu biss konnessjoni waħda għal kull host estern kull darba, jekk ikun hemm erba' ħjut tal-ħaddiema se jkun hemm erba 'konnessjonijiet HTTP/2 għal kull host estern fi stat stabbli. Billi żżomm kollox f'ħajt wieħed tal-ħaddiem, kważi l-kodiċi kollu jista 'jinkiteb mingħajr imblukkar, bħallikieku kien ħajt wieħed. Jekk jiġu allokati aktar ħjut tal-ħaddiema milli meħtieġ, dan jista 'jwassal għal memorja moħlija, li toħloq numru kbir ta' konnessjonijiet inattivi, u tnaqqas in-numru ta 'drabi li l-konnessjonijiet jiġu rritornati lura lill-pool.
Għal aktar informazzjoni żur
Konfigurazzjoni HTTP
Il-blokk tal-konfigurazzjoni NGINX li ġej jiddefinixxi settings HTTP bħal:
- Liema tipi mime huma appoġġjati
- Timeouts Default
- Konfigurazzjoni Gzip
Tista' tippersonalizza dawn l-aspetti billi tuża filtri f'Envoy Proxy, li ser niddiskutu aktar tard.
Pass 3 - Konfigurazzjoni tas-Server
Fil-blokk tal-konfigurazzjoni HTTP, il-konfigurazzjoni NGINX tispeċifika li tisma' fuq il-port 8080 u tirrispondi għal talbiet deħlin għal dominji one.eżempju.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Ġewwa l-Envoy, huwa kkontrollat mis-Semmiegħa.
Mibgħut semmiegħa
L-aktar aspett importanti biex tibda b'Envoy Proxy huwa li tiddefinixxi s-semmiegħa tiegħek. Trid toħloq fajl ta' konfigurazzjoni li jiddeskrivi kif trid tħaddem l-istanza Envoy.
Is-snippet hawn taħt se joħloq semmiegħ ġdid u jorbot mal-port 8080. Il-konfigurazzjoni tgħid lil Envoy Proxy liema portijiet għandha torbot għal talbiet deħlin.
Envoy Proxy juża notazzjoni YAML għall-konfigurazzjoni tiegħu. Għal introduzzjoni għal din in-notazzjoni, ara hawn
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
M'hemmx għalfejn tiddefinixxi server_name, peress li l-filtri tal-Prokura tal-Envoy se jimmaniġġjaw dan.
Pass 4 - Konfigurazzjoni tal-Post
Meta talba tidħol f'NGINX, il-blokka tal-lokazzjoni tiddetermina kif tipproċessa u fejn għandha rotta t-traffiku. Fil-framment li ġej, it-traffiku kollu lejn is-sit jiġi trasferit għal cluster upstream (nota tat-traduttur: upstream normalment ikun server ta' applikazzjoni) imsejjaħ targetCluster. Il-cluster upstream jiddefinixxi n-nodi li għandhom jipproċessaw it-talba. Aħna ser niddiskutu dan fil-pass li jmiss.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Fl-Envoy, Filters jagħmel dan.
Filtri tal-Mibgħut
Għal konfigurazzjoni statika, il-filtri jiddeterminaw kif jipproċessaw it-talbiet deħlin. F'dan il-każ aħna nissettjaw filtri li jaqblu ismijiet_server fil-pass preċedenti. Meta jaslu talbiet deħlin li jaqblu ma 'ċerti oqsma u rotot, it-traffiku jiġi mgħoddi lejn il-cluster. Dan huwa l-ekwivalenti ta 'konfigurazzjoni minn isfel għal fuq 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.router
isem mibgħut.http_connection_manager huwa filtru mibni fl-Envoy Proxy. Filtri oħra jinkludu Ddistribwit mill-, mongo, TCP. Tista' ssib il-lista kompleta fuq
Għal aktar informazzjoni dwar politiki oħra tal-ibbilanċjar tat-tagħbija, żur
Pass 5 - Proxy u Konfigurazzjoni Upstream
F'NGINX, il-konfigurazzjoni upstream tiddefinixxi sett ta 'servers fil-mira li se jipproċessaw it-traffiku. F'dan il-każ, ġew assenjati żewġ gruppi.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
F'Envoy, dan huwa ġestit minn clusters.
Mibgħuta Clusters
L-ekwivalenti upstream huwa definit bħala clusters. F'dan il-każ, ġew identifikati l-hosts li se jservu t-traffiku. Il-mod kif jiġu aċċessati l-hosts, bħal timeouts, huwa definit bħala konfigurazzjoni tal-cluster. Dan jippermetti aktar kontroll granulari fuq aspetti bħal latency u l-ibbilanċjar tat-tagħbija.
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 }}
]
Meta tuża l-iskoperta tas-servizz STRICT_DNS L-Envoy se jsolvi kontinwament u b'mod asinkroniku l-miri DNS speċifikati. Kull indirizz IP ritornat mir-riżultat tad-DNS se jitqies bħala host espliċitu fil-cluster upstream. Dan ifisser li jekk talba tirritorna żewġ indirizzi IP, Envoy jassumi li hemm żewġ hosts fil-cluster, u t-tnejn għandhom ikunu bilanċjati tat-tagħbija. Jekk host jitneħħa mir-riżultat, Envoy jassumi li m'għadux jeżisti u jiġbed it-traffiku minn kwalunkwe pool ta' konnessjoni eżistenti.
Għal aktar informazzjoni ara
Pass 6 — Log Aċċess u Żbalji
Il-konfigurazzjoni finali hija r-reġistrazzjoni. Minflok ma jimbotta zkuk tal-iżbalji fuq disk, Envoy Proxy jieħu approċċ ibbażat fuq il-cloud. Ir-reġistri tal-applikazzjoni kollha huma output għal stdout и stderr.
Meta l-utenti jagħmlu talba, ir-reġistri tal-aċċess huma fakultattivi u diżattivati awtomatikament. Biex tippermetti r-reġistri tal-aċċess għal talbiet HTTP, ippermetti l-konfigurazzjoni access_log għall-maniġer tal-konnessjoni HTTP. Il-mogħdija tista 'tkun jew mezz bħal stdout, jew fajl fuq disk, skont ir-rekwiżiti tiegħek.
Il-konfigurazzjoni li ġejja se terġa 'tidderieġi l-logs ta' aċċess kollha lejn stdout (Nota tat-traduttur - stdout huwa meħtieġ li juża envoy ġewwa docker. Jekk jintuża mingħajr docker, imbagħad ibdel /dev/stdout bil-mogħdija għal log file regolari). Ikkopja s-snippet fit-taqsima tal-konfigurazzjoni għall-maniġer tal-konnessjoni:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Ir-riżultati għandhom jidhru bħal dan:
- 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:
B'mod awtomatiku, Envoy għandu string format li jinkludi d-dettalji tat-talba 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
Ir-riżultat ta' din is-sekwenza tal-format huwa:
[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"
Il-kontenut tal-output jista 'jiġi personalizzat billi tissettja l-qasam tal-format. Pereżempju:
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"
Il-linja tar-reġistru tista 'wkoll toħroġ f'format JSON billi tistabbilixxi l-qasam json_format. Pereżempju:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Għal aktar informazzjoni dwar il-Metodoloġija tar-Reġistrazzjoni tal-Mibgħut, żur
L-illoggjar mhuwiex l-uniku mod biex tinkiseb għarfien dwar kif taħdem ma 'Envoy Proxy. Għandha kapaċitajiet avvanzati ta 'traċċar u metriċi mibnija fiha. Tista' ssir taf aktar fuq
Pass 7 - Tnedija
Issa emigrajt il-konfigurazzjoni tiegħek minn NGINX għal Envoy Proxy. L-aħħar pass huwa li tniedi istanza ta 'Envoy Proxy biex tittestjaha.
Mexxi bħala utent
Fil-quċċata tal-linja tal-konfigurazzjoni NGINX utent www www; jispeċifika li jħaddem NGINX bħala utent bi privileġġ baxx biex ittejjeb is-sigurtà.
Envoy Proxy jieħu approċċ ibbażat fuq il-cloud għall-ġestjoni ta' min għandu proċess. Meta nħaddmu Envoy Proxy permezz ta' kontenitur, nistgħu nispeċifikaw utent b'privileġġ baxx.
Tnedija tal-Mibgħut Proxy
Il-kmand hawn taħt se jmexxi Envoy Proxy permezz ta 'kontenitur Docker fuq l-ospitant. Dan il-kmand jagħti lil Envoy l-abbiltà li jisma 'għal talbiet deħlin fuq il-port 80. Madankollu, kif speċifikat fil-konfigurazzjoni tas-semmiegħ, Envoy Proxy jisma' għat-traffiku li jkun dieħel fuq il-port 8080. Dan jippermetti li l-proċess jaħdem bħala utent bi privileġġ baxx.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Ittestjar
Bil-prokura għaddejja, it-testijiet issa jistgħu jsiru u jiġu pproċessati. Il-kmand cURL li ġej joħroġ talba bl-header tal-host definit fil-konfigurazzjoni tal-prokura.
curl -H "Host: one.example.com" localhost -i
It-talba HTTP se tirriżulta fi żball 503. Dan għaliex il-konnessjonijiet upstream mhumiex qed jaħdmu u mhumiex disponibbli. Għalhekk, Envoy Proxy m'għandu l-ebda destinazzjoni disponibbli għat-talba. Il-kmand li ġej se jibda serje ta 'servizzi HTTP li jaqblu mal-konfigurazzjoni definita għall-Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Bis-servizzi disponibbli, l-Envoy jista’ jipprokura b’suċċess it-traffiku lejn id-destinazzjoni tiegħu.
curl -H "Host: one.example.com" localhost -i
Għandek tara tweġiba li tindika liema kontenitur Docker ipproċessa t-talba. Fir-reġistri tal-Prokura tal-Mibgħut għandek tara wkoll output ta' string ta' aċċess.
Headers ta' Rispons HTTP Addizzjonali
Se tara headers HTTP addizzjonali fl-intestaturi tar-rispons tat-talba attwali. L-intestatura turi l-ħin li l-host upstream qatta' jipproċessa t-talba. Espress f'millisekondi. Dan huwa utli jekk il-klijent irid jiddetermina l-ħin tas-servizz meta mqabbel mal-latency tan-netwerk.
x-envoy-upstream-service-time: 0
server: envoy
Konfigurazzjoni finali
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 }
Informazzjoni addizzjonali mit-traduttur
L-istruzzjonijiet għall-installazzjoni ta' Envoy Proxy jistgħu jinstabu fuq il-websajt
B'mod awtomatiku, rpm m'għandux konfigurazzjoni tas-servizz systemd.
Żid systemd service config /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
Ikollok bżonn toħloq direttorju /etc/envoy/ u tpoġġi l-konfigurazzjoni config.yaml hemmhekk.
Hemm chat tat-telegramma bl-użu tal-prokura tal-mibgħut:
Envoy Proxy ma jappoġġjax li jservi kontenut statiku. Għalhekk, min jista' jivvota għall-karatteristika:
Utenti reġistrati biss jistgħu jipparteċipaw fl-istħarriġ.
Din il-kariga ħeġġiġkom biex tinstalla u tittestja proxy tal-envoy?
-
iva
-
ebda
Ivvutaw 75 utent. 18 utenti astjenew.
Sors: www.habr.com