salam wanoh! Tulisan pondok ieu ngajawab patarosan: "Naon éta Utusan?", "Naha kuring peryogi éta?", sareng "Timana kuring ngamimitian?"
Naon ieu
Utusan mangrupikeun penyeimbang beban L4-L7 anu ditulis dina C ++, fokus kana kinerja sareng kasadiaan anu luhur. Di hiji sisi, éta rada analog sareng nginx sareng haproxy, dibandingkeun dina pagelaran. Di sisi anu sanés, éta langkung diarahkeun kana arsitéktur microservice sareng nawiskeun fungsionalitas anu dibandingkeun sareng Java sareng Go load balancers, sapertos zuul atanapi traefik.
The haproxy / nginx / tabel ngabandingkeun utusan teu ngaku bebeneran mutlak, tapi méré 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 di antarana aya dina alfa mimiti. Tapi dikirim, sabagean 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 ieu, tapi kahiji, dua pola anti:
- Recoil statik.
Hal éta dina momen dina dikirim Henteu aya pangrojong cache. The guys di Google nyobian ngalereskeun eta. Ide pikeun ngalaksanakeunana sakali-kali dikirim Sadaya subtleties (kebon binatang tina headers) patuh RFC, sarta nyieun hiji panganteur pikeun palaksanaan husus. Tapi ieu mah malah alfa acan; arsitéktur masih dina sawala. kabuka (bari kuring nulis artikel, PR ngahiji, tapi titik ieu masih relevan).
Samentawis éta, nganggo nginx pikeun statik.
- Konfigurasi statik.
Anjeun tiasa make eta, tapi dikirim Éta henteu diciptakeun pikeun tujuan ieu. Kamampuhan konfigurasi statik moal diwujudkeun sapinuhna. Aya seueur titik:
Nalika ngédit konfigurasi YAML, anjeun bakal nyieun kasalahan, kutukan pamekar pikeun teuing verbose, sarta mikir yén nginx / haproxy configs, bari kirang terstruktur, leuwih singket. Éta titik. Konfigurasi Nginx sareng Haproxy didamel pikeun ngedit manual, sedengkeun dikirim pikeun generasi ti kode. Sakabéh konfigurasi dijelaskeun dina , ngahasilkeun tina file proto ngajadikeun eta leuwih hésé nyieun kasalahan.
skenario Kanaria, b / g deployments, sarta loba hal séjén ngan bisa dilaksanakeun leres dina konfigurasi dinamis. Abdi teu ngaraos nyebutkeun aranjeunna teu bisa dipigawé statis; urang sadayana ngalakukeun éta. Tapi pikeun ngalakukeunana, anjeun kedah nganggo sababaraha workarounds, dina kasaimbangan naon waé, dina dikirim kaasup.
Tugas dimana Utusan téh indispensable:
- Balancing lalulintas dina sistem anu kompleks sareng dinamis. Ieu kalebet bolong jasa, tapi henteu kedah dugi ka éta.
- Kabutuhan pikeun ngalacak anu disebarkeun, otorisasi kompleks, atanapi fungsionalitas sanés anu sayogi dikirim Ieu boh gampang pikeun nerapkeun out of the box atawa merenah, bari di nginx / haproxy anjeun kudu mungkus diri di lua jeung plugins questionable.
Duanana sadia pikeun nyadiakeun kinerja tinggi lamun diperlukeun.
Kumaha teu karya ieu
Utusan disebarkeun salaku gambar Docker binér wungkul. Gambarna parantos kalebet conto konfigurasi statik, tapi urang ngan ukur kabetot pikeun ngartos strukturna.
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.comKonfigurasi dinamis
Masalah naon anu urang pilari pikeun ngajawab? Urang teu bisa saukur ngamuat konfigurasi load balancer; sababaraha masalah "minor" bakal timbul:
- Konfigurasi validasi.
Konfigurasi tiasa ageung, tiasa ageung pisan, upami urang ngagentos sadayana sakaligus, kamungkinan kasalahan dimana waé ningkat.
- Sanyawa umur panjang.
Nalika ngamimitian pangdéngé anyar, anjeun kedah ngurus sambungan anu dijalankeun dina anu lami. Upami parobihan sering kajantenan 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 aktip, urang kedah parios deui sadayana dina konfigurasi énggal sateuacan ngirim lalu lintas. Upami aya seueur hulu, ieu peryogi waktos. Halo, haproxy.
Kumaha ieu direngsekeun dina dikirimKu ngamuat konfigurasi sacara dinamis nganggo kolam renang modél, anjeun tiasa ngabagi kana bagian-bagian anu misah sareng ngahindarkeun deui bagian-bagian anu teu acan robih. Contona, hiji pangdéngé, nu mahal pikeun reinitialize sarta jarang robah, bisa dipaké.
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, sareng sababaraha anu sanés, tiasa dieusi sacara dinamis ku netepkeun alamat jasa dimana konfigurasi bakal dicandak dina konfigurasi. Palayanan tiasa janten REST atanapi gRPC, tapi gRPC langkung dipikaresep.
Ladenan ieu dingaranan sasuai: LDS, VHDS, RDS, CDS, sareng EDS. Konfigurasi statik sareng dinamis tiasa digabungkeun, sareng caveat yén sumber daya dinamis teu tiasa disaluyukeun dina hiji statik.
Kanggo sabagéan ageung tugas, cukup pikeun nerapkeun tilu jasa anu terakhir, aranjeunna disebut ADS (Aggregated Discovery Service), pikeun jeung buka boga palaksanaan siap-dijieun tina gRPC dataplane, nu anjeun ngan perlu ngeusian objék tina sumber Anjeun.
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: 6565Dina ngamimitian dikirim Kalayan konfigurasi ieu, éta bakal nyambung ka pesawat kontrol sareng nyobian nyuhunkeun konfigurasi RDS, CDS, sareng EDS. Prosés interaksi digambarkeun di handap. .
Pondokna, dikirim Ngirimkeun pamundut anu nangtukeun jinis sumberdaya anu dipénta, versi, sareng parameter titik. Éta nampi sumber sareng versi pikeun ngaréspon. Upami versi dina pesawat kontrol henteu robih, éta henteu ngaréspon.
Aya 4 pilihan pikeun interaksi:
- Hiji aliran gRPC pikeun sakabéh jenis sumberdaya, kaayaan sumberdaya pinuh dikirim.
- aliran misah, kaayaan pinuh.
- Hiji aliran, kaayaan incremental.
- Aliran misah, kaayaan incremental.
xDS Incremental ngamungkinkeun pikeun ngurangan lalulintas antara kontrol-pesawat jeung dikirimIeu relevan pikeun konfigurasi badag. Sanajan kitu, éta complicates interaksi, sakumaha pamundut merlukeun daptar sumberdaya unsubscribe sarta ngalanggan.
Conto urang ngagunakeun 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 pesawat kontrol pikeun instansi béda. dikirim, Ieu merenah pikeun ngawangun bolong jasa.
Pamanasan
on dikirim Nalika ngamimitian atanapi nalika nampi konfigurasi énggal tina pesawat kontrol, prosés pemanasan sumberdaya diluncurkeun. Ieu dibagi kana warmup pangdéngé jeung warmup klaster. Urut dibuka nalika RDS / LDS robah, dimungkinkeun nalika CDS / EDS robah. Ieu ngandung harti yén lamun ngan upstreams robah, pangdéngé teu recreated.
Salila prosés pemanasan, sumber daya gumantung tina pesawat kontrol diantosan salami waktosna. Lamun waktuna tamat, initialization bakal gagal, sarta pangdéngé anyar moal ngamimitian ngadangukeun on port nu.
Urutan initialization: EDS, CDS, cek kaséhatan aktip, RDS, LDS. Upami pamariksaan kaséhatan aktip diaktipkeun, lalu lintas ngan bakal ka hulu saatos pamariksaan 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
