Utusan. 1. Bubuka

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 ngalereskeun. Ide bakal dilaksanakeun sakali dina dikirim kabéh subtleties (kebon binatang headers) tina RFC minuhan, sarta pikeun palaksanaan husus ngadamel panganteur. Tapi pikeun ayeuna éta sanés alfa, arsitékturna nuju dibahas, PR kabuka (bari kuring nulis artikel PR, PR froze, tapi titik ieu masih relevan).

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 protobuf, ngahasilkeun tina file proto langkung hese pikeun ngalakukeun kasalahan.

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 jawa tur buka aya palaksanaan siap-dijieun tina gRPC dataplane nu ngan perlu ngeusian dina 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 kalawan config ieu, eta bakal nyambung ka kontrol-pesawat sarta nyoba menta RDS, CDS na EDS konfigurasi. Kumaha prosés interaksi lumangsung dijelaskeun di dieu.

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

Tambahkeun komentar