Pozdravi! To je kratek članek, ki odgovarja na vprašanja: "kaj je odposlanec?", "zakaj je potreben?" in "kje začeti?".
Kaj je to?
Envoy je balanser L4-L7, napisan v C++, osredotočen na visoko zmogljivost in razpoložljivost. Po eni strani je to na nek način analog nginxa in haproxyja, ki je po zmogljivosti primerljiv z njima. Po drugi strani pa je bolj usmerjen v arhitekturo mikrostoritev in ima funkcionalnost, ki ni slabša od java in go balancers, kot sta zuul ali traefik.
Primerjalna tabela haproxy/nginx/envoy, ne trdi, da je absolutna resnica, ampak daje splošno sliko.
nginx
haproksi
poslano
traefik
zvezdice na githubu
11.2k/ogledalo
1.1k/ogledalo
12.4k
27.6k
zapisano v
C
C
C + +
go
API
ne
samo vtičnica/push
dataplane/pull
potegnite
aktivni zdravstveni pregled
ne
ja
ja
ja
Odprto sledenje
zunanji vtičnik
ne
ja
ja
J.W.T.
zunanji vtičnik
ne
ja
ne
razširitev
Lua/C
Lua/C
Lua/C++
ne
Za kaj
To je mlad projekt, veliko stvari manjka, nekatere v zgodnji alfa fazi. Ampak poslano, tudi zaradi svoje mladosti, se hitro razvija in ima že veliko zanimivih funkcij: dinamično konfiguracijo, veliko že pripravljenih filtrov, preprost vmesnik za pisanje lastnih filtrov.
Iz tega sledijo področja uporabe, vendar najprej obstajata 2 antipatterna:
- Statični odboj.
Dejstvo je, da trenutno v poslano brez podpore za predpomnjenje. Googlovi fantje to poskušajo
Za zdaj uporabite nginx za statiko.
- Statična konfiguracija.
Lahko ga uporabite, vendar poslano Ni bil ustvarjen za to. Funkcije v statični konfiguraciji ne bodo izpostavljene. Veliko je trenutkov:
Ko urejate konfiguracijo v yaml, se boste zmotili, grajali razvijalce zaradi dobesednosti in mislili, da so konfiguracije nginx/haproxy, čeprav manj strukturirane, bolj jedrnate. To je bistvo. Konfiguracija Nginx in Haproxy je bila ustvarjena za ročno urejanje in poslano za generiranje iz kode. Celotna konfiguracija je opisana v
Canary, scenariji uvajanja b/g in še veliko več se običajno izvaja samo v dinamični konfiguraciji. Ne pravim, da tega ni mogoče narediti statično, vsi to počnemo. Toda za to si morate nadeti bergle, v katerega koli od ravnotežij, v poslano tudi.
Naloge, pri katerih je Envoy nepogrešljiv:
- Uravnoteženje prometa v kompleksnih in dinamičnih sistemih. To vključuje servisno mrežo, vendar ni nujno edina.
- Potreba po funkciji porazdeljenega sledenja, kompleksni avtorizaciji ali drugi funkciji, ki je na voljo v poslano takoj po namestitvi ali priročno implementiran, toda v nginx/haproxy morate biti obkroženi z lua in dvomljivimi vtičniki.
Oba, če je potrebno, zagotavljata visoko zmogljivost.
Kako to deluje
Envoy se v binarnih datotekah distribuira samo kot slika dockerja. Slika že vsebuje primer statične konfiguracije. Vendar nas zanima samo zaradi razumevanja strukture.
statična 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.com
Dinamična konfiguracija
Za kakšen problem iščemo rešitev? Konfiguracije izravnalnika obremenitve ne morete preprosto znova naložiti pod obremenitvijo; pojavile se bodo "majhne" težave:
- Preverjanje konfiguracije.
Konfiguracija je lahko velika, lahko je zelo velika, če jo preobremenimo naenkrat, se možnosti za napako kje povečajo.
- Dolgotrajne povezave.
Pri inicializaciji novega poslušalca morate poskrbeti za povezave, ki delujejo na starem; če se spremembe pogosto pojavljajo in obstajajo dolgožive povezave, boste morali iskati kompromis. Pozdravljeni, kubernetes ingress na nginx.
- Aktivni zdravstveni pregledi.
Če imamo aktivne preglede zdravja, jih moramo vse dvakrat preveriti v novi konfiguraciji, preden pošljemo promet. Če je gorvodnih veliko, to zahteva čas. Pozdravljeni haproxy.
Kako je to rešeno v poslanoZ dinamičnim nalaganjem konfiguracije v skladu z modelom bazena jo lahko razdelite na ločene dele in ne boste znova inicializirali dela, ki se ni spremenil. Na primer poslušalec, katerega ponovna inicializacija je draga in se redko spreminja.
Konfiguracija poslano (iz zgornje datoteke) ima naslednje entitete:
- poslušalec — poslušalec visi na določenem ip/vratu
- virtualni gostitelj - virtualni gostitelj po imenu domene
- pot - pravilo uravnoteženja
- grozd — skupina zgornjih tokov s parametri izravnave
- končna točka — naslov instance navzgor
Vsako od teh entitet in nekatere druge je mogoče izpolniti dinamično; za to konfiguracija določa naslov storitve, od koder bo prejeta konfiguracija. Storitev je lahko REST ali gRPC, prednost je gRPC.
Storitve so poimenovane: LDS, VHDS, RDS, CDS in EDS. Kombinirate lahko statično in dinamično konfiguracijo, z omejitvijo, da dinamičnega vira ni mogoče podati v statičnem.
Za večino opravil zadostuje implementacija zadnjih treh storitev, imenujemo jih ADS (Aggregated Discovery Service), za
Konfiguracija ima naslednjo obliko:
dinamična 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: 6565
Ob zagonu poslano s to konfiguracijo se bo povezal z nadzorno ravnino in poskušal zahtevati konfiguracijo RDS, CDS in EDS. Opisano je, kako poteka interakcijski proces
V kratkem, poslano pošlje zahtevo, ki navaja vrsto zahtevanega vira, različico in parametre vozlišča. Kot odgovor prejme vir in različico; če se različica na nadzorni ravnini ni spremenila, se ne odzove.
Obstajajo 4 možnosti interakcije:
- En tok gRPC za vse vrste virov, pošlje se celotno stanje vira.
- Ločeni tokovi, popolno stanje.
- En tok, inkrementalno stanje.
- Ločeni tokovi, inkrementalno stanje.
Inkrementalni xDS vam omogoča zmanjšanje prometa med nadzorno ravnino in poslano, to je pomembno za velike konfiguracije. Vendar otežuje interakcijo, zahteva vsebuje seznam virov za odjavo in naročnino.
Naš primer uporablja ADS - en tok za RDS, CDS, EDS in neinkrementalni način. Če želite omogočiti inkrementalni način, morate podati api_type: DELTA_GRPC
Ker zahteva vsebuje parametre vozlišča, lahko v nadzorno ravnino pošljemo različne vire za različne instance poslano, je to priročno za gradnjo servisne mreže.
Ogreti se
Na poslano ob zagonu ali ob prejemu nove konfiguracije iz nadzorne ravnine se zažene postopek ogrevanja virov. Razdeljeno je na ogrevanje poslušalca in ogrevanje grozda. Prvi se zažene, ko pride do sprememb v RDS/LDS, drugi pa ob CDS/EDS. To pomeni, da če se spremenijo samo navzgornji tokovi, poslušalec ni ponovno ustvarjen.
Med postopkom ogrevanja se od nadzorne ravnine med časovno omejitvijo pričakujejo odvisni viri. Če pride do časovne omejitve, inicializacija ne bo uspešna in novi poslušalec ne bo začel poslušati na vratih.
Vrstni red inicializacije: EDS, CDS, aktivni zdravstveni pregled, RDS, LDS. Z omogočenimi aktivnimi zdravstvenimi pregledi bo promet šel navzgor šele po enem uspešnem zdravstvenem pregledu.
Če je bil poslušalec znova ustvarjen, gre stari v stanje DRAIN in bo izbrisan, ko se prekinejo vse povezave ali poteče časovna omejitev --drain-time-s
, privzeto 10 minut.
Se nadaljuje.
Vir: www.habr.com