Saluton! Ĉi tio estas mallonga artikolo, kiu respondas la demandojn: "kio estas sendito?", "kial ĝi bezonas?" kaj "kie komenci?".
Kio estas ĉi tio?
Envoy estas L4-L7-balancilo skribita en C++, koncentrita pri alta rendimento kaj havebleco. Unuflanke, ĉi tio estas iel analogo de nginx kaj haproxy, komparebla en rendimento al ili. Aliflanke, ĝi estas pli orientita al mikroserva arkitekturo kaj havas funkciojn ne pli malbonajn ol java and go balancers, kiel zuul aŭ traefik.
Kompartabelo de haproxy/nginx/envoy, ĝi ne pretendas esti la absoluta vero, sed donas ĝeneralan bildon.
nginx
haproxy
sendita
traefik
steloj sur github
11.2k/spegulo
1.1k/spegulo
12.4k
27.6k
skribita en
C
C
C ++
go
API
neniu
nur ingo/puŝo
datumplano/tiro
tiri
aktiva sankontrolo
neniu
jes
jes
jes
Malfermu spuron
ekstera kromaĵo
neniu
jes
jes
J.W.T.
ekstera kromaĵo
neniu
jes
neniu
pligrandigo
Lua/C
Lua/C
Lua/C++
neniu
Kial
Ĉi tio estas juna projekto, mankas multaj aferoj, iuj en frua alfa. Sed sendita, ankaŭ pro sia juneco, disvolviĝas rapide kaj jam havas multajn interesajn funkciojn: dinamika agordo, multaj pretaj filtriloj, simpla interfaco por skribi viajn proprajn filtrilojn.
Aplikaj kampoj sekvas de ĉi tio, sed unue estas 2 kontraŭŝablonoj:
- Senmova regreso.
La fakto estas, ke nuntempe en sendita neniu kaŝmemoro subteno. La Guglo-uloj provas ĉi tion
Nuntempe, uzu nginx por statiko.
- Statika agordo.
Vi povas uzi ĝin, sed sendita Ne por tio ĝi estis kreita. Trajtoj en senmova agordo ne estos elmontritaj. Estas multaj momentoj:
Kiam vi redaktas la agordon en yaml, vi eraros, riproĉos la programistojn pro multvorteco kaj pensu, ke la nginx/haproxy-agordoj, kvankam malpli strukturitaj, estas pli koncizaj. Jen la punkto. La agordo de Nginx kaj Haproxy estis kreita por redaktado permane, kaj sendita por generacio el kodo. La tuta agordo estas priskribita en
Kanariaj, b/g deplojscenaroj kaj multe pli estas normale efektivigitaj nur en dinamika agordo. Mi ne diras, ke tio ne povas esti farita statike, ni ĉiuj faras ĝin. Sed por tio vi devas surmeti lambastonojn, en iu ajn el la balanciloj, en sendita inkluzive.
Taskoj por kiuj Sendito estas nemalhavebla:
- Trafikbalancado en kompleksaj kaj dinamikaj sistemoj. Ĉi tio inkluzivas la servan maŝon, sed ĝi ne estas nepre la sola.
- La bezono de distribuita spura funkcieco, kompleksa rajtigo aŭ alia funkcieco disponebla en sendita el la skatolo aŭ oportune efektivigita, sed en nginx/haproxy vi devas esti ĉirkaŭita de lua kaj dubindaj kromaĵoj.
Ambaŭ, se necese, provizas altan rendimenton.
Kiel tio funkcias
Envoy estas distribuita en binaroj nur kiel docker-bildo. La bildo jam enhavas ekzemplon de statika agordo. Sed ni interesiĝas pri ĝi nur por kompreni la strukturon.
envoy.yaml statika agordo
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
Dinamika agordo
Al kiu problemo ni serĉas solvon? Vi ne povas simple reŝargi la agordon de ŝarĝbalancilo sub ŝarĝo; "malgrandaj" problemoj aperos:
- Valumado de agordo.
La agordo povas esti granda, ĝi povas esti tre granda, se ni superŝarĝas ĉion samtempe, la ŝancoj de eraro ie pliiĝas.
- Longvivaj ligoj.
Dum pravalorigo de nova aŭskultanto, vi devas zorgi pri la konektoj funkcianta sur la malnova; se ŝanĝoj okazas ofte kaj estas longdaŭraj konektoj, vi devos serĉi kompromison. Saluton, kubernetes eniras sur nginx.
- Aktivaj sankontroloj.
Se ni havas aktivajn sankontrolojn, ni devas duoble kontroli ilin ĉiujn en la nova agordo antaŭ sendi trafikon. Se estas multaj kontraŭfluoj, tio bezonas tempon. Saluton haproxy.
Kiel tio estas solvita en senditaŜargante la agordon dinamike, laŭ la naĝejo-modelo, vi povas dividi ĝin en apartajn partojn kaj ne rekomencigi la parton, kiu ne ŝanĝiĝis. Ekzemple, aŭskultanto, kiu estas multekosta rekomencigi kaj malofte ŝanĝiĝas.
Agordo sendita (el la supra dosiero) havas la jenajn entojn:
- aŭskultanto — aŭskultanto pendanta sur specifa ip/haveno
- virtuala gastiganto - virtuala gastiganto per domajna nomo
- itinero - ekvilibra regulo
- areto — grupo de kontraŭfluoj kun ekvilibraj parametroj
- finpunkto — kontraŭflua instancadreso
Ĉiu el ĉi tiuj entoj kaj iuj aliaj povas esti plenigitaj dinamike; por tio, la agordo specifas la adreson de la servo de kie la agordo estos ricevita. La servo povas esti REST aŭ gRPC, gRPC estas preferinda.
La servoj estas nomitaj respektive: LDS, VHDS, RDS, CDS kaj EDS. Vi povas kombini statikan kaj dinamikan agordon, kun la limigo, ke dinamika rimedo ne povas esti specifita en senmova.
Por plej multaj taskoj, sufiĉas efektivigi la lastajn tri servojn, ili nomiĝas ADS (Aggregated Discovery Service), por
La agordo prenas la jenan formon:
envoy.yaml dinamika agordo
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
Ĉe ekfunkciigo sendita kun ĉi tiu agordo, ĝi konektos al la kontrolaviadilo kaj provos peti la agordon RDS, CDS kaj EDS. Kiel la interaga procezo okazas estas priskribita
Mallonge, sendita sendas peton indikante la specon de rimedo petita, la versio kaj parametroj de la nodo. Responde, ĝi ricevas rimedon kaj version; se la versio sur la kontrolaviadilo ne ŝanĝiĝis, ĝi ne respondas.
Estas 4 interagaj opcioj:
- Unu gRPC-rivereto por ĉiuj specoj de rimedoj, la plena stato de la rimedo estas sendita.
- Apartaj riveretoj, plena kondiĉo.
- Unu fluo, pliiga stato.
- Apartaj riveretoj, pliiga stato.
Krementa xDS permesas redukti trafikon inter la kontrolaviadilo kaj sendita, ĉi tio estas grava por grandaj agordoj. Sed ĝi malfaciligas la interagadon; la peto enhavas liston de rimedoj por malaboni kaj aboni.
Nia ekzemplo uzas ADS - unu fluon por RDS, CDS, EDS kaj ne-pliiga reĝimo. Por ebligi pliigan reĝimon, vi devas specifi api_type: DELTA_GRPC
Ĉar la peto enhavas nodajn parametrojn, ni povas sendi malsamajn rimedojn al la kontrolaviadilo por malsamaj okazoj sendita, ĉi tio estas oportuna por konstrui servomaŝon.
Varmiĝo
En sendita ĉe ekfunkciigo aŭ kiam ricevas novan agordon de kontrol-aviadilo, la rimeda varmiga procezo estas lanĉita. Ĝi estas dividita en varmigo de aŭskultanto kaj varmigo de areto. La unua estas lanĉita kiam estas ŝanĝoj en RDS/LDS, la dua kiam CDS/EDS. Ĉi tio signifas, ke se nur kontraŭfluoj ŝanĝiĝas, la aŭskultanto ne estas rekreita.
Dum la varmiga procezo, dependaj resursoj estas atenditaj de la kontrolaviadilo dum la tempotempo. Se la tempoforigo okazas, inicialigo ne sukcesos kaj la nova aŭskultanto ne komencos aŭskulti sur la haveno.
Inicialiga ordo: EDS, CDS, aktiva sankontrolo, RDS, LDS. Kun aktivaj sankontroloj ebligitaj, trafiko iros kontraŭflue nur post unu sukcesa sankontrolo.
Se la aŭskultanto estis rekreita, la malnova iras en la DRAIN-ŝtaton kaj estos forigita post kiam ĉiuj konektoj estas fermitaj aŭ la tempo-tempo eksvalidiĝas. --drain-time-s
, defaŭlte 10 minutoj.
Daŭrigota.
fonto: www.habr.com