Gréiss! Dëst ass e kuerzen Artikel deen d'Froen beäntwert: "Wat ass Envoy?", "Firwat ass et néideg?" an "wou ufänken?".
Wat ass dat?
Envoy ass e L4-L7 Balancer geschriwwen an C ++, fokusséiert op héich Leeschtung an Disponibilitéit. Engersäits ass dëst op iergendeng Manéier en Analog vun Nginx an Haproxy, vergläichbar a Leeschtung mat hinnen. Op der anerer Säit ass et méi op d'Mikroservicearchitektur orientéiert an huet Funktionalitéit net méi schlëmm wéi Java a Go Balancer, sou wéi Zuul oder Traefik.
Vergläichstabell vun Haproxy / nginx / Envoy, et behaapt net déi absolut Wourecht ze sinn, awer gëtt en allgemengt Bild.
nginx
haproxy
geschéckt
traefik
Stären op github
11.2k/spigel
1.1k/spigel
12.4k
27.6k
geschriwwen an
C
C
C ++
go
API
kee
nëmmen Socket / dréckt
dataplane / zéien
zitt
aktiv Gesondheetscheck
kee
jo
jo
jo
Open Tracing
externen Plugin
kee
jo
jo
J.W.T.
externen Plugin
kee
jo
kee
Extensioun
Lua/C
Lua/C
Lua/C++
kee
Wat fir
Dëst ass e jonke Projet, et feelt vill Saachen, e puer am fréie Alpha. Mee geschéckt, och wéinst senger Jugend, entwéckelt sech séier an huet scho vill interessant Features: dynamesch Konfiguratioun, vill fäerdeg Filteren, eng einfach Interface fir Är eege Filteren ze schreiwen.
Applikatiounsberäicher kommen dovun aus, awer als éischt ginn et 2 Antimuster:
- Statesch Recoil.
D'Tatsaach ass, datt am Moment am geschéckt keng Caching Ënnerstëtzung. D'Google Kärelen probéieren dëst
Fir de Moment benotzt nginx fir Statik.
- Statesch Configuratioun.
Dir kënnt et benotzen, mä geschéckt Dofir ass et net erstallt ginn. Features an enger statescher Konfiguratioun ginn net ausgesat. Et gi vill Momenter:
Wann Dir d'Konfiguratioun an yaml ännert, gitt Dir Iech falsch, schellt d'Entwéckler fir Verbositéit an denkt datt d'nginx / Haproxy Konfiguratiounen, obwuel manner strukturéiert, méi präzis sinn. Dat ass de Punkt. D'Konfiguratioun vun Nginx an Haproxy gouf erstallt fir mat der Hand z'änneren, an geschéckt fir Generatioun aus Code. Déi ganz Konfiguratioun gëtt an
Canary, b / g Deployment Szenarie a vill méi ginn normalerweis nëmmen an enger dynamescher Konfiguratioun ëmgesat. Ech soen net datt dat net statesch ka gemaach ginn, mir maachen et all. Mä fir dëst musst Dir op Crutches setzen, an engem vun de Balancer, an geschéckt abegraff.
Aufgaben fir déi den Envoy onverzichtbar ass:
- Verkéiersbalancéierung a komplexen an dynamesche Systemer. Dëst beinhalt de Service Mesh, awer et ass net onbedéngt deen eenzegen.
- De Besoin fir verdeelt Tracing Funktionalitéit, komplex Autorisatioun oder aner Funktionalitéit déi verfügbar ass geschéckt aus der Këscht oder bequem implementéiert, awer an nginx / Haproxy musst Dir vu lua an zweifelhafte Plugins ëmginn.
Béid, wann néideg, bidden héich Leeschtung.
Wéi heescht dat Aarbecht
Envoy gëtt a Binären nëmmen als Docker-Bild verdeelt. D'Bild enthält schonn e Beispill vun enger statesch Konfiguratioun. Mä mir sinn interesséiert et nëmmen fir d'Struktur ze verstoen.
envoy.yaml statesch Configuratioun
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.com
Dynamesch Configuratioun
Fir wat fir ee Problem sichen mir no enger Léisung? Dir kënnt net nëmmen d'Laaschtbalancer Konfiguratioun ënner Laascht nei lueden; "kleng" Probleemer entstoen:
- Configuratioun Validatioun.
D'Configuratioun ka grouss sinn, et kann ganz grouss sinn, wa mir alles op eemol iwwerlaascht, erhéijen d'Chancen op e Feeler iergendwou.
- Laang gelieft Verbindungen.
Wann Dir en neie Lauschterer initialiséiert, musst Dir ëm d'Verbindunge këmmeren déi op der aler lafen; wann Ännerungen dacks optrieden an et laanglieweg Verbindunge sinn, musst Dir no engem Kompromiss sichen. Hallo, kubernetes ingress op nginx.
- Aktiv Gesondheetskontrolle.
Wa mir aktiv Gesondheetschecken hunn, musse mir se all an der neier Configuratioun duebel iwwerpréiwen ier Dir de Traffic schéckt. Wann et vill Upstream gëtt, brauch dat Zäit. Moien haproxy.
Wéi ass dëst geléist an geschécktAndeems Dir d'Konfiguratioun dynamesch gelueden hutt, laut dem Poolmodell, kënnt Dir et an getrennten Deeler opdeelen an den Deel deen net geännert huet nei initialiséieren. Zum Beispill en Nolauschterer, deen deier ass fir nei ze initialiséieren a seelen ännert.
Configuratioun geschéckt (vum Fichier hei uewen) huet déi folgend Entitéiten:
- Nolauschterer - Nolauschterer hänkt op engem spezifeschen IP / Hafen
- virtuelle Host - virtuelle Host mam Domain Numm
- Wee - Equiliber Regel
- Stärekoup - eng Grupp vu Upstreams mat Balanceparameter
- Endpunkt - Upstream Instanz Adress
All eenzel vun dësen Entitéiten plus e puer anerer kënnen dynamesch ausgefëllt ginn; dofir spezifizéiert d'Konfiguratioun d'Adress vum Service vu wou d'Konfiguratioun kritt gëtt. De Service kann REST oder gRPC sinn, gRPC ass léiwer.
D'Servicer ginn respektiv genannt: LDS, VHDS, RDS, CDS an EDS. Dir kënnt statesch an dynamesch Konfiguratioun kombinéieren, mat der Begrenzung datt eng dynamesch Ressource net an enger statesch spezifizéiert ka ginn.
Fir déi meescht Aufgaben ass et genuch fir déi lescht dräi Servicer ëmzesetzen, si ginn ADS (Aggregated Discovery Service) genannt, fir
D'Konfiguratioun hëlt déi folgend Form:
envoy.yaml dynamesch Configuratioun
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: 6565
Beim Startup geschéckt mat dëser Configuratioun, wäert et un de Kontroll-Fliger verbannen a probéiert d'RDS, CDS an EDS Konfiguratioun ze froen. Wéi den Interaktiounsprozess geschitt ass beschriwwen
Kurz gesoot, geschéckt schéckt eng Ufro déi d'Zort vun der Ressource ugefrot gëtt, d'Versioun an d'Parameter vum Node. Als Äntwert kritt et eng Ressource an eng Versioun; wann d'Versioun um Kontrollplan net geännert huet, reagéiert se net.
Et gi 4 Interaktiounsoptiounen:
- Ee gRPC Stream fir all Zorte vu Ressourcen, de komplette Status vun der Ressource gëtt geschéckt.
- Separat Baachen, voll Zoustand.
- Ee Stroum, inkrementell Staat.
- Separat Baachen, inkrementell Staat.
Inkrementell xDS erlaabt Iech Verkéier tëscht der Kontroll-Fliger ze reduzéieren an geschéckt, Dëst ass relevant fir grouss Konfiguratiounen. Awer et komplizéiert d'Interaktioun; d'Ufro enthält eng Lëscht vu Ressourcen fir sech z'ënnerschreiwen an ze abonnéieren.
Eist Beispill benotzt ADS - ee Stroum fir RDS, CDS, EDS an net-inkrementelle Modus. Fir inkrementell Modus z'aktivéieren, musst Dir spezifizéieren api_type: DELTA_GRPC
Zënter datt d'Ufro Nodeparameter enthält, kënne mir verschidde Ressourcen op d'Kontrollplan fir verschidden Instanzen schécken geschéckt, Dëst ass bequem fir e Service Mesh ze bauen.
Opwiermen
op geschéckt beim Startup oder wann Dir eng nei Konfiguratioun vu Kontrollplane kritt, gëtt de Ressourcewaarmprozess gestart. Et ass ënnerdeelt an Nolauschterer Warmup a Cluster Warmup. Déi éischt gëtt lancéiert wann et Ännerungen am RDS / LDS sinn, déi zweet wann CDS / EDS. Dëst bedeit datt wann nëmmen Upstreams änneren, den Nolauschterer net nei erstallt gëtt.
Wärend dem Erwiermungsprozess ginn ofhängeg Ressourcen vum Kontrollfliger wärend dem Timeout erwaart. Wann den Timeout geschitt ass, wäert d'Initialiséierung net erfollegräich sinn an den neie Lauschterer fänkt net um Hafen ze lauschteren.
Initialiséierungsuerdnung: EDS, CDS, aktive Gesondheetscheck, RDS, LDS. Mat aktive Gesondheetschecken aktivéiert, wäert de Traffic nëmmen no engem erfollegräiche Gesondheetscheck upstream goen.
Wann den Nolauschterer erstallt gouf, geet deen alen an den DRAIN-Status a gëtt geläscht nodeems all Verbindungen zougemaach sinn oder den Timeout eriwwer ass --drain-time-s
, Standard 10 Minutten.
Fir weidergeleet gëtt.
Source: will.com