Zorionak! Hau galderei erantzuten dien artikulu laburra da: βzer da mandataria?β, βzertarako behar da?β. eta "nondik hasi?".
Zer da hau?
Envoy C++-n idatzitako L4-L7 orekatzailea da, errendimendu eta erabilgarritasun handian bideratuta. Alde batetik, hau, nolabait, nginx eta haproxy-ren analogoa da, haien errendimenduan parekoa. Bestalde, mikrozerbitzuen arkitekturara bideratuago dago eta java eta go balancers baino funtzionalitate txarragorik ez dauka, zuul edo traefik esaterako.
Haproxy/nginx/envoy-en konparazio taula, ez du egia absolutua denik aldarrikatzen, baina irudi orokorra ematen du.
nginx
haproxy
igorri
traefik
izarrak github-en
11.2k/ispilua
1.1k/ispilua
12.4k
27.6k
idatzita
C
C
C ++
go
API
Π½Π΅Ρ
entxufea bakarrik/bulkatu
datu-planoa/tira
tira
osasun-kontrol aktiboa
Π½Π΅Ρ
Bai
Bai
Bai
Trazadura irekia
kanpoko plugina
Π½Π΅Ρ
Bai
Bai
J.W.T.
kanpoko plugina
Π½Π΅Ρ
Bai
Π½Π΅Ρ
luzapena
Lua/C
Lua/C
Lua/C++
Π½Π΅Ρ
Zertarako
Proiektu gaztea da hau, gauza asko falta dira, batzuk alfa hasieran. Baina igorri, bere gaztetasunagatik ere, azkar garatzen ari da eta dagoeneko ezaugarri interesgarri asko ditu: konfigurazio dinamikoa, prest egindako iragazki asko, zure iragazkiak idazteko interfaze sinplea.
Aplikazio-eremuak hortik datoz, baina lehenik 2 kontrako eredu daude:
- Atzerapauso estatikoa.
Kontua da momentuz igorri caching euskarririk ez. Google-ko mutilak hau saiatzen ari dira
Oraingoz, erabili nginx estatikorako.
- Konfigurazio estatikoa.
Erabili dezakezu, baina igorri Ez da horretarako sortua izan. Konfigurazio estatikoko eginbideak ez dira agertuko. Momentu asko daude:
Yaml-en konfigurazioa editatzean, oker egongo zara, garatzaileei errieta egin eta pentsa ezazu nginx/haproxy konfigurazioak, egituratuta ez dauden arren, zehatzagoak direla. Hori da kontua. Nginx eta Haproxy-ren konfigurazioa eskuz editatzeko sortu zen, eta igorri kodetik sortzeko. atalean deskribatzen da konfigurazio osoa
Canary, b/g inplementazio eszenatokiak eta askoz gehiago normalean konfigurazio dinamiko batean soilik inplementatzen dira. Ez dut esaten hau estatikoki egin ezin denik, denok egiten dugu. Baina horretarako makuluak jarri behar dituzu, edozein orekatzailetan, barruan igorri barne.
Envoy ezinbestekoa den zereginak:
- Trafikoa orekatzea sistema konplexu eta dinamikoetan. Horrek zerbitzu-sarea barne hartzen du, baina ez da zertan bakarra.
- Banatutako trazamenduaren funtzionaltasuna, baimen konplexua edo eskuragarri dagoen beste funtzionalitate baten beharra igorri kaxatik kanpo edo eroso inplementatuta, baina nginx/haproxy-n lua eta zalantzazko pluginez inguratuta egon behar duzu.
Biek, behar izanez gero, errendimendu handia ematen dute.
Nola egiten du lan
Envoy binarioetan banatzen da docker irudi gisa soilik. Irudiak dagoeneko badu konfigurazio estatiko baten adibide bat. Baina egitura ulertzeko soilik interesatzen zaigu.
envoy.yaml konfigurazio estatikoa
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
Konfigurazio dinamikoa
Zein arazori irtenbidea bilatzen ari gara? Ezin duzu karga-orekatzailearen konfigurazioa berriro kargatu kargapean; arazo "txikiak" sortuko dira:
- Konfigurazioaren baliozkotzea.
Konfigurazioa handia izan daiteke, oso handia izan daiteke, dena aldi berean gainkargatzen badugu, nonbait errore bat izateko aukerak handitzen dira.
- Iraupen luzeko konexioak.
Entzule berri bat hasterakoan, zaharrean exekutatzen diren konexioak zaindu behar dituzu; aldaketak maiz gertatzen badira eta iraupen luzeko konexioak badaude, konpromisoa bilatu beharko duzu. Kaixo, kubernetes ingress nginx-en.
- Osasun-kontrol aktiboak.
Osasun egiaztapen aktiboak baditugu, guztiak konfigurazio berrian egiaztatu behar ditugu trafikoa bidali aurretik. Upstream asko baldin badaude, honek denbora behar du. Kaixo haproxy.
Nola konpontzen da hau igorriKonfigurazioa dinamikoki kargatuz, igerileku-ereduaren arabera, zati bereizietan banatu dezakezu eta aldatu ez den zatia ez berriro abiarazi. Esaterako, entzule bat, garestia dena berriro hasieratzea eta gutxitan aldatzen dena.
konfigurazioa igorri (goiko fitxategitik) entitate hauek ditu:
- entzulea β entzulea ip/portu zehatz batean zintzilik
- ostalari birtuala - ostalari birtuala domeinu-izenaren arabera
- ibilbidea - oreka-araua
- cluster β oreka-parametroak dituen ur-talde bat
- amaierako puntua β gorako instantziaren helbidea
Entitate horietako bakoitza eta beste batzuk modu dinamikoan bete daitezke; horretarako, konfigurazioak konfigurazioa jasoko duen zerbitzuaren helbidea zehazten du. Zerbitzua REST edo gRPC izan daiteke, gRPC hobe da.
Zerbitzuek hurrenez hurren izena dute: LDS, VHDS, RDS, CDS eta EDS. Konfigurazio estatikoa eta dinamikoa konbina ditzakezu, baliabide dinamiko bat estatiko batean ezin dela zehaztu.
Zeregin gehienetarako, nahikoa da azken hiru zerbitzuak ezartzea, ADS (Aggregated Discovery Service) deitzen zaie,
Konfigurazioak forma hau hartzen du:
envoy.yaml konfigurazio dinamikoa
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
Abiaraztean igorri konfigurazio honekin, kontrol-planora konektatuko da eta RDS, CDS eta EDS konfigurazioa eskatzen saiatuko da. Interakzio-prozesua nola gertatzen den deskribatzen da
Laburbilduz, igorri eskaera bat bidaltzen du eskatzen den baliabide mota, nodoaren bertsioa eta parametroak adieraziz. Erantzun gisa, baliabide bat eta bertsio bat jasotzen ditu; kontrol-planoko bertsioa aldatu ez bada, ez du erantzuten.
4 interakzio aukera daude:
- Mota guztietako baliabideetarako gRPC korronte bat, baliabidearen egoera osoa bidaltzen da.
- Erreka bereiziak, egoera osoa.
- Korronte bat, egoera inkrementala.
- Korronte bereiziak, egoera inkrementala.
Incremental xDS-k kontrol-hegazkinaren eta trafikoa murrizteko aukera ematen du igorri, hau garrantzitsua da konfigurazio handietarako. Baina elkarrekintza zaildu egiten du; eskaerak harpidetza kentzeko eta harpidetzeko baliabideen zerrenda dauka.
Gure adibideak ADS erabiltzen du - korronte bat RDS, CDS, EDS eta gehikuntzarik gabeko modurako. Modu inkrementala gaitzeko, zehaztu behar duzu api_type: DELTA_GRPC
Eskaerak nodo-parametroak dituenez, baliabide desberdinak bidal ditzakegu kontrol-planora instantzia desberdinetarako igorri, hau erosoa da zerbitzu-sare bat eraikitzeko.
Berotu
On igorri abiaraztean edo kontrol-planotik konfigurazio berri bat jasotzean, baliabideak berotzeko prozesua abiarazten da. Entzuleen beroketa eta kluster beroketa bereizten da. Lehenengoa RDS/LDSn aldaketak daudenean abiarazten da, bigarrena CDS/EDS denean. Horrek esan nahi du upstream-ak soilik aldatzen badira, entzulea ez dela birsortzen.
Berotze-prozesuan zehar, kontrol-planoaren menpeko baliabideak espero dira denbora-mugan. Denbora-muga gertatzen bada, hasieratzea ez da arrakastatsua izango eta entzule berria ez da portuan entzuten hasiko.
Hasierako ordena: EDS, CDS, osasun-kontrol aktiboa, RDS, LDS. Osasun egiaztapen aktiboak gaituta, trafikoa korrontean igoko da osasun egiaztapen arrakastatsu baten ondoren soilik.
Entzulea birsortu bada, zaharra DRAIN egoerara pasako da eta konexio guztiak itxi ondoren edo denbora-muga amaitu ondoren ezabatuko da. --drain-time-s
, lehenetsita 10 minutu.
Jarraitu behar da.
Iturria: www.habr.com