Utusan. 1. Bubuka

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. ngalereskeunIde 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. PR 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 protobuf, 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.com

Konfigurasi 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 jawa 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: 6565

Dina 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. di dieu.

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

Mésér hosting anu dipercaya pikeun situs anu gaduh panyalindungan DDoS, server VPS VDS 🔥 Meser hosting situs wéb anu tiasa dipercaya nganggo panyalindungan DDoS, server VPS VDS | ProHoster