Sveiciens! Å is ir Ä«ss raksts, kas atbild uz jautÄjumiem: "Kas ir sÅ«tnis?", "KÄpÄc tas ir vajadzÄ«gs?" un "ar ko sÄkt?".
Kas tas ir?
Envoy ir L4-L7 balansÄtÄjs, kas rakstÄ«ts C++ valodÄ un ir vÄrsts uz augstu veiktspÄju un pieejamÄ«bu. No vienas puses, tas savÄ ziÅÄ ir nginx un haproxy analogs, kas pÄc veiktspÄjas ir salÄ«dzinÄms ar tiem. No otras puses, tas ir vairÄk orientÄts uz mikropakalpojumu arhitektÅ«ru, un tÄ funkcionalitÄte nav sliktÄka par java un go balansÄtÄjiem, piemÄram, zuul vai traefik.
Haproxy/nginx/envoy salÄ«dzinÄÅ”anas tabula nepretendÄ uz absolÅ«tu patiesÄ«bu, bet sniedz vispÄrÄju priekÅ”statu.
nginx
haproksi
sūtnis
traefik
zvaigznes vietnÄ github
11.2k/spogulis
1.1k/spogulis
12.4k
27.6k
rakstÄ«ts iekÅ”Ä
C
C
C + +
go
API
nÄ
tikai ligzda/spiediens
datu plakne / pull
vilkt
aktÄ«va veselÄ«bas pÄrbaude
nÄ
jÄ
jÄ
jÄ
AtvÄrt izsekoÅ”anu
ÄrÄjais spraudnis
nÄ
jÄ
jÄ
J.W.T.
ÄrÄjais spraudnis
nÄ
jÄ
nÄ
pagarinÄÅ”ana
Lua/C
Lua/C
Lua/C++
nÄ
KÄpÄc
Å is ir jauns projekts, trÅ«kst daudz lietu, dažas ir agrÄ«nÄ alfa versijÄ. Bet sÅ«tnis, arÄ« savas jaunÄ«bas dÄļ, strauji attÄ«stÄs un jau tam ir daudz interesantu iespÄju: dinamiska konfigurÄcija, daudzi gatavi filtri, vienkÄrÅ”s interfeiss savu filtru rakstÄ«Å”anai.
No tÄ izriet pielietoÅ”anas jomas, taÄu vispirms ir 2 pretraksti:
- StatiskÄ atsitiena.
Fakts ir tÄds, ka Å”obrÄ«d iekÅ”Ä sÅ«tnis nav keÅ”atmiÅas atbalsta. Google puiÅ”i to mÄÄ£ina
PagaidÄm statikai izmantojiet nginx.
- StatiskÄ konfigurÄcija.
JÅ«s varat to izmantot, bet sÅ«tnis Tas nav tam radÄ«ts. StatiskÄs konfigurÄcijas funkcijas netiks atklÄtas. Ir daudz momentu:
RediÄ£Äjot konfigurÄciju yaml, jÅ«s maldÄ«sities, lamÄsit izstrÄdÄtÄjus par daudzvÄrdÄ«bu un domÄjat, ka nginx/haproxy konfigurÄcijas, lai arÄ« mazÄk strukturÄtas, tomÄr ir kodolÄ«gÄkas. TÄ ir bÅ«tÄ«ba. Nginx un Haproxy konfigurÄcija tika izveidota rediÄ£ÄÅ”anai ar roku, un sÅ«tnis Ä£enerÄÅ”anai no koda. Visa konfigurÄcija ir aprakstÄ«ta
Canary, b/g izvietoÅ”anas scenÄriji un daudz kas cits parasti tiek ieviests tikai dinamiskÄ konfigurÄcijÄ. Es nesaku, ka to nevar izdarÄ«t statiski, mÄs visi tÄ darÄm. Bet Å”im nolÅ«kam jebkurÄ no balansieriem ir jÄuzliek kruÄ·i sÅ«tnis ieskaitot.
Uzdevumi, kuru veikÅ”anai sÅ«tnis ir neaizstÄjams:
- Satiksmes balansÄÅ”ana sarežģītÄs un dinamiskÄs sistÄmÄs. Tas ietver pakalpojumu tÄ«klu, taÄu tas ne vienmÄr ir vienÄ«gais.
- NepiecieÅ”amÄ«ba pÄc izplatÄ«tas izsekoÅ”anas funkcionalitÄtes, sarežģītas autorizÄcijas vai citas funkcionalitÄtes, kas ir pieejama sÅ«tnis out of the box vai Ärti ieviests, bet nginx/haproxy ir jÄbÅ«t lua un apÅ”aubÄmu spraudÅu ielenkumÄ.
Abi, ja nepiecieÅ”ams, nodroÅ”ina augstu veiktspÄju.
KÄ tas darbojas
Envoy tiek izplatÄ«ts binÄros failos tikai kÄ docker attÄls. AttÄlÄ jau ir statiskas konfigurÄcijas piemÄrs. Bet mÅ«s tas interesÄ tikai struktÅ«ras izpratnei.
envoy.yaml statiskÄ konfigurÄcija
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
DinamiskÄ konfigurÄcija
KÄdai problÄmai mÄs meklÄjam risinÄjumu? JÅ«s nevarat vienkÄrÅ”i pÄrlÄdÄt slodzes lÄ«dzsvara konfigurÄciju zem slodzes; radÄ«sies āmazasā problÄmas:
- KonfigurÄcijas validÄcija.
KonfigurÄcija var bÅ«t liela, tÄ var bÅ«t ļoti liela, ja mÄs to visu vienlaikus pÄrslogojam, palielinÄs iespÄja, ka kaut kur bÅ«s kļūda.
- Ilgmūžīgi savienojumi.
InicializÄjot jaunu klausÄ«tÄju, jÄrÅ«pÄjas par savienojumiem, kas darbojas vecajÄ, ja izmaiÅas notiek bieži un ir ilgstoÅ”i savienojumi, jums bÅ«s jÄmeklÄ kompromiss. Sveiki, kubernetes ingress uz nginx.
- AktÄ«vÄs veselÄ«bas pÄrbaudes.
Ja mums ir aktÄ«vas veselÄ«bas pÄrbaudes, pirms trafika nosÅ«tÄ«Å”anas tÄs visas ir vÄlreiz jÄpÄrbauda jaunajÄ konfigurÄcijÄ. Ja augÅ”tecÄ ir daudz, tas aizÅem laiku. Sveiki, haproxy.
KÄ tas tiek atrisinÄts sÅ«tnisIelÄdÄjot konfigurÄciju dinamiski, atbilstoÅ”i pÅ«la modelim, var to sadalÄ«t atseviŔķÄs daļÄs un nemainÄ«t to daļu, kas nav mainÄ«jusies. PiemÄram, klausÄ«tÄjs, kura atkÄrtota inicializÄcija ir dÄrga un reti mainÄs.
KonfigurÄcija sÅ«tnis (no iepriekÅ” esoÅ”Ä faila) ir Å”Ädas entÄ«tijas:
- klausÄ«tÄjs ā klausÄ«tÄjs, kas karÄjas pie noteikta IP/porta
- virtuÄlais resursdators - virtuÄlais resursdators pÄc domÄna nosaukuma
- marŔruts - līdzsvaroŔanas noteikums
- grupa ā augÅ”teÄu grupa ar balansÄÅ”anas parametriem
- galapunkts ā iepriekÅ”ÄjÄs instances adrese
Katru no Ŕīm entÄ«tijÄm un dažas citas var aizpildÄ«t dinamiski; Å”im nolÅ«kam konfigurÄcijÄ ir norÄdÄ«ta pakalpojuma adrese, no kuras tiks saÅemta konfigurÄcija. Pakalpojums var bÅ«t REST vai gRPC, vÄlams gRPC.
Pakalpojumi tiek attiecÄ«gi nosaukti: LDS, VHDS, RDS, CDS un EDS. Varat apvienot statisko un dinamisko konfigurÄciju ar ierobežojumu, ka dinamisku resursu nevar norÄdÄ«t statiskÄ resursÄ.
LielÄkajai daļai uzdevumu pietiek ar pÄdÄjo trÄ«s pakalpojumu ievieÅ”anu, tos sauc par ADS (Aggregated Discovery Service).
KonfigurÄcija notiek Å”ÄdÄ formÄ:
envoy.yaml dinamiskÄ konfigurÄcija
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
Darbojoties sÅ«tnis ar Å”o konfigurÄciju tas izveidos savienojumu ar vadÄ«bas plakni un mÄÄ£inÄs pieprasÄ«t RDS, CDS un EDS konfigurÄciju. Ir aprakstÄ«ts, kÄ notiek mijiedarbÄ«bas process
ÄŖsumÄ, sÅ«tnis nosÅ«ta pieprasÄ«jumu, norÄdot pieprasÄ«tÄ resursa veidu, mezgla versiju un parametrus. Atbildot uz to, tas saÅem resursu un versiju; ja versija vadÄ«bas plaknÄ nav mainÄ«jusies, tÄ nereaÄ£Ä.
Ir 4 mijiedarbÄ«bas iespÄjas:
- Viena gRPC straume visu veidu resursiem, tiek nosūtīts pilns resursa statuss.
- AtseviŔķas plÅ«smas, pilnÄ stÄvoklÄ«.
- Viena plÅ«sma, pakÄpenisks stÄvoklis.
- AtseviŔķas plÅ«smas, pakÄpenisks stÄvoklis.
InkrementÄlÄ xDS ļauj samazinÄt satiksmi starp vadÄ«bas plakni un sÅ«tnis, tas attiecas uz lielÄm konfigurÄcijÄm. Bet tas sarežģī mijiedarbÄ«bu; pieprasÄ«jumÄ ir ietverts abonÄÅ”anas un abonÄÅ”anas resursu saraksts.
MÅ«su piemÄrÄ tiek izmantota ADS ā viena straume RDS, CDS, EDS un neinkrementÄlajam režīmam. Lai iespÄjotu inkrementÄlo režīmu, ir jÄnorÄda api_type: DELTA_GRPC
TÄ kÄ pieprasÄ«jums satur mezgla parametrus, mÄs varam nosÅ«tÄ«t dažÄdus resursus vadÄ«bas plaknei dažÄdiem gadÄ«jumiem sÅ«tnis, tas ir Ärti, lai izveidotu servisa tÄ«klu.
IesildÄ«Å”anÄs
uz sÅ«tnis startÄjot vai saÅemot jaunu konfigurÄciju no vadÄ«bas plaknes, tiek palaists resursa iesildÄ«Å”anas process. Tas ir sadalÄ«ts klausÄ«tÄja iesildÄ«Å”anÄ un klastera iesildÄ«Å”anÄ. Pirmais tiek palaists, kad notiek izmaiÅas RDS/LDS, otrais, kad CDS/EDS. Tas nozÄ«mÄ, ka, mainoties tikai augÅ”tecÄm, klausÄ«tÄjs netiek izveidots no jauna.
IesildÄ«Å”anÄs procesa laikÄ taimauta laikÄ no vadÄ«bas plaknes tiek gaidÄ«ti atkarÄ«gi resursi. Ja iestÄjas taimauts, inicializÄcija nebÅ«s veiksmÄ«ga un jaunais klausÄ«tÄjs nesÄks klausÄ«ties portÄ.
InicializÄcijas secÄ«ba: EDS, CDS, aktÄ«vÄ veselÄ«bas pÄrbaude, RDS, LDS. Ja ir iespÄjotas aktÄ«vÄs veselÄ«bas pÄrbaudes, satiksme sÄksies augÅ”up tikai pÄc vienas veiksmÄ«gas veselÄ«bas pÄrbaudes.
Ja klausÄ«tÄjs tika izveidots no jauna, vecais pÄriet uz DRAIN stÄvokli un tiks dzÄsts pÄc visu savienojumu aizvÄrÅ”anas vai taimauta beigÄm. --drain-time-s
, noklusÄjuma 10 minÅ«tes.
TurpinÄsim.
Avots: www.habr.com