Pozdrav! Ovaj kratki članak odgovara na pitanja: "Što je Envoy?", "Zašto mi je potreban?" i "Gdje da počnem?"
Što je ovo
Envoy je L4-L7 alat za uravnoteženje opterećenja napisan u C++, usmjeren na visoke performanse i dostupnost. S jedne strane, donekle je analogan nginxu i haproxyju, usporedivih performansi. S druge strane, više je usmjeren na mikroservisne arhitekture i nudi funkcionalnost usporedivu s Java i Go alatima za uravnoteženje opterećenja, kao što su zuul ili traefik.
Tablica usporedbe haproxy/nginx/envoy ne tvrdi da je apsolutna istina, ali daje opću sliku.
Nginx
haproksi
poslao
traefik
zvijezde na GitHubu
11.2 tisuće/zrcalo
1.1 tisuće/zrcalo
12.4k
27.6k
napisano u
C
C
C + +
go
API
ne
samo utičnica/pritisni
podatkovna ravnina/pull
povući
aktivna provjera zdravlja
ne
da
da
da
Otvori praćenje
vanjski dodatak
ne
da
da
J.W.T.
vanjski dodatak
ne
da
ne
nastavak
Lua/C
Lua/C
Lua/C++
ne
Što za
Ovo je mladi projekt, puno toga nedostaje, neke od njih su u ranoj alfa verziji. Ali poslao, dijelom zbog svoje mladosti, brzo se razvija i već ima mnogo zanimljivih značajki: dinamičku konfiguraciju, mnogo gotovih filtera, jednostavno sučelje za pisanje vlastitih filtera.
Iz ovoga proizlaze područja primjene, ali prvo, dva anti-obrasca:
- Statički trzaj.
Stvar je u tome što trenutno u poslao Nema podrške za keširanje. Ekipa u Googleu pokušava to popraviti. Ideja je da se to implementira s vremena na vrijeme poslao Sve suptilnosti (zoološki vrt zaglavlja) RFC usklađenosti i stvaranje sučelja za specifične implementacije. Ali ovo još nije ni alfa verzija; arhitektura je još uvijek u raspravi. otvoreno (dok sam pisao članak, PR se spojio, ali ova točka je i dalje relevantna).
U međuvremenu, koristite nginx za statiku.
- Statička konfiguracija.
Možeš ga koristiti, ali poslao Nije stvoreno za tu svrhu. Mogućnosti statičke konfiguracije neće biti u potpunosti ostvarene. Postoji mnogo točaka:
Prilikom uređivanja YAML konfiguracije, radit ćete pogreške, proklinjući programere zbog previše opširnog pisanja i misleći da su nginx/haproxy konfiguracije, iako manje strukturirane, konciznije. To je poanta. Konfiguracije Nginxa i Haproxyja stvorene su za ručno uređivanje, dok poslao za generiranje iz koda. Cijela konfiguracija je opisana u , generiranje iz proto datoteka znatno otežava pogrešku.
Canary scenariji, b/g implementacije i mnoge druge stvari mogu se ispravno implementirati samo u dinamičkoj konfiguraciji. Ne kažem da se ne mogu izvesti statički; svi to radimo. Ali da biste to učinili, morali biste pribjeći nekim zaobilaznim rješenjima, u bilo kojem balanseru, u poslao uključujući.
Zadaci gdje je Envoy nezamjenjiv:
- Balansiranje prometa u složenim i dinamičnim sustavima. To uključuje servisnu mrežu, ali nije nužno ograničeno na nju.
- Potreba za distribuiranim praćenjem, složenom autorizacijom ili drugom funkcionalnošću koja je dostupna u poslao Ili je jednostavno implementirati odmah ili praktično, dok se u nginxu/haproxyju morate zamotati u lua i upitne dodatke.
Oba su dostupna za pružanje visokih performansi kada je to potrebno.
Kako ovo radi
Envoy se distribuira samo kao binarna Docker slika. Slika već uključuje primjer statičke konfiguracije, ali nas zanima samo kako bismo razumjeli strukturu.
Statička konfiguracija envoy.yaml
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.google.com
cluster: service_google
http_filters:
- name: envoy.router
clusters:
- name: service_google
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_google
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.google.com
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
sni: www.google.comDinamička konfiguracija
Koji problem želimo riješiti? Ne možemo jednostavno ponovno učitati konfiguraciju uravnoteživača opterećenja; pojavit će se neki "manji" problemi:
- Validacija konfiguracije.
Konfiguracija može biti velika, može biti jako velika, ako je odjednom preopteretimo, povećavaju se šanse za grešku negdje.
- Dugotrajni spojevi.
Prilikom inicijalizacije novog slušača, morate se pobrinuti za veze koje se izvode na starom. Ako se promjene događaju često i postoje dugotrajne veze, morat ćete pronaći kompromis. Pozdrav, Kubernetes ingress na nginxu.
- Aktivne zdravstvene provjere.
Ako imamo aktivne provjere ispravnosti, trebali bismo ih sve ponovno provjeriti na novoj konfiguraciji prije slanja prometa. Ako ima puno uzvodnih tokova, to traje neko vrijeme. Pozdrav, haproxy.
Kako se ovo rješava u poslaoDinamičkim učitavanjem konfiguracije pomoću skupa modela možete je podijeliti na odvojene dijelove i izbjeći ponovnu inicijalizaciju dijelova koji se nisu promijenili. Na primjer, može se koristiti slušač, čija je ponovna inicijalizacija skupa i rijetko se mijenja.
Konfiguracija poslao (iz gornje datoteke) ima sljedeće entitete:
- slušalac — slušač koji visi na određenoj IP adresi/portu
- virtualni host — virtualni host prema nazivu domene
- put - pravilo uravnoteženja
- grozd — skupina uzvodnih vodova s parametrima uravnoteženja
- krajnja — adresa uzvodne instance
Svaki od ovih entiteta, zajedno s nekim drugima, može se dinamički popuniti navođenjem adrese servisa s kojeg će se konfiguracija dohvatiti u konfiguraciji. Servis može biti REST ili gRPC, ali gRPC je poželjniji.
Usluge su nazvane u skladu s tim: LDS, VHDS, RDS, CDS i EDS. Statičke i dinamičke konfiguracije mogu se kombinirati, uz napomenu da se dinamički resurs ne može specificirati unutar statičkog.
Za većinu zadataka dovoljno je implementirati posljednje tri usluge, one se nazivaju ADS (Aggregated Discovery Service), za i go ima gotovu implementaciju gRPC podatkovne ravnine, u kojoj samo trebate popuniti objekte iz svog izvora.
Konfiguracija ima sljedeći oblik:
dinamička konfiguracija envoy.yaml
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: xds_clr
cds_config:
ads: {}
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
rds:
route_config_name: local_route
config_source:
ads: {}
http_filters:
- name: envoy.router
clusters:
- name: xds_clr
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: xds_clr
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: xds
port_value: 6565Prilikom pokretanja poslao S ovom konfiguracijom, spojit će se na upravljačku ravninu i pokušati zatražiti konfiguraciju RDS-a, CDS-a i EDS-a. Proces interakcije opisan je u nastavku. .
Ukratko, poslao Šalje zahtjev u kojem se navodi vrsta traženog resursa, verzija i parametri čvora. Kao odgovor prima resurs i verziju. Ako se verzija na upravljačkoj ravnini nije promijenila, ne odgovara.
Postoje 4 mogućnosti za interakciju:
- Jedan gRPC stream za sve vrste resursa, šalje se puno stanje resursa.
- Odvojeni potoci, potpuno stanje.
- Jedan tok, inkrementalno stanje.
- Odvojeni tokovi, inkrementalno stanje.
Inkrementalni xDS omogućuje smanjenje prometa između upravljačke ravnine i poslaoOvo je relevantno za velike konfiguracije. Međutim, komplicira interakciju jer zahtjev zahtijeva popis resursa za odjavu i pretplatu.
Naš primjer koristi ADS - jedan stream za RDS, CDS, EDS i neinkrementalni način rada. Za omogućavanje inkrementalnog načina rada potrebno je odrediti api_type: DELTA_GRPC
Budući da zahtjev sadrži parametre čvora, možemo poslati različite resurse upravljačkoj ravnini za različite instance. poslao, ovo je praktično za izgradnju servisne mreže.
Zagrijati se
Na poslao Prilikom pokretanja ili primanja nove konfiguracije iz kontrolne ravnine, pokreće se proces zagrijavanja resursa. Podijeljen je na zagrijavanje slušača i zagrijavanje klastera. Prvo se pokreće kada se promijeni RDS/LDS, a drugo kada se promijeni CDS/EDS. To znači da ako se promijene samo uzvodni kanali, slušač se ne ponovno stvara.
Tijekom procesa zagrijavanja, ovisni resursi iz kontrolne ravnine čekaju se tijekom vremenskog ograničenja. Ako vremensko ograničenje istekne, inicijalizacija neće uspjeti i novi slušač neće početi slušati na portu.
Redoslijed inicijalizacije: EDS, CDS, aktivna provjera ispravnosti, RDS, LDS. Ako su omogućene aktivne provjere ispravnosti, promet će ići uzvodno tek nakon jedne uspješne provjere ispravnosti.
Ako se slušač ponovno kreira, stari prelazi u stanje DRAIN i bit će izbrisan nakon što se sve veze zatvore ili istekne vremensko ograničenje. --drain-time-s, zadano 10 minuta.
Nastaviti.
Izvor: www.habr.com
