salam wanoh! Ieu mangrupikeun tulisan pondok anu ngajawab patarosan: "naon utusan?", "Naha éta diperyogikeun?" jeung "dimana ngamimitian?".
Naon ieu
Utusan mangrupa balancer L4-L7 ditulis dina C ++, fokus kana kinerja tinggi na kasadiaan. Di hiji sisi, ieu dina sababaraha cara analog tina nginx sareng haproxy, dibandingkeun dina pagelaranana. Di sisi anu sanésna, éta langkung berorientasi kana arsitéktur microservice sareng ngagaduhan fungsionalitas anu henteu langkung goréng tibatan java and go balancers, sapertos zuul atanapi traefik.
Tabel babandingan haproxy / nginx / utusan, éta henteu ngaku kabeneran mutlak, tapi masihan gambaran umum.
nginx
haproxy
dikirim
traefik
béntang dina github
11.2k / eunteung
1.1k / eunteung
12.4k
27.6k
ditulis dina
C
C
C ++
go
API
teu
ngan stop kontak / push
dataplane / narik
Betot
cek kaséhatan aktip
teu
nuhun
nuhun
nuhun
Buka nyukcruk
plugin éksternal
teu
nuhun
nuhun
J.W.T.
plugin éksternal
teu
nuhun
teu
ngahadean
Lua/C
Lua/C
Lua/C++
teu
Kunaon
Ieu proyek ngora, aya loba hal leungit, sababaraha dina alfa mimiti. Tapi dikirim, ogé alatan nonoman na, ngembang pesat sarta geus boga loba fitur metot: konfigurasi dinamis, loba saringan siap-dijieun, panganteur basajan pikeun nulis saringan anjeun sorangan.
Wewengkon aplikasi nuturkeun ti ieu, tapi mimitina aya 2 antipatterns:
- Recoil statik.
Kanyataan yén dina momen dina dikirim euweuh rojongan cache. The guys Google nyobian ieu
Pikeun ayeuna, nganggo nginx pikeun statik.
- Konfigurasi statik.
Anjeun tiasa make eta, tapi dikirim Éta sanés kanggo naon éta diciptakeun. Fitur dina konfigurasi statik moal kakeunaan. Aya seueur momen:
Nalika ngédit konfigurasi di yaml, anjeun bakal salah kaprah, scold pamekar pikeun verbosity sarta mikir yén nginx / haproxy configs, sanajan kirang terstruktur, leuwih singket. Éta titik. Konfigurasi Nginx na Haproxy dijieun pikeun ngédit ku leungeun, jeung dikirim pikeun generasi ti kode. Sakabéh konfigurasi dijelaskeun dina
Kanaria, skenario panyebaran b/g sareng seueur deui biasana dilaksanakeun ngan dina konfigurasi dinamis. Abdi henteu nyarios yén ieu henteu tiasa dilakukeun sacara statis, urang sadayana ngalakukeunana. Tapi pikeun ieu anjeun kudu ditunda crutches, dina salah sahiji balancers, di dikirim kaasup.
Tugas nu Utusan téh indispensable:
- Balancing lalulintas dina sistem anu kompleks sareng dinamis. Ieu kaasup bolong jasa, tapi teu merta hiji-hijina.
- Kabutuhan pikeun fungsi tracing disebarkeun, otorisasina kompléks atanapi fungsionalitas séjén nu sadia dina dikirim out of the box atawa merenah dilaksanakeun, tapi nginx / haproxy Anjeun kudu dikurilingan ku lua jeung plugins dubious.
Duanana, upami diperlukeun, nyadiakeun kinerja tinggi.
Kumaha teu karya ieu
Utusan disebarkeun dina binér ukur salaku gambar docker. Gambarna parantos ngandung conto konfigurasi statik. Tapi urang museurkeun eta ngan pikeun pamahaman struktur.
envoy.yaml konfigurasi statik
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
Konfigurasi dinamis
Masalah naon anu urang milarian solusi? Anjeun teu tiasa ngan ukur ngamuat konfigurasi pangimbang beban dina beban; masalah "leutik" bakal timbul:
- Konfigurasi validasi.
Konfigurasi tiasa ageung, tiasa ageung pisan, upami urang ngagentos sadayana sakaligus, kamungkinan kasalahan dimana waé ningkat.
- sambungan lila-cicing.
Nalika ngamimitian pangdéngé anyar, anjeun kedah ngurus sambungan anu dijalankeun dina anu lami; upami parobihan sering lumangsung sareng aya sambungan anu umurna panjang, anjeun kedah milarian kompromi. Halo, kubernetes asup kana nginx.
- Cék kaséhatan aktip.
Upami urang gaduh cék kaséhatan anu aktip, urang kedah pariksa dua kali sadayana dina konfigurasi énggal sateuacan ngirim lalu lintas. Upami aya seueur hulu, ieu peryogi waktos. Halo haproxy.
Kumaha ieu direngsekeun dina dikirimKu ngamuat config dinamis, nurutkeun model kolam renang, anjeun tiasa ngabagi kana bagian misah tur teu ulang initialize bagian nu teu robah. Contona, hiji pangdéngé, nu mahal pikeun reinitialize sarta jarang robah.
Konfigurasi dikirim (tina file di luhur) ngagaduhan éntitas ieu:
- panguping - pangdéngé ngagantung dina ip husus / port
- host virtual - host virtual ku ngaran domain
- rute - aturan kasaimbangan
- klaster - grup hulu kalawan parameter balancing
- titik - alamat conto hulu
Unggal éntitas ieu ditambah sababaraha anu sanésna tiasa dieusi sacara dinamis; pikeun ieu, konfigurasi netepkeun alamat jasa ti mana konfigurasi bakal ditampi. Palayanan tiasa REST atanapi gRPC, gRPC langkung saé.
Ladenan kasebut dingaranan masing-masing: LDS, VHDS, RDS, CDS sareng EDS. Anjeun tiasa ngagabungkeun konfigurasi statik sareng dinamis, kalayan watesan yén sumber daya dinamis henteu tiasa disaluyukeun dina statik.
Kanggo sabagéan ageung tugas, cukup pikeun nerapkeun tilu jasa anu terakhir, aranjeunna disebut ADS (Aggregated Discovery Service), pikeun
Konfigurasi nyandak bentuk ieu:
envoy.yaml konfigurasi dinamis
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
Dina ngamimitian dikirim kalawan config ieu, eta bakal nyambung ka kontrol-pesawat sarta nyoba menta RDS, CDS na EDS konfigurasi. Kumaha prosés interaksi lumangsung dijelaskeun
Pondokna, dikirim ngirimkeun pamundut anu nunjukkeun jinis sumberdaya anu dipénta, versi sareng parameter titik. Salaku réspon, éta nampi sumber sareng versi; upami versi dina pesawat kontrol henteu robih, éta henteu ngaréspon.
Aya 4 pilihan interaksi:
- Hiji aliran gRPC pikeun sakabéh jenis sumberdaya, status pinuh sumberdaya dikirim.
- aliran misah, kaayaan pinuh.
- Hiji aliran, kaayaan incremental.
- Aliran misah, kaayaan incremental.
xDS Incremental ngidinan Anjeun pikeun ngurangan lalulintas antara kontrol-pesawat jeung dikirim, ieu relevan pikeun konfigurasi badag. Tapi éta ngahesekeun interaksi; pamundut éta ngandung daptar sumber daya pikeun ngalanggan sareng ngalanggan.
Conto kami nganggo ADS - hiji aliran pikeun RDS, CDS, EDS sareng mode non-incremental. Pikeun ngaktipkeun mode incremental, Anjeun kudu nangtukeun api_type: DELTA_GRPC
Kusabab pamundut ngandung parameter titik, urang bisa ngirim sumberdaya béda ka kontrol-pesawat pikeun instansi béda dikirim, Ieu merenah pikeun ngawangun bolong jasa.
Pamanasan
on dikirim dina ngamimitian atawa nalika narima konfigurasi anyar tina kontrol-pesawat, prosés pemanasan sumberdaya dijalankeun. Ieu dibagi kana warmup pangdéngé jeung warmup klaster. Kahiji dibuka nalika aya parobahan dina RDS / LDS, kadua nalika CDS / EDS. Ieu ngandung harti yén lamun ngan upstreams robah, pangdéngé teu recreated.
Salila prosés pemanasan, sumber gumantungna diharepkeun tina kontrol-pesawat salila timeout. Lamun timeout lumangsung, initialization moal suksés sarta pangdéngé anyar moal ngamimitian ngadengekeun on port nu.
Urutan initialization: EDS, CDS, cek kaséhatan aktip, RDS, LDS. Kalayan cék kaséhatan aktip diaktipkeun, patalimarga bakal balik hulu ngan sanggeus hiji dipariksa kaséhatan suksés.
Upami pangdéngé diciptakeun deui, anu lami janten kaayaan DRAIN sareng bakal dipupus saatos sadaya sambungan ditutup atanapi waktos béakna. --drain-time-s
, standar 10 menit.
Terus dituluykeun.
sumber: www.habr.com