Tervitused! See on lühike artikkel, mis vastab küsimustele: "Mis on saadik?", "Miks seda vaja on?" ja "kust alustada?".
Mis see on?
Envoy on C++ keeles kirjutatud L4-L7 tasakaalustaja, mis on keskendunud suurele jõudlusele ja saadavusele. Ühest küljest on see mingil moel nginxi ja haproxy analoog, mis on jõudluses nendega võrreldav. Teisest küljest on see rohkem orienteeritud mikroteenuste arhitektuurile ja selle funktsionaalsus pole halvem kui java and go tasakaalustajad, nagu zuul või traefik.
Haproxy/nginx/envoy võrdlustabel, see ei pretendeeri absoluutsele tõele, vaid annab üldpildi.
nginx
haproksü
saadik
traefik
tähed githubis
11.2k/peegel
1.1k/peegel
12.4k
27.6k
sisse kirjutatud
C
C
C + +
go
API
ei
ainult pistikupesa/push
andmeplaan/tõmme
vedama
aktiivne tervisekontroll
ei
jah
jah
jah
Ava jälg
väline pistikprogramm
ei
jah
jah
J.W.T.
väline pistikprogramm
ei
jah
ei
laiendamine
Lua/C
Lua/C
Lua/C++
ei
Mida
See on noor projekt, palju asju on puudu, mõned alfa alguses. Aga saadik, areneb ka oma nooruse tõttu kiiresti ja sellel on juba palju huvitavaid funktsioone: dünaamiline konfiguratsioon, palju valmisfiltreid, lihtne liides oma filtrite kirjutamiseks.
Sellest tulenevad kasutusvaldkonnad, kuid kõigepealt on kaks antimustrit:
- Staatiline tagasilöök.
Fakt on see, et hetkel sisse saadik vahemälu tugi puudub. Google'i poisid proovivad seda
Praegu kasutage staatika jaoks nginxit.
- Staatiline konfiguratsioon.
Võite seda kasutada, kuid saadik See pole selleks loodud. Staatilise konfiguratsiooni funktsioone ei avaldata. On palju hetki:
Yamlis konfiguratsiooni redigeerides eksite, kardate arendajaid paljusõnalisuse pärast ja arvate, et nginx/haproxy konfiguratsioonid, ehkki vähem struktureeritud, on sisutihedamad. See on asja mõte. Nginxi ja Haproxy konfiguratsioon loodi käsitsi redigeerimiseks ja saadik koodist genereerimiseks. Kogu konfiguratsiooni on kirjeldatud artiklis
Canary, b/g juurutamise stsenaariume ja palju muud rakendatakse tavaliselt ainult dünaamilises konfiguratsioonis. Ma ei ütle, et seda ei saa staatiliselt teha, me kõik teeme seda. Kuid selleks peate ükskõik millisesse tasakaalustajasse panema kargud saadik kaasa arvatud.
Ülesanded, mille jaoks saadik on asendamatu:
- Liikluse tasakaalustamine keerulistes ja dünaamilistes süsteemides. See hõlmab teenindusvõrku, kuid see ei pruugi olla ainus.
- Vajadus hajutatud jälgimisfunktsiooni, keeruka autoriseerimise või muu funktsiooni järele, mis on saadaval saadik kastist väljas või mugavalt juurutatud, aga nginx/haproxy puhul peab sind ümbritsema lua ja kahtlased pluginad.
Mõlemad tagavad vajadusel suure jõudluse.
Kuidas see töötab
Envoy levitatakse binaarfailidena ainult dokipildina. Pilt sisaldab juba staatilise konfiguratsiooni näidet. Kuid meid huvitab see ainult struktuuri mõistmiseks.
envoy.yaml staatiline konfiguratsioon
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
Dünaamiline konfiguratsioon
Millisele probleemile me lahendust otsime? Te ei saa koormusetasakaalu konfiguratsiooni lihtsalt uuesti laadida, vaid tekivad väikesed probleemid:
- Konfiguratsiooni valideerimine.
Konfig võib olla suur, see võib olla väga suur, kui me selle korraga üle koormame, suureneb võimalus, et kuskil on viga.
- Pikaealised sidemed.
Uue kuulaja lähtestamisel tuleb hoolitseda vanal töötavate ühenduste eest, kui muutused toimuvad sageli ja ühendused on pikaealised, siis tuleb otsida kompromissi. Tere, kubernetes ingress nginxis.
- Aktiivne tervisekontroll.
Kui meil on aktiivsed tervisekontrollid, peame need kõik uues konfiguratsioonis enne liikluse saatmist üle kontrollima. Kui ülesvoolu on palju, võtab see aega. Tere haproxy.
Kuidas see on lahendatud saadikLaadides konfiguratsiooni dünaamiliselt, vastavalt basseini mudelile, saate selle jagada eraldi osadeks ja mitte uuesti initsialiseerida seda osa, mis pole muutunud. Näiteks kuulaja, mille taasalustamine on kallis ja vahetub harva.
Konfiguratsioon saadik (ülaltoodud failist) sisaldab järgmisi üksusi:
- kuulaja — kuulaja, mis ripub kindla ip/pordi küljes
- virtuaalne host - virtuaalne host domeeninime järgi
- tee - tasakaalustamise reegel
- klastri — rühm ülesvoolu koos tasakaalustavate parameetritega
- tulemusnäitaja — ülesvoolu eksemplari aadress
Kõik need olemid ja mõned teised saab dünaamiliselt täita; selleks määrab konfiguratsioon teenuse aadressi, kust konfiguratsioon vastu võetakse. Teenus võib olla REST või gRPC, eelistatav on gRPC.
Teenused on nimetatud vastavalt: LDS, VHDS, RDS, CDS ja EDS. Saate kombineerida staatilise ja dünaamilise konfiguratsiooni piiranguga, et dünaamilist ressurssi ei saa määrata staatilises.
Enamiku ülesannete jaoks piisab kolme viimase teenuse rakendamisest, neid nimetatakse ADS-iks (Aggregated Discovery Service).
Konfiguratsioon on järgmisel kujul:
envoy.yaml dünaamiline konfiguratsioon
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
Käivitamisel saadik selle konfiguratsiooniga loob see ühenduse juhttasandiga ja proovib taotleda RDS-i, CDS-i ja EDS-i konfiguratsiooni. Kirjeldatakse, kuidas interaktsiooniprotsess toimub
Lühidalt, saadik saadab päringu, mis näitab taotletava ressursi tüüpi, sõlme versiooni ja parameetreid. Vastuseks saab ta ressursi ja versiooni; kui juhttasandil olev versioon pole muutunud, siis ta ei reageeri.
Interaktsioonivalikuid on neli:
- Üks gRPC voog igat tüüpi ressursside jaoks, saadetakse ressursi täielik olek.
- Eraldi ojad, täis seisukord.
- Üks voog, järkjärguline olek.
- Eraldi vood, astmeline olek.
Inkrementaalne xDS võimaldab teil vähendada liiklust juhttasandi ja juhttasandi vahel saadik, on see oluline suurte konfiguratsioonide puhul. Kuid see muudab suhtlemise keerulisemaks; taotlus sisaldab ressursside loendit tellimuse tühistamiseks ja tellimiseks.
Meie näide kasutab ADS-i – üks voog RDS-i, CDS-i, EDS-i ja mitteinkrementaalse režiimi jaoks. Lisarežiimi lubamiseks peate määrama api_type: DELTA_GRPC
Kuna päring sisaldab sõlme parameetreid, saame erinevate eksemplaride jaoks juhttasandile saata erinevaid ressursse saadik, see on mugav teenindusvõrgu ehitamiseks.
Soojendama
Edasi saadik käivitamisel või juhttasandilt uue konfiguratsiooni saamisel käivitatakse ressursi soojendamise protsess. See jaguneb kuulaja soojendamiseks ja klastri soojendamiseks. Esimene käivitatakse, kui RDS/LDS-is on muudatusi, teine, kui CDS/EDS. See tähendab, et kui muutuvad ainult ülesvoolud, siis kuulajat uuesti ei looda.
Soojendusprotsessi ajal oodatakse juhttasandilt sõltuvaid ressursse ajalõpu ajal. Kui aegumine toimub, siis lähtestamine ei õnnestu ja uus kuulaja ei hakka pordis kuulama.
Initsialiseerimisjärjekord: EDS, CDS, aktiivne tervisekontroll, RDS, LDS. Kui aktiivsed tervisekontrollid on lubatud, läheb liiklus ülesvoolu alles pärast ühte edukat tervisekontrolli.
Kui kuulaja loodi uuesti, läheb vana olekusse DRAIN ja see kustutatakse pärast kõigi ühenduste sulgemist või ajalõpu aegumist --drain-time-s
, vaikimisi 10 minutit.
Et jätkata.
Allikas: www.habr.com