Tere, Habr! Pakun teie tÀhelepanu postituse tÔlget: .
Envoy on kĂ”rge jĂ”udlusega jaotatud vaheserver (kirjutatud C++ keeles), mis on mĂ”eldud ĂŒksikutele teenustele ja rakendustele. Samuti on see suhtlusbus ja "universaalne andmeplaan", mis on vĂ€lja töötatud suurte mikroteenuste arhitektuuride "teenuste vĂ”rgustik" jaoks. Selle loomisel arvestati probleemide lahendustega, mis tekkisid selliste serverite, nagu NGINX, HAProxy, riistvaraline koormuse tasakaalustajad ja pilve koormuse tasakaalustajad, arendamisel. Envoy töötab iga rakendusega ja abstraktiseerib vĂ”rgu, pakkudes ĂŒldiseid funktsioone sĂ”ltumata platvormist. Kui kogu teenustrafik infrastruktuuris liigub lĂ€bi Envoy vĂ”rgustiku, on lihtne visualiseerida probleemseid valdkondi, kasutades ĂŒhtset jĂ€lgimist, kohandades ĂŒldist jĂ”udlust ja lisades pĂ”hifunktsioone kindlatesse kohtadesse.
VÔimalused
- ProtsessivÀline arhitektuur: envoy on iseseisev, kÔrge jÔudlusega server, mis kasutab vÀhe mÀlu. Ta toimib koos mis tahes rakenduse keele vÔi raamistikuga.
- http/2 ja grpc tugi: envoy pakub esmaklassilist tugi http/2 ja grpc sissetulevatele ja vĂ€ljuvatele ĂŒhendustele. See on lĂ€bipaistev proksy http/1.1-st http/2-le.
- TÀpsem koormuse jaotamine: envoy toetab laiaulatuslikke koormuse jaotamise funktsioone, sealhulgas automaatseid katseid, ahela katkestamist, globaalset kiiruspiirangut, pÀringute varjestamist, kohalikku koormuse jaotamist tsoonis jne.
- API konfiguratsiooni haldamiseks: envoy pakub usaldusvÀÀrset API-d oma konfiguratsiooni dĂŒnaamiliseks haldamiseks.
- KĂ€ivitatavus: sĂŒgav L7 liikluse jĂ€lgimine, sisseehitatud tugi jaotatud jĂ€lgimiseks ning jĂ€lgimiseks mongodb, dynamodb ja paljude teiste rakenduste jaoks.
Sammas 1 â NGINX konfi nĂ€idis
Selles stsenaariumis kasutatakse spetsiaalselt loodud faili nginx.conf, mis pÔhineb tÀielikul nÀitel . Saate konfiguratsiooni vaadata redigeerijas, avades nginx.conf
Algne nginx konfi
kasutaja 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-i konfiguratsioonid koosnevad tavaliselt kolmest pÔhielemendist:
- NGINX-i serveri seadistus, logifailide struktuur ja Gzip funktsionaalsus. See mÀÀratakse globaalsetes sÀtetes.
- NGINX-i seadistamine pÀringute vastuvÔtmiseks hostil one.example.com porti 8080.
- Sihtkoha seadistamine, kuidas suunata liiklust erinevates URL-i osades.
Mitte kÔik konfiguratsioonid ei rakendu Envoy Proxy-le, ja teil ei ole vaja mÔningaid parameetreid seadistada. Envoy Proxy-l on neli pÔhiliiki, mis toetavad NGINX-i pakutavat pÔhi infrastruktuuri. Tuum on:
- Kuulajad: Need to define how Envoy Proxy handles incoming requests. Currently, Envoy Proxy supports only TCP-based listeners. Once a connection is established, it is passed to a set of filters for processing.
- Filtrid: Need to be part of a pipeline architecture that can handle incoming and outgoing data. This functionality includes filters such as Gzip, which compresses data before sending it to the client.
- Marshieldid: Need to redirect traffic to the required destination defined as a cluster.
- Klastrid: Need to define the endpoint for traffic and configuration parameters.
We will use these four components to create an Envoy Proxy configuration that matches a specific NGINX configuration. The goal of Envoy is to work with APIs and dynamic configuration. In this case, the basic configuration will use static, hard-coded parameters from NGINX.
Step 2 â NGINX Configuration
Esimene osa nginx.conf defines some internal components of NGINX that need to be configured.
Worker Connections
Allpoolige allpool oleval konfiguratsioonil mÀÀratakse tööprotsesside ja ĂŒhenduste arv. See nĂ€itab, kuidas NGINX kohandub nĂ”udlusele vastamiseks.
worker_processes 2;
events {
worker_connections 2000;
}Envoy Proxy haldab tööprotsesse ja ĂŒhendusi erinevalt.
Envoy loob iga sĂŒsteemi fĂŒĂŒsilise lĂ”ime jaoks ĂŒhe töövoo. Iga töövoog kĂ€ivitab mittesĂŒnkroonse sĂŒndmuste tsĂŒkli, mis vastutab
- Iga kuulaja (listener) jÀlgimine
- Uute ĂŒhenduste vastuvĂ”tmine
- Filtrite komplekti loomine ĂŒhenduste jaoks
- KĂ”ik sisendi- ja vĂ€ljundioperatsioonid töötleva ĂŒhenduse kogu eksistentsi vĂ€ltel.
Edasine ĂŒhenduse töötlemine toimub tĂ€ielikult töövoos, sealhulgas kĂ”ik suunamiskĂ€itumine.
Iga töövoo kohta Envoy'is on ĂŒhendus basseinist. Seega seadistavad HTTP/2 ĂŒhenduste basseinid ainult ĂŒhe ĂŒhenduse iga vĂ€list hosti jaoks korraga, seega neli töövoogu tĂ€hendavad, et iga vĂ€list hosti jaoks on nelja HTTP/2 ĂŒhenduse olemasolu stabiilses olekus. Hoides kĂ”ik ĂŒhes töövoos, saab peaaegu kogu koodi kirjutada blokeerimiseta, nagu see oleks ĂŒhetöövoogne. Kui töövooge on eraldatud rohkem kui vajalik, vĂ”ib see viia ebaefektiivse mĂ€lukasutuse, rohkete ooteĂŒhenduste tekkimiseni ja ĂŒhenduste tagastamise vĂ€henemiseni basseini.
KĂŒlastage lisainformatsiooni saamiseks .
HTTP konfiguratsioon
JÀrgmine NGINX konfiguratsiooni plokk mÀÀratleb HTTP seadistused, nagu:
- Millised mime tĂŒĂŒbid on toetatud
- Vaikeaegumised
- Gzip konfiguratsioon
Saate neid aspekte seadistada Envoy Proxy filtritega, mida arutame hiljem.
Samm 3 â Serveri konfiguratsioon
HTTP konfigureerimise plokis mÀÀrab NGINX, et see kuulab porti 8080 ja vastab sissetulevatele pÀringutele domeenide jaoks one.example.com ja www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;Envoy sĂŒsteemis hallatakse seda kuuldava kaudu.
Envoy kuuldavad
Envoy Proxy kasutamise ĂŒks tĂ€htsamaid aspekte on kuuldavate mÀÀramine. Peate looma konfiguratsioonifaili, mis kirjeldab, kuidas soovite kĂ€ivitada Envoy eksemplari.
AlljÀrgnev fragment loob uue kuuldava ja seob selle pordiga 8080. Konfiguratsioon juhib Envoy Proxy-d, millistele portidele ta peab olema seotud sisenevate pÀringute jaoks.
Envoy Proxy kasutab oma konfiguratsioonis YAML sĂŒntaksit. Selle sĂŒntaksiga tutvumiseks vaadake siit .
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }Ei ole vaja mÀÀrata server_name, kuna Envoy Proxy filtrid saavad sellega hakkama.
Samm 4 â Asukoha konfiguratsioon
Kui pĂ€ring jĂ”uab NGINX-i, mÀÀrab asukohablokk, kuidas liiklust töödelda ja kuhu suunata. JĂ€rgmises fragmendis saadetakse kogu liiklus saidile upstream (tĂ”lkija mĂ€rkus: upstream â tavaliselt rakenduste serverid) klastrisse nimega targetCluster. Upstream klaster mÀÀratleb sĂ”lmed, mis peavad pĂ€ringu töötlema. KĂ€sitleme seda jĂ€rgmises sammus.
asukoht / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}Envoy's Filters handle this.
Envoy Filters
Filtrid mÀÀravad, kuidas staatilise konfiguratsiooni korral sisenevaid pÀringuid töödelda. Antud juhul seadistame filtrid, mis vastavad server_names eelnevale sammule. Kui sisenevad pÀringud vastavad teatud domeenidele ja marsruutidele, suunatakse liiklus klastrisse. See on vastavuses NGINX-i tÔusva konfiguratsiooniga.
Kopeeri redaktorisse 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.routerNimi envoy.http_connection_manager on Envoy Proxy sisseehitatud filter. Muud filtrid sisaldavad Redis, Mongo, TCP. TĂ€ieliku nimekirja leiate .
TĂ€iendava teabe saamiseks teiste koormuse tasakaalustamise poliitikate kohta kĂŒlastage .
Samm 5 â Proxide ja Ălesvoolu Konfiguratsioon
NGINX-i konfisuratsioonis mÀÀratleb upstream sihtserverite kogumi, mis haldab liiklust. Sel juhul on mÀÀratud kaks klastrit.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}Envoy-s haldab seda klastrid.
Envoy klastrid
Upstreami ekvivalent mÀÀratletakse klastritena. Sel juhul on mÀÀratud hostid, mis haldavad liiklust. Hostide ligipÀÀsu viis, nÀiteks ooteaeg, mÀÀratletakse klastrikona konfiguratsioonina. See vÔimaldab tÀpsemalt kontrollida selliste aspektide, nagu ooteaeg ja koormuse jaotus, tÀpsust.
Kopeeri redaktorisse klastrid:
- 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 }}
]Teenuse avastamisel STRICT_DNS Envoy lahendab pidevalt ja asĂŒnkroonselt mÀÀratud DNS-i sihte. Iga DNS-i pĂ€ringu tulemusena tagastatud IP-aadress loetakse ĂŒlesandes klastris selgeks hostiks. See tĂ€hendab, et kui pĂ€ring tagastab kaks IP-aadressi, eeldab Envoy, et klastris on kaks hosti, ja mĂ”lemad tuleks koormuse tasakaalustamiseks arvesse vĂ”tta. Kui host eemaldatakse tulemustest, eeldab Envoy, et see enam ei eksisteeri, ja suunab liiklust vĂ€lja olemasolevate ĂŒhenduste basseinidest.
Lisainformatsiooni saamiseks vaata. .
Samm 6 â Logide ja vigade juurde pÀÀsemine.
LĂ”plik seadistus â logimine. Selle asemel, et saata vealogid kettale, kasutab Envoy Proxy pilvepĂ”hist lĂ€henemist. KĂ”ik rakenduse logid suunatakse. stdout ja stderr.
Kui kasutajad teevad pĂ€ringu, on juurdepÀÀsulogid valikulised ja vaikimisi keelatud. HTTP-pĂ€ringute juurdepÀÀsulogide lubamiseks aktiveeri seadistus. access_log HTTP ĂŒhenduste haldurile. Teekond vĂ”ib olla kas seade, nagu. stdout, vĂ”i fail kettal, sĂ”ltuvalt teie nĂ”uetest.
JĂ€rgmine konfiguratsioon suunab kĂ”ik juurdepÀÀsu logid stdout (tĂ”lkija mĂ€rkus â stdout on vajalik envoy kasutamiseks dockeris. Kui kasutada ilma dockerita, asendage /dev/stdout tavapĂ€rase logifaili teega). Koo see fragment ĂŒhenduste halduri konfiguratsiooni sektsiooni:
Kopeeri lÔikelaualeaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"Tulemused peaksid vÀlja nÀgema jÀrgmised:
- 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:Vaikimisi sisaldab Envoy formaadiread, mis sisaldavad HTTP pÀringu detaile:
[%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%"nSelle formaadirea tulemus:
[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"VÀljundi sisu saab kohandada, seades formaadi vÀlja. NÀiteks:
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"Logi rida saab salvestada ka JSON formaadis, kui seadistate vÀlja json_format. NÀiteks:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}Lisainformatsiooni sÔltumatu registreerimise meetodi kohta leiate siit
Logimine ei ole ainus viis saada ĂŒlevaade Envoy Proxy toimimisest. Sellel on sisseehitatud edasijĂ”udnud jĂ€lgimise ja mÔÔdikute vĂ”imalused. Lisainfot leiate vĂ”i lĂ€bi .
Samm 7 â KĂ€ivitamine
NĂŒĂŒd olete konfigureerimise NGINX-ilt Envoy Proxy-le ĂŒle viinud. Viimane samm on kĂ€ivitada Envoy Proxy eksemplar testimiseks.
KĂ€ivitamine kasutajana
NGINX-i konfiguratsiooni ĂŒlaosas rida user www www; nĂ€itab NGINX-i kĂ€itamise madala privileegiga kasutajana, et suurendada turvalisust.
Envoy Proxy kasutab pilvepÔhist lÀhenemist haldamiseks, kes on protsessi omanik. Kui kÀivitame Envoy Proxy konteineri kaudu, saame mÀÀrata madala privileegiga kasutaja.
Envoy Proxy kÀivitamine
Allpool kÀivitab Envoy Proxy Docker-konteineris hostis. See kÀsk vÔimaldab Envoy'l kuulata sissetulevaid pÀringuid porti 80 kaudu. Siiski, nagu on mÀrgitud kuulaja konfiguratsioonis, kuulab Envoy Proxy sissetulevat liiklust lÀbi pordi 8080. See vÔimaldab protsessil töötada madala privileegiga kasutajana.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoyTestimine
KÀideldud proxy'ga saab teste teha ja töödelda. JÀrgmine cURL kÀsk saadab pÀringu, mille hosti pealkiri on mÀÀratud proxy konfiguratsioonis.
curl -H "Host: one.example.com" localhost -iHTTP pĂ€ring toob kaasa vea 503. See on tingitud sellest, et tagasivoolu ĂŒhendused ei tööta ja need ei ole saadaval. Seega ei ole Envoy Proxy'l pĂ€ringu jaoks saadaolevaid sihtkohti. JĂ€rgmine kĂ€sk kĂ€ivitab rea HTTP teenuseid, mis vastavad Envoy'ile mÀÀratud konfiguratsioonile.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;Saadaolevate teenustega suudab Envoy edukalt proksida liiklust sihtkohta.
curl -H "Host: one.example.com" localhost -iTe peaksite nÀgema vastust, mis nÀitab, milline Docker- konteiner töötles pÀringu. Envoy Proxy logides peaksite samuti nÀgema vÀljundrida.
Lisapealkirjad HTTP vastuses
Kehtiva pĂ€ringu vastuse pealkirjades nĂ€ete lisandusid HTTP pealkirju. Pealkirjas kuvatakse aeg, mis kulus ĂŒlemise hosti pĂ€ringu töötlemiseks. See on vĂ€ljendatud millisekundites. See on kasulik, kui klient soovib mÀÀrata teenindusaega vĂ”rreldes vĂ”rgu viivitusega.
x-envoy-upstream-service-time: 0
server: envoyLÔppkonfiguratsioon
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 }TÔlkija lisainfo
Envoy Proxy paigaldusjuhised leiate veebisaidilt
Vaikeselt ei sisalda rpm systemd teenuse konfi.
Lisage systemd teenuse konfi /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.targetPeate looma kausta /etc/envoy/ ja panema sinna config.yaml faili.
Envoy proxy kohta on olemas Telegrami vestlus:
Envoy Proxy ei toeta staatilise sisu jagamist. SeetĂ”ttu palun hÀÀletage selle funktsiooni ĂŒle.
Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Kas see postitus innustas teid Envoy Proxy seadistama ja katsetama?
jah
ei
75 kasutajat hÀÀletasid. 18 kasutajat jÀid erapooletuks.
Allikas: habr.com
