Bonjou, Habr! Mwen pote nan atansyon ou yon tradiksyon pòs la:
Envoy se yon wo-pèfòmans distribiye sèvè prokurasyon (ekri nan C++) ki fèt pou sèvis endividyèl ak aplikasyon, li se tou yon otobis kominikasyon ak "avyon done inivèsèl" ki fèt pou gwo mikwosèvis "may sèvis" achitekti. Lè yo kreye li, solisyon pou pwoblèm ki te parèt pandan devlopman nan serveurs tankou NGINX, HAProxy, balans chaj pyès ki nan konpitè ak balans chaj nwaj yo te pran an kont. Envoy travay ansanm ak chak aplikasyon ak abstrè rezo a bay fonksyonalite komen kèlkeswa platfòm. Lè tout trafik sèvis nan yon enfrastrikti ap koule nan may Envoy la, li vin fasil pou vizyalize zòn pwoblèm yo ak obsèvabilite konsistan, ajiste pèfòmans jeneral, epi ajoute fonksyonalite debaz nan yon kote espesifik.
Kapasite
- Achitekti andeyò pwosesis la: Envoy se yon sèvè endepandan, pèfòmans segondè ki pran yon ti kantite RAM. Li travay ansanm ak nenpòt lang aplikasyon oswa kad.
- http/2 ak sipò grpc: Envoy gen sipò http/2 ak grpc premye klas pou koneksyon fèk ap rantre ak sortan. Sa a se yon prokurasyon transparan soti nan http/1.1 a http/2.
- Balanse chaj avanse: anvwaye sipòte karakteristik balanse chaj avanse ki gen ladan retry otomatik, kraze chèn, limit pousantaj mondyal, lonbraj demann, balanse chaj zòn lokal, elatriye.
- API Jesyon Konfigirasyon: Envoy bay yon API solid pou jere konfigirasyon ou an dinamik.
- Obsèvabilite: Obsèvabilite gwo twou san fon nan trafik L7, sipò natif natal pou trase distribiye ak obsèvabilite nan mongodb, dynamodb ak anpil lòt aplikasyon.
Etap 1 - Egzanp NGINX Config
Script sa a sèvi ak yon fichye espesyalman fabrike nginx.conf, ki baze sou egzanp konplè soti nan
nginx sous konfigirasyon
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;
}
}
}
Konfigirasyon NGINX anjeneral gen twa eleman kle:
- Konfigirasyon sèvè NGINX, estrikti log ak fonksyonalite Gzip. Sa a se defini globalman nan tout ka.
- Konfigirasyon NGINX pou aksepte demann bay lame a youn.egzanp.com sou pò 8080.
- Mete kanpe kote sib la, ki jan yo okipe trafik pou diferan pati nan URL la.
Se pa tout konfigirasyon yo pral aplike nan Envoy Proxy, epi ou pa bezwen konfigirasyon kèk paramèt. Anvwaye Proxy genyen kat kalite kle, ki sipòte enfrastrikti debaz yo ofri nan NGINX. Nwayo a se:
- Moun k ap koute: Yo detèmine kijan Envoy Proxy aksepte demann k ap vini yo. Envoy Proxy kounye a sèlman sipòte oditè ki baze sou TCP. Yon fwa yo etabli yon koneksyon, li pase nan yon seri filtè pou trete.
- Filtè: Yo fè pati yon achitekti tiyo ki ka trete done fèk ap rantre ak sortan. Fonksyonalite sa a gen ladan filtè tankou Gzip, ki konprese done yo anvan yo voye li bay kliyan an.
- Routeurs: Yo voye trafik nan destinasyon ki nesesè yo, ki defini kòm yon gwoup.
- Gwoup: Yo defini pwen final la pou trafik ak paramèt konfigirasyon.
Nou pral sèvi ak kat eleman sa yo pou kreye yon konfigirasyon Envoy Proxy pou matche ak yon konfigirasyon NGINX espesifik. Objektif Envoy se travay avèk API ak konfigirasyon dinamik. Nan ka sa a, konfigirasyon baz la pral sèvi ak paramèt estatik ki kode di NGINX.
Etap 2 - Konfigirasyon NGINX
Pati nan premye nginx.conf defini kèk entèn NGINX ki bezwen konfigirasyon.
Koneksyon travayè yo
Konfigirasyon ki anba a detèmine kantite pwosesis travayè ak koneksyon. Sa a endike ki jan NGINX pral echèl pou satisfè demann.
worker_processes 2;
events {
worker_connections 2000;
}
Envoy Proxy jere workflows ak koneksyon nan diferan fason.
Envoy kreye yon fil travayè pou chak fil pyès ki nan konpitè sou sistèm nan. Chak fil travayè egzekite yon bouk evènman ki pa bloke ki responsab pou
- Koute chak moun k ap koute
- Aksepte nouvo koneksyon
- Kreye yon seri filtè pou yon koneksyon
- Pwosesis tout operasyon I/O pandan tout lavi koneksyon an.
Tout pwosesis koneksyon plis okipe antyèman nan fil travayè a, ki gen ladan nenpòt konpòtman transmisyon.
Pou chak fil travayè nan Envoy, gen yon pisin koneksyon. Se konsa, pisin koneksyon HTTP/2 sèlman etabli yon koneksyon pou chak lame ekstèn nan yon moman, si gen kat fil travayè pral gen kat koneksyon HTTP/2 pou chak lame ekstèn nan yon eta ki estab. Lè w kenbe tout bagay nan yon sèl fil travayè, prèske tout kòd ka ekri san yo pa bloke, tankou si li te yon sèl fil. Si yo resevwa plis fil travayè pase sa nesesè, sa ka mennen nan gaspiye memwa, kreye yon gwo kantite koneksyon san fè anyen konsa, ak diminye kantite koneksyon yo te retounen tounen nan pisin lan.
Pou plis enfòmasyon vizite
HTTP Konfigirasyon
Blòk konfigirasyon NGINX sa a defini paramèt HTTP tankou:
- Ki kalite mim yo sipòte
- Default Timeouts
- Konfigirasyon Gzip
Ou ka Customize aspè sa yo lè l sèvi avèk filtè nan Envoy Proxy, ke nou pral diskite pita.
Etap 3 - Konfigirasyon sèvè
Nan blòk konfigirasyon HTTP, konfigirasyon NGINX la presize pou koute pò 8080 epi reponn a demann fèk ap rantre pou domèn. youn.egzanp.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Anndan Envoy, li kontwole pa moun ki koute.
Anvwaye koute
Aspè ki pi enpòtan nan kòmanse ak Envoy Proxy se defini moun k ap koute w yo. Ou bezwen kreye yon fichye konfigirasyon ki dekri kijan ou vle kouri egzanp Envoy la.
Frag ki anba a pral kreye yon nouvo koute epi mare li nan pò 8080. Konfigirasyon an di Envoy Proxy ki pò li ta dwe mare pou demann fèk ap rantre.
Envoy Proxy itilize notasyon YAML pou konfigirasyon li yo. Pou yon entwodiksyon nan notasyon sa a, gade isit la
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Pa bezwen defini server_name, depi filtè Envoy Proxy pral okipe sa a.
Etap 4 - Konfigirasyon Kote
Lè yon demann vini nan NGINX, blòk kote a detèmine kijan pou trete ak ki kote pou wout trafik la. Nan fragman sa a, tout trafik sou sit la transfere nan yon gwoup en (nòt tradiktè a: en se nòmalman yon sèvè aplikasyon) targetCluster. Gwoup la en defini nœuds ki ta dwe trete demann lan. Nou pral diskite sou sa a nan pwochen etap la.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Nan Envoy, Filtres fè sa.
Envoy Filtè
Pou yon konfigirasyon estatik, filtè detèmine kijan pou trete demann k ap fèk ap rantre yo. Nan ka sa a nou mete filtè ki matche ak server_names nan etap anvan an. Lè demann fèk ap rantre yo rive ki koresponn ak sèten domèn ak wout, trafik yo ap dirije nan gwoup la. Sa a se ekivalan a nan yon konfigirasyon NGINX anba-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
non anvoy.http_connection_manager se yon filtè entegre nan Envoy Proxy. Lòt filtè yo enkli Redis, Mongo, Tchp. Ou ka jwenn lis konplè a nan
Pou plis enfòmasyon sou lòt politik balans chaj, vizite
Etap 5 - Proxy ak Konfigirasyon En
Nan NGINX, konfigirasyon an en defini yon seri sèvè sib ki pral trete trafik. Nan ka sa a, de grap yo te asiyen.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Nan Envoy, sa a se jere pa grap.
Gwoup Anvwaye
Ekivalan a en defini kòm grap. Nan ka sa a, gen tout pouvwa a ki pral sèvi trafik la yo te idantifye. Fason yo jwenn aksè nan lame yo, tankou timeouts, defini kòm yon konfigirasyon gwoup. Sa a pèmèt pou plis kontwòl granulaire sou aspè tankou latansi ak balans chaj.
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 }}
]
Lè w ap itilize dekouvèt sèvis STRICT_DNS Envoy pral kontinyèlman ak asynchrone rezoud objektif DNS espesifye yo. Chak adrès IP retounen nan rezilta DNS yo pral konsidere kòm yon lame eksplisit nan gwoup la en. Sa vle di ke si yon demann retounen de adrès IP, Envoy pral asime ke gen de lame nan gwoup la, epi tou de dwe balanse chaj. Si yo retire yon lame nan rezilta a, Envoy pral sipoze li pa egziste ankò epi li pral rale trafik soti nan nenpòt pisin koneksyon ki egziste deja.
Pou plis enfòmasyon gade
Etap 6 - Log Aksè ak Erè
Konfigirasyon final la se enskripsyon an. Olye pou yo pouse mòso bwa erè sou disk, Envoy Proxy pran yon apwòch ki baze sou nwaj. Tout mòso bwa aplikasyon yo soti nan stdout и stderr.
Lè itilizatè yo fè yon demann, mòso bwa aksè yo opsyonèl epi yo enfim pa default. Pou pèmèt mòso bwa aksè pou demann HTTP, pèmèt konfigirasyon an access_log pou manadjè koneksyon HTTP. Chemen an kapab swa yon aparèy tankou stdout, oswa yon dosye sou disk, tou depann de kondisyon ou yo.
Konfigirasyon sa a pral redireksyon tout mòso bwa aksè yo stdout (Nòt tradiktè a - stdout oblije sèvi ak envoy andedan docker. Si yo itilize san docker, Lè sa a, ranplase /dev/stdout ak chemen an nan yon dosye regilye). Kopi ti bout la nan seksyon konfigirasyon an pou manadjè koneksyon an:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Rezilta yo ta dwe sanble tankou sa a:
- 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:
Pa default, Envoy gen yon seri fòma ki gen ladan detay demann HTTP an:
[%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
Rezilta fisèl fòma sa a se:
[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"
Contenu pèsistans yap ogmante jiska kapab personnalisé pa mete jaden fòma. Pa egzanp:
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"
Liy boutèy la kapab tou pwodiksyon an fòma JSON pa mete jaden an json_format. Pa egzanp:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Pou plis enfòmasyon sou Metodoloji Enskripsyon anvwaye, vizite
Enregistrement se pa sèl fason pou jwenn insight sou travay ak Envoy Proxy. Li gen kapasite avanse trase ak metrik bati nan li. Ou ka jwenn plis enfòmasyon nan
Etap 7 - Lanse
Koulye a, ou te imigre konfigirasyon ou soti nan NGINX nan Envoy Proxy. Dènye etap la se lanse yon egzanp Envoy Proxy pou teste li.
Kouri kòm itilizatè
Nan tèt liy konfigirasyon NGINX la itilizatè www www; presize pou kouri NGINX kòm yon itilizatè ki gen privilèj ki ba pou amelyore sekirite.
Envoy Proxy pran yon apwòch ki baze sou nwaj pou jere moun ki posede yon pwosesis. Lè nou kouri Envoy Proxy atravè yon veso, nou ka presize yon itilizatè ki ba privilèj.
Lanse Envoy Proxy
Kòmand ki anba a pral kouri Envoy Proxy atravè yon veso Docker sou lame a. Kòmandman sa a bay Envoy kapasite pou l koute demann k ap rantre sou pò 80. Sepandan, jan sa espesifye nan konfigirasyon moun k ap koute a, Envoy Proxy koute trafik k ap rantre sou pò 8080. Sa pèmèt pwosesis la kouri kòm yon itilizatè ki pa gen anpil privilèj.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Tès
Ak proxy a ap kouri, tès yo kapab kounye a fèt ak trete. Kòmand sa a cURL bay yon demann ak header lame defini nan konfigirasyon an prokurasyon.
curl -H "Host: one.example.com" localhost -i
Demann HTTP a pral lakòz yon erè 503. Sa a se paske koneksyon en yo pa travay epi yo pa disponib. Se poutèt sa, Envoy Proxy pa gen okenn destinasyon ki disponib pou demann lan. Kòmandman sa a pral kòmanse yon seri sèvis HTTP ki matche ak konfigirasyon an defini pou Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Avèk sèvis ki disponib yo, Envoy ka avèk siksè proxy trafik nan destinasyon li yo.
curl -H "Host: one.example.com" localhost -i
Ou ta dwe wè yon repons ki endike ki veso Docker ki te trete demann lan. Nan mòso bwa yo Envoy Proxy ou ta dwe wè tou yon pwodiksyon fisèl aksè.
Lòt Tèt repons HTTP
Ou pral wè lòt headers HTTP nan repons demann aktyèl la. Tèt la montre tan lame a en te pase pou trete demann lan. Eksprime nan milisgond. Sa a itil si kliyan an vle detèmine tan sèvis konpare ak latansi rezo a.
x-envoy-upstream-service-time: 0
server: envoy
Final konfigirasyon
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 }
Lòt enfòmasyon ki soti nan tradiktè a
Ou ka jwenn enstriksyon pou enstale Envoy Proxy sou sit entènèt la
Pa default, rpm pa gen yon konfigirasyon sèvis systemd.
Ajoute 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
Ou bezwen kreye yon anyè /etc/envoy/ epi mete konfig.yaml la.
Gen yon chat telegram lè l sèvi avèk envoy proxy:
Envoy Proxy pa sipòte sèvi kontni estatik. Se poutèt sa, ki moun ki ka vote pou karakteristik la:
Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la.
Èske pòs sa a ankouraje w enstale ak teste envoy proxy?
-
repons lan se wi
-
нет
75 itilizatè yo te vote. 18 itilizatè te absteni.
Sous: www.habr.com