Ahoj, Habr! Predkladajú vám preklad príspevku: .
Envoy je vysokovýkonný distribuovaný proxy server (naprogramovaný v C++), určený pre jednotlivé služby a aplikácie; je to tiež komunikačná zbernica a „univerzálna dátová rovina“, vyvinutá pre veľké mikroslužobné architektúry „service mesh“. Pri jeho vývoji boli zohľadnené riešenia problémov, ktoré sa objavili pri vytváraní takých serverov, ako sú NGINX, HAProxy, hardvérové vyrovnávače záťaže a cloudové vyrovnávače záťaže. Envoy funguje v súčinnosti s každou aplikáciou a abstrahuje sieť, poskytujúc spoločné funkcie bez ohľadu na platformu. Keď celá prevádzka v infraštruktúre prechádza cez sieť Envoy, je ľahké vizualizovať problémové oblasti pomocou jednotného monitorovania, ladenia celkového výkonu a pridávania kľúčových funkcií na konkrétnych miestach.
Možnosti
- Architektúra mimo procesu: envoy je autonómny, vysokovýkonný server s nízkou spotrebou pamäte. Pracuje spoločne s akýmkoľvek jazykom aplikácie alebo rámcom.
- Podpora http/2 a grpc: envoy má prvotriednu podporu http/2 a grpc pre prichádzajúce a odchádzajúce pripojenia. Je to priehľadný proxy od http/1.1 po http/2.
- Rozšírené vyrovnávanie záťaže: envoy podporuje rozšírené funkcie vyrovnávania záťaže, vrátane automatických pokusov, prerušenia reťazca, globálneho obmedzovania rýchlosti, zatienenia požiadaviek, lokálneho vyrovnávania záťaže v zóne a pod.
- API pre správu konfigurácie: envoy poskytuje spoľahlivé API pre dynamickú správu svojej konfigurácie.
- Monitorovanie: hĺbkové sledovanie L7 prevádzky, vstavaná podpora pre distribučné trasovanie a monitorovanie mongodb, dynamodb a mnohých ďalších aplikácií.
Krok 1 — Príklad konfigurácie NGINX
V tomto scenári sa používa špeciálne vytvorený súbor nginx.conf, založený na úplnom príklade z . Môžete si pozrieť konfiguráciu v editore tak, že ju otvoríte nginx.conf
Pôvodná konfigurácia 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;
}
}
}Konfigurácie NGINX zvyčajne obsahujú tri kľúčové prvky:
- Nastavenia servera NGINX, štruktúry protokolov a funkčnosti Gzip. Tieto sa určujú globálne vo všetkých prípadoch.
- Nastavenie NGINX na prijímanie požiadaviek na hostiteľa one.example.com na porte 8080.
- Nastavenie cieľovej lokality, ako spracovávať prenos pre rôzne časti URL.
Nie všetky konfigurácie sa použijú na Envoy Proxy a niektoré parametre nie je potrebné nastavovať. Envoy Proxy má štyri kľúčové typy, ktoré podporujú základnú infraštruktúru poskytovanú NGINX. Jadro je:
- Poslucháči: Určujú, ako Envoy Proxy prijíma prichádzajúce požiadavky. V súčasnosti Envoy Proxy podporuje iba poslucháčov na báze TCP. Akonáhle je spojenie nadviazané, je prenesené do súboru filtrov na spracovanie.
- Filtre: Sú súčasťou architektúry potrubia, ktorá môže spracovávať prichádzajúce aj odchádzajúce dáta. Táto funkčnosť obsahuje filtre, ako Gzip, ktorý komprimuje dáta pred ich odoslaním klientovi.
- Routery: Presmerovávajú prenos do požadovaného cieľa definovaného ako klaster.
- Klastre: Definujú konečný bod pre prenos a parametre konfigurácie.
Týchto štyroch komponentov použijeme na vytvorenie konfigurácie Envoy Proxy, aby sme vyhoveli špecifikovanej konfigurácii NGINX. Cieľom Envoy je práca s API a dynamická konfigurácia. V tomto prípade základná konfigurácia bude používať statické, pevne stanovené parametre z NGINX.
Krok 2 — Nastavenie NGINX
Prvá časť nginx.conf definuje niektoré interné komponenty NGINX, ktoré musia byť nastavené.
Pracovné pripojenia (Worker Connections)
Nižšie uvedená konfigurácia určuje počet pracovných procesov a pripojení. To ukazuje, ako sa NGINX bude škálovať na uspokojenie dopytu.
worker_processes 2;
events {
worker_connections 2000;
}Envoy Proxy rôzne spravuje pracovné procesy a pripojenia.
Envoy vytvára pracovný prúd pre každý hardvérový prúd v systéme. Každý pracovný prúd vykonáva neblokujúci cyklus udalostí, ktorý zodpovedá za
- Počúvanie každého poslucháča (listener)
- Prijímanie nových pripojení
- Vytváranie súboru filtrov pre pripojenie
- Spracovanie všetkých vstupno-výstupných operácií počas existencie pripojenia.
Celé ďalšie spracovanie pripojenia je úplne spracované v pracovnom prúde, vrátane akéhokoľvek správania presmerovania.
Pre každý pracovný prúd v Envoy existuje pripojenie v poole. Takže, poole pripojení HTTP/2 nastavujú iba jedno pripojenie pre každého vonkajšieho hostiteľa naraz, ak je k dispozícii štyri pracovné prúdy, bude štyri pripojenia HTTP/2 pre každého vonkajšieho hostiteľa v stabilnom stave. Udržiavanie všetkého v jednom pracovnom prúde umožňuje takmer celý kód napísať bez blokovania, akoby bol jednorozmerným. Ak je pridelene viac pracovných prúdov ako je potrebné, môže to viesť k neefektívnemu využívaniu pamäte, vytváraniu veľkého množstva nečinných pripojení a zníženiu počtu návratov pripojenia späť do poolu.
Pre viac informácií navštívte .
Konfigurácia HTTP
Nasledujúci blok konfigurácie NGINX určuje nastavenia HTTP, ako sú:
- Aké mime typy sú podporované
- Predvolené timeouty
- Konfigurácia Gzip
Tieto aspekty môžete nastaviť pomocou filtrov v Envoy Proxy, čo sa neskôr prediskutuje.
Krok 3 — Konfigurácia Server
V bloku konfigurácie HTTP, konfigurácia NGINX určuje, aby počúval port 8080 a odpovedal na prichádzajúce požiadavky pre domény one.example.com a www.one.example.com.
server {
listen 8080;
server_name one.example.com www.one.example.com;Vnútri Envoy to spravujú poslucháči.
Poslucháči Envoy
Najdôležitejší aspekt začatia práce s Envoy Proxy je určiť poslucháčov. Musíte vytvoriť súbor konfigurácie, ktorý popisuje, ako chcete spustiť inštanciu Envoy.
Nasledujúca časť vytvorí nového poslucháča a spojí ho s portom 8080. Konfigurácia určuje, na ktoré porty by sa mal Envoy Proxy viazať pre prichádzajúce požiadavky.
Envoy Proxy používa notáciu YAML pre svoju konfiguráciu. Pre oboznámenie s touto notáciou pozrite sem .
Copy to Editorstatic_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 8080 }Nie je potrebné definovať server_name, pretože filtre Envoy Proxy si s tým poradia.
Krok 4 — Konfigurácia umiestnenia
Keď požiadavka príde do NGINX, blok umiestnenia určuje, ako spracovať a kam smerovať prevádzku. V nasledujúcej časti sa celá prevádzka na stránku odovzdáva do upstream (poznámka prekladateľa: upstream — zvyčajne sérvery aplikácií) klasteru s názvom targetCluster. Upstream klaster určuje uzly, ktoré by mali spracovať požiadavku. O tom budeme diskutovať v ďalšom kroku.
location / {
proxy_pass http://targetCluster/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}V Envoy to zabezpečujú filtre.
Envoy Filters
Pre statickú konfiguráciu filtre určujú, ako spracovávať prichádzajúce požiadavky. V tomto prípade nastavujeme filtre, ktoré zodpovedajú server_names z predchádzajúceho kroku. Keď prichádzajú požiadavky, ktoré zodpovedajú určitým doménam a trasám, traffic je smerovaný do klasteru. To je ekvivalent vzostupnej konfigurácie 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.routerNázov envoy.http_connection_manager je zabudovaný filter v Envoy Proxy. Ďalšie filtre zahŕňajú Kľuč-hodnota, Mongo, TCP. Môžete nájsť úplný zoznam v .
Pre viac informácií o iných politikách vyváženia zaťaženia navštívte .
Krok 5 — Konfigurácia proxy a upstream
V NGINX konfigurácia upstream určuje súbor cieľových serverov, ktoré budú spracovávať prevádzku. V tomto prípade boli priradené dva klastre.
upstream targetCluster {
172.18.0.3:80;
172.18.0.4:80;
}V Envoy to riadia klastre.
Envoy Clusters
Ekvivalent upstream sa definuje ako clustre. V tomto prípade boli určené hostiteľské servery, ktoré budú odbavovať prevádzku. Spôsob prístupu k hostiteľom, napríklad časový limit, sa určuje ako konfigurácia clustra. To umožňuje presnejšie kontrolovať jemnosť takých aspektov, ako sú časový limit a zaťaženie.
Kopírovať do editora clustre:
- názov: cieľovýCluster
connect_timeout: 0.25s
typ: STRICT_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hostitelia: [
{ socket_address: { address: 172.18.0.3, port_value: 80 }},
{ socket_address: { address: 172.18.0.4, port_value: 80 }}
]Pri používaní objavovania služby STRICT_DNS Envoy bude neustále a asynchrónne rozpoznať určené cieľové DNS. Každá vrátená IP adresa v dôsledku DNS bude považovaná za explicitného hostiteľa vo vzostupnom clustri. To znamená, že ak dotaz vráti dve IP adresy, Envoy predpokladá, že v clustre sú dve hostiteľské servery, a oba by mali byť rozložené zaťaženie. Ak je hostiteľ odstránený z výsledku, Envoy predpokladá, že už neexistuje, a bude presmerovávať prevádzku z akýchkoľvek existujúcich spojovacích skupín.
Pre ďalšie informácie pozri. .
Krok 6 - Prístup k logu a chybám
Konečná konfigurácia - registrácia. Namiesto toho, aby sa protokoly chýb odosielali na disk, Envoy Proxy používa cloudový prístup. Všetky protokoly aplikácií sú odosielané do stdout a stderr.
Keď používatelia podajú požiadavku, protokoly prístupu sú voliteľné a predvolene sú vypnuté. Ak chcete aktivovať protokoly prístupu pre HTTP požiadavky, aktivujte konfiguráciu access_log pre správcu pripojení HTTP. Cesta môže byť buď zariadením, ako je stdout, alebo súborom na disku, v závislosti od vašich požiadaviek.
Nasledujúca konfigurácia presmeruje všetky protokoly prístupu do stdout (poznámka prekladateľa - stdout je potrebné na použitie envoy vo vnútri dockeru. Ak sa používa bez dockera, nahraďte /dev/stdout cestou k bežnému logu). Skopírujte úryvok do sekcie konfigurácie pre správcu pripojení:
Kopírovať do schránkyaccess_log:
- názov: envoy.file_access_log
config:
path: "\/dev\/stdout"Výsledky by mali vyzerať takto:
- názov: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
access_log:
- názov: envoy.file_access_log
config:
path: "\/dev\/stdout"
route_config:Predvolene má Envoy formátovací reťazec, ktorý obsahuje podrobnosti o HTTP požiadavke:
[%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%"nVýsledok tohto formátového riadku:
[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"Obsah výstupu môžeme nastaviť pomocou poľa formátu. Napríklad:
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"Riadok denníka môže byť tiež vyvedený vo formáte JSON nastavením poľa json_format. Napríklad:
access_log:
- name: envoy.file_access_log
config:
path: "/dev/stdout"
json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}Pre ďalšie informácie o metódach zaznamenávania Envoy navštívte
Zaznamenávanie nie je jediný spôsob, ako získať prehľad o fungovaní Envoy Proxy. Obsahuje pokročilé možnosti trasovania a metriky. Môžete sa dozvedieť viac v alebo prostredníctvom .
Krok 7 — Spustenie
Teraz ste preložili konfiguráciu z NGINX na Envoy Proxy. Posledný krok — spustiť inštanciu Envoy Proxy na testovanie.
Spustenie ako používateľ
Na vrchole konfigurácie NGINX sa nachádza riadok user www www; ukazuje, že NGINX beží ako používateľ s nízkou úrovňou práv na zvýšenie bezpečnosti.
Envoy Proxy používa cloudový prístup na riadenie vlastníka procesu. Keď spúšťame Envoy Proxy cez kontajner, môžeme určiť používateľa s nízkou úrovňou práv.
Spustenie Envoy Proxy
Nasledujúci príkaz spustí Envoy Proxy cez Docker kontajner na hostiteľovi. Tento príkaz umožňuje Envoy počúvať prichádzajúce požiadavky cez port 80. Avšak, ako je uvedené v konfigurácii poslucháča, Envoy Proxy počúva prichádzajúcu prevádzku cez port 8080. To umožňuje procesu bežať ako používateľ s nízkymi právami.
docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoyTestovanie
So spusteným proxy môžu byť teraz vykonané a spracované testy. Nasledujúci príkaz cURL vydáva požiadavku s hlavičkou hostiteľa definovanou v konfigurácii proxy.
curl -H "Host: one.example.com" localhost -iHTTP požiadavka privedie k chybe 503To je spôsobené tým, že prichádzajúce spojenia nefungujú a nie sú dostupné. Takže Envoy Proxy nemá dostupné cieľové adresy pre požiadavku. Následujúci príkaz spustí sériu HTTP služieb, ktoré zodpovedajú konfigurácii definovanej pre Envoy.
docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;S dostupnými službami môže Envoy úspešne proxyovať prevádzku na cieľ.
curl -H "Host: one.example.com" localhost -iMali by ste vidieť odpoveď, ktorá ukazuje, ktorý kontajner Docker spracoval požiadavku. V logoch Envoy Proxy by ste mali tiež vidieť vyvedený prístupový riadok.
Ďalšie hlavičky odpovede HTTP (HTTP Response)
V hlavičkách odpovede platného požiadavku uvidíte ďalšie hlavičky HTTP. V hlavičke je zobrazený čas, ktorý vyšší hosť strávil spracovaním požiadavky. Je vyjadrený v milisekundách. To je užitočné, ak sa klient chce určiť čas obsluhy v porovnaní s oneskorením v sieti.
x-envoy-upstream-service-time: 0
server: envoyZáverečná konfigurácia
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 }Ďalšie informácie od prekladateľa
Inštrukcie na inštaláciu Envoy Proxy nájdete na stránkach
Predvolene v rpm chýba konfigurácia systemd služby.
Pridajte konfiguráciu systemd služby \/etc\/systemd\/system\/envoy.service:
[Unit]
Description=Envoy Proxy
Documentation=https:\/\/www.envoyproxy.io\/\nAfter=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.targetMusíte vytvoriť adresár \/etc\/envoy\/ a umiestniť tam konfiguráciu config.yaml.
Pre envoy proxy je telegram chat:
Envoy Proxy nemá podporu pre doručovanie statického obsahu. Preto, kto môže, hlasujte za funkciu:
Len registrovaní používatelia sa môžu zúčastniť prieskumu. , prosím.
Podnietil tento príspevok k inštalácii a testovaniu envoy proxy?
áno
nie
Hlasovalo 75 používateľov. Zdržalo sa 18 používateľov.
Zdroj: habr.com
