Hei, Habr! Tuon huomionne käännöksen viestistä:
Envoy on korkean suorituskyvyn hajautettu välityspalvelin (kirjoitettu C++-kielellä), joka on suunniteltu yksittäisiin palveluihin ja sovelluksiin, se on myös tietoliikenneväylä ja "yleinen tietotaso", joka on suunniteltu suuriin mikropalveluiden "service mesh" -arkkitehtuureihin. Sitä luotaessa otettiin huomioon ratkaisut ongelmiin, jotka syntyivät palvelinten, kuten NGINX, HAProxy, hardware load balancers ja pilvi kuormantasaajat, kehitystyössä. Envoy toimii jokaisen sovelluksen rinnalla ja tiivistää verkon tarjotakseen yhteisiä toimintoja alustasta riippumatta. Kun infrastruktuurin kaikki palveluliikenne kulkee Envoy-verkon läpi, ongelma-alueiden visualisointi on helppoa tasaisen havaittavissa, virittää yleistä suorituskykyä ja lisätä ydintoimintoja tietyssä paikassa.
Kyvyt
- Prosessin ulkopuolinen arkkitehtuuri: Envoy on itsenäinen, suorituskykyinen palvelin, joka vie pienen määrän RAM-muistia. Se toimii yhdessä minkä tahansa sovelluskielen tai -kehyksen kanssa.
- http/2- ja grpc-tuki: Envoylla on ensiluokkainen http/2- ja grpc-tuki saapuville ja lähteville yhteyksille. Tämä on läpinäkyvä välityspalvelin välillä http/1.1 - http/2.
- Kehittynyt kuormantasaus: Envoy tukee edistyneitä kuorman tasausominaisuuksia, kuten automaattisia uudelleenyrityksiä, ketjun katkaisua, yleistä nopeuden rajoitusta, pyyntöjen varjostusta, paikallisen vyöhykkeen kuormituksen tasapainotusta jne.
- Configuration Management API: envoy tarjoaa vankan API:n konfiguraatioidesi dynaamiseen hallintaan.
- Havaittavuus: L7-liikenteen syvä havaittavuus, hajautetun jäljityksen natiivi tuki ja mongodb-, dynamodb- ja monien muiden sovellusten havaittavuus.
Vaihe 1 — Esimerkki NGINX Config
Tämä komentosarja käyttää erityisesti muotoiltua tiedostoa nginx.conf, perustuu täydelliseen esimerkkiin osoitteesta
nginx-lähdemääritys
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;
}
}
}
NGINX-kokoonpanoissa on yleensä kolme avainelementtiä:
- NGINX-palvelimen, lokirakenteen ja Gzip-toimintojen määrittäminen. Tämä määritellään kaikissa tapauksissa globaalisti.
- NGINX:n määrittäminen hyväksymään pyynnöt isännälle one.example.com portissa 8080.
- Kohdepaikan määrittäminen, kuinka käsitellä URL-osoitteen eri osien liikennettä.
Kaikki asetukset eivät koske Envoy Proxya, eikä sinun tarvitse määrittää joitain asetuksia. Envoy Proxylla on neljä avaintyyppiä, jotka tukevat NGINX:n tarjoamaa ydininfrastruktuuria. Ydin on:
- Kuuntelijat: He määrittävät, kuinka Envoy Proxy hyväksyy saapuvat pyynnöt. Envoy Proxy tukee tällä hetkellä vain TCP-pohjaisia kuuntelijoita. Kun yhteys on muodostettu, se välitetään suodattimille käsittelyä varten.
- Suodattimet: Ne ovat osa putkiarkkitehtuuria, joka voi käsitellä saapuvia ja lähteviä tietoja. Tämä toiminto sisältää suodattimia, kuten Gzip, joka pakkaa tiedot ennen lähettämistä asiakkaalle.
- Reitittimet: Ne välittävät liikenteen vaadittuun määränpäähän, joka määritellään klusteriksi.
- Klusterit: Ne määrittelevät päätepisteen liikenne- ja konfigurointiparametreille.
Käytämme näitä neljää komponenttia luodaksemme Envoy Proxy -kokoonpanon, joka vastaa tiettyä NGINX-kokoonpanoa. Envoyn tavoitteena on työskennellä API:iden ja dynaamisen konfiguroinnin kanssa. Tässä tapauksessa peruskokoonpano käyttää staattisia, kovakoodattuja NGINX-asetuksia.
Vaihe 2 - NGINX-määritys
Ensimmäinen osa nginx.conf määrittää joitakin NGINX-sisäosia, jotka on määritettävä.
Työntekijöiden yhteydet
Alla oleva kokoonpano määrittää työntekijäprosessien ja yhteyksien määrän. Tämä osoittaa, kuinka NGINX skaalautuu kysyntään.
worker_processes 2;
events {
worker_connections 2000;
}
Envoy Proxy hallitsee työnkulkuja ja yhteyksiä eri tavoin.
Envoy luo työsäikeen jokaiselle järjestelmän laitteistosäikeelle. Jokainen työsäie suorittaa estävän tapahtumasilmukan, joka on vastuussa
- Kuuntelemalla jokaista kuulijaa
- Uusien yhteyksien hyväksyminen
- Suodatinsarjan luominen yhteyttä varten
- Käsittele kaikki I/O-toiminnot yhteyden elinkaaren aikana.
Kaikki yhteyden jatkokäsittely käsitellään kokonaan työntekijäsäikeessä, mukaan lukien edelleenlähetyskäyttäytyminen.
Jokaiselle Envoyn työntekijäsäikeelle on yhteysvarasto. Joten HTTP/2-yhteyspoolit muodostavat vain yhden yhteyden ulkoista isäntä kohden kerrallaan. Jos työsäikeitä on neljä, HTTP/2-yhteyksiä on neljä vakaassa tilassa olevaa ulkoista isäntäkohtaa. Kun kaikki säilytetään yhdessä työsäikeessä, lähes kaikki koodi voidaan kirjoittaa ilman estoa, ikään kuin se olisi yksisäikeinen. Jos työsäikeitä on varattu enemmän kuin on tarpeen, tämä voi johtaa muistin hukkaan, luo suuren määrän käyttämättömiä yhteyksiä ja vähentää yhteyksien palauttamisen määrää.
Lisätietoja käy osoitteessa
HTTP-määritys
Seuraava NGINX-määrityslohko määrittää HTTP-asetukset, kuten:
- Mitä mime-tyyppejä tuetaan
- Oletusaikakatkaisut
- Gzip-määritykset
Voit mukauttaa näitä ominaisuuksia Envoy Proxyn suodattimilla, joista keskustelemme myöhemmin.
Vaihe 3 - Palvelimen määritykset
HTTP-määrityslohkossa NGINX-kokoonpano määrittää kuuntelemaan porttia 8080 ja vastaamaan saapuviin toimialuepyyntöihin. one.example.com и www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;
Envoyn sisällä sitä hallitsevat Kuuntelijat.
Lähettiläät kuuntelijat
Tärkein näkökohta Envoy Proxyn käytön aloittamisessa on kuuntelijoiden määritteleminen. Sinun on luotava määritystiedosto, joka kuvaa, kuinka haluat suorittaa Envoy-esiintymän.
Alla oleva koodinpätkä luo uuden kuuntelijan ja sitoo sen porttiin 8080. Kokoonpano kertoo Envoy Proxylle, mihin portteihin sen tulee sitoutua saapuvia pyyntöjä varten.
Envoy Proxy käyttää YAML-merkintää kokoonpanossaan. Johdatus tähän merkintään löytyy täältä
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }
Ei tarvitse määritellä palvelimen nimi, koska Envoy Proxy -suodattimet käsittelevät tämän.
Vaihe 4 - Sijainnin määrittäminen
Kun pyyntö tulee NGINX:ään, sijaintilohko määrittää, kuinka liikenne käsitellään ja minne reititetään. Seuraavassa fragmentissa kaikki liikenne sivustolle siirretään ylävirran (kääntäjän huomautus: ylävirta on yleensä sovelluspalvelin) klusteriin nimeltä kohderyhmä. Ylävirran klusteri määrittelee solmut, joiden tulee käsitellä pyyntö. Keskustelemme tästä seuraavassa vaiheessa.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Envoyssa Filters tekee tämän.
lähettilässuodattimet
Staattisessa kokoonpanossa suodattimet määrittävät, kuinka saapuvat pyynnöt käsitellään. Tässä tapauksessa asetamme vastaavat suodattimet palvelimen_nimet edellisessä vaiheessa. Kun saapuvat pyynnöt vastaavat tiettyjä verkkotunnuksia ja reittejä, liikenne reititetään klusteriin. Tämä vastaa NGINX-alhaalta ylös -kokoonpanoa.
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
nimi lähettiläs.http_connection_manager on Envoy Proxyn sisäänrakennettu suodatin. Muita suodattimia ovat mm Redis, Mongo, TCP. Löydät täydellisen luettelon osoitteessa
Lisätietoja muista kuormituksen tasauskäytännöistä on osoitteessa
Vaihe 5 - Välityspalvelimen ja ylävirran määritys
NGINX:ssä ylävirran asetukset määrittelevät joukon kohdepalvelimia, jotka käsittelevät liikennettä. Tässä tapauksessa osoitettiin kaksi klusteria.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}
Envoyssa tätä hallitaan klustereilla.
lähettiläsklusterit
Ylävirran vastine määritellään klustereiksi. Tässä tapauksessa liikennettä palvelevat isännät on tunnistettu. Isäntien käyttötapa, kuten aikakatkaisut, määritellään klusterin kokoonpanoksi. Tämä mahdollistaa tarkemman hallinnan sellaisista näkökohdista kuin latenssi ja kuormituksen tasapainotus.
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 }}
]
Palveluhakua käytettäessä STRICT_DNS Envoy ratkaisee jatkuvasti ja asynkronisesti määritetyt DNS-kohteet. Jokaista DNS-tuloksen palauttamaa IP-osoitetta pidetään eksplisiittisenä isäntänä ylävirran klusterissa. Tämä tarkoittaa, että jos pyyntö palauttaa kaksi IP-osoitetta, Envoy olettaa, että klusterissa on kaksi isäntää, ja molempien on oltava kuormitettuja. Jos isäntä poistetaan tuloksesta, Envoy olettaa, että sitä ei enää ole olemassa ja vetää liikenteen kaikista olemassa olevista yhteyspoolista.
Katso lisätietoja
Vaihe 6 – Kirjaa pääsy ja virheet
Lopullinen konfigurointi on rekisteröinti. Virhelokien levylle työntämisen sijaan Envoy Proxy käyttää pilvipohjaista lähestymistapaa. Kaikki sovelluslokit tulostetaan osoitteeseen stdout и stderr.
Kun käyttäjät tekevät pyynnön, käyttölokit ovat valinnaisia ja oletuksena pois käytöstä. Ota määritys käyttöön ottaaksesi HTTP-pyyntöjen käyttölokit käyttöön access_log HTTP-yhteydenhallintaa varten. Polku voi olla joko laite, kuten stdouttai levyllä oleva tiedosto tarpeidesi mukaan.
Seuraava määritys uudelleenohjaa kaikki käyttölokit kohteeseen stdout (Kääntäjän huomautus - stdout vaaditaan envoy-käyttöön Dockerin sisällä. Jos käytetään ilman dockeria, korvaa /dev/stdout tavallisen lokitiedoston polulla). Kopioi katkelma yhteydenhallinnan määritysosioon:
Copy to Clipboardaccess_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
Tulosten pitäisi näyttää tältä:
- 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:
Envoylla on oletusarvoisesti muotomerkkijono, joka sisältää HTTP-pyynnön tiedot:
[%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
Tämän muotoisen merkkijonon tulos on:
[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"
Tulosteen sisältöä voidaan mukauttaa asettamalla muotokenttä. Esimerkiksi:
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"
Lokirivi voidaan tulostaa myös JSON-muodossa asettamalla kenttä json_format. Esimerkiksi:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}
Lisätietoja lähettiläsrekisteröintimenetelmistä on osoitteessa
Kirjaaminen ei ole ainoa tapa saada tietoa työskentelystä Envoy Proxyn kanssa. Siihen on sisäänrakennettu edistyneitä jäljitys- ja mittausominaisuuksia. Voit tutustua tarkemmin osoitteessa
Vaihe 7 - Käynnistä
Olet nyt siirtänyt kokoonpanosi NGINX:stä Envoy Proxyyn. Viimeinen vaihe on käynnistää Envoy Proxy -esiintymä sen testaamiseksi.
Suorita käyttäjänä
NGINX-määritysrivin yläosassa käyttäjä www www; määrittelee NGINX:n ajavan heikommassa asemassa olevana käyttäjänä turvallisuuden parantamiseksi.
Envoy Proxy käyttää pilvipohjaista lähestymistapaa prosessin hallintaan. Kun käytämme Envoy-välityspalvelinta säilön kautta, voimme määrittää heikommassa asemassa olevan käyttäjän.
Käynnistetään Envoy Proxy
Alla oleva komento suorittaa Envoy Proxy -palvelimen Docker-säilön kautta isännässä. Tämä komento antaa Envoylle mahdollisuuden kuunnella saapuvia pyyntöjä portissa 80. Kuitenkin, kuten kuuntelijan kokoonpanossa on määritetty, Envoy Proxy kuuntelee saapuvaa liikennettä portissa 8080. Tämä mahdollistaa prosessin suorittamisen heikon käyttäjänä.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy
Testaus
Kun välityspalvelin on käynnissä, testejä voidaan nyt tehdä ja käsitellä. Seuraava cURL-komento lähettää pyynnön välityspalvelimen määrityksissä määritetyllä isäntäotsikolla.
curl -H "Host: one.example.com" localhost -i
HTTP-pyyntö aiheuttaa virheen 503. Tämä johtuu siitä, että ylävirran yhteydet eivät toimi eivätkä ole käytettävissä. Siksi Envoy Proxylla ei ole käytettävissä olevia kohteita pyynnölle. Seuraava komento käynnistää sarjan HTTP-palveluita, jotka vastaavat Envoylle määritettyä kokoonpanoa.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;
Saatavilla olevien palvelujen avulla Envoy voi onnistuneesti välittää liikennettä määränpäähänsä.
curl -H "Host: one.example.com" localhost -i
Sinun pitäisi nähdä vastaus, joka osoittaa, mikä Docker-säilö käsitteli pyynnön. Envoy Proxy -lokeissa sinun pitäisi nähdä myös pääsymerkkijono.
Muita HTTP-vastausotsikoita
Näet muita HTTP-otsikoita varsinaisen pyynnön vastausotsikoissa. Otsikko näyttää ajan, jonka ylävirran isäntä käytti pyynnön käsittelyyn. Ilmaistu millisekunteina. Tämä on hyödyllistä, jos asiakas haluaa määrittää palveluajan verkon latenssiin verrattuna.
x-envoy-upstream-service-time: 0
server: envoy
Lopullinen konfigurointi
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 }
Lisätiedot kääntäjältä
Ohjeet Envoy Proxyn asentamiseen löytyvät verkkosivulta
Oletusarvoisesti rpm:llä ei ole systemd-palvelukonfiguraatiota.
Lisää 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
Sinun on luotava hakemisto /etc/envoy/ ja asetettava config.yaml config sinne.
Siellä on sähkekeskustelu lähettilään välityspalvelimella:
Envoy Proxy ei tue staattisen sisällön näyttämistä. Joten kuka voi äänestää ominaisuutta:
Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn.
Rohkaisiko tämä viesti sinua asentamaan ja testaamaan lähettivälityspalvelimen?
-
kyllä
-
ei
75 käyttäjää äänesti. 18 käyttäjää pidättyi äänestämästä.
Lähde: will.com