Izaslanik. 1. Uvod

Pozdrav! Ovaj kratki članak odgovara na pitanja: "Što je Envoy?", "Zašto mi je potreban?" i "Gdje da počnem?"

Što je ovo

Envoy je L4-L7 alat za uravnoteženje opterećenja napisan u C++, usmjeren na visoke performanse i dostupnost. S jedne strane, donekle je analogan nginxu i haproxyju, usporedivih performansi. S druge strane, više je usmjeren na mikroservisne arhitekture i nudi funkcionalnost usporedivu s Java i Go alatima za uravnoteženje opterećenja, kao što su zuul ili traefik.

Tablica usporedbe haproxy/nginx/envoy ne tvrdi da je apsolutna istina, ali daje opću sliku.

Nginx
haproksi
poslao
traefik

zvijezde na GitHubu
11.2 tisuće/zrcalo
1.1 tisuće/zrcalo
12.4k
27.6k

napisano u
C
C
C + +
go

API
ne
samo utičnica/pritisni
podatkovna ravnina/pull
povući

aktivna provjera zdravlja
ne
da
da
da

Otvori praćenje
vanjski dodatak
ne
da
da

J.W.T.
vanjski dodatak
ne
da
ne

nastavak
Lua/C
Lua/C
Lua/C++
ne

Što za

Ovo je mladi projekt, puno toga nedostaje, neke od njih su u ranoj alfa verziji. Ali poslao, dijelom zbog svoje mladosti, brzo se razvija i već ima mnogo zanimljivih značajki: dinamičku konfiguraciju, mnogo gotovih filtera, jednostavno sučelje za pisanje vlastitih filtera.
Iz ovoga proizlaze područja primjene, ali prvo, dva anti-obrasca:

  • Statički trzaj.

Stvar je u tome što trenutno u poslao Nema podrške za keširanje. Ekipa u Googleu pokušava to popraviti. popravitiIdeja je da se to implementira s vremena na vrijeme poslao Sve suptilnosti (zoološki vrt zaglavlja) RFC usklađenosti i stvaranje sučelja za specifične implementacije. Ali ovo još nije ni alfa verzija; arhitektura je još uvijek u raspravi. PR otvoreno (dok sam pisao članak, PR se spojio, ali ova točka je i dalje relevantna).

U međuvremenu, koristite nginx za statiku.

  • Statička konfiguracija.

Možeš ga koristiti, ali poslao Nije stvoreno za tu svrhu. Mogućnosti statičke konfiguracije neće biti u potpunosti ostvarene. Postoji mnogo točaka:

Prilikom uređivanja YAML konfiguracije, radit ćete pogreške, proklinjući programere zbog previše opširnog pisanja i misleći da su nginx/haproxy konfiguracije, iako manje strukturirane, konciznije. To je poanta. Konfiguracije Nginxa i Haproxyja stvorene su za ručno uređivanje, dok poslao za generiranje iz koda. Cijela konfiguracija je opisana u protobuf, generiranje iz proto datoteka znatno otežava pogrešku.

Canary scenariji, b/g implementacije i mnoge druge stvari mogu se ispravno implementirati samo u dinamičkoj konfiguraciji. Ne kažem da se ne mogu izvesti statički; svi to radimo. Ali da biste to učinili, morali biste pribjeći nekim zaobilaznim rješenjima, u bilo kojem balanseru, u poslao uključujući.

Zadaci gdje je Envoy nezamjenjiv:

  • Balansiranje prometa u složenim i dinamičnim sustavima. To uključuje servisnu mrežu, ali nije nužno ograničeno na nju.
  • Potreba za distribuiranim praćenjem, složenom autorizacijom ili drugom funkcionalnošću koja je dostupna u poslao Ili je jednostavno implementirati odmah ili praktično, dok se u nginxu/haproxyju morate zamotati u lua i upitne dodatke.

Oba su dostupna za pružanje visokih performansi kada je to potrebno.

Kako ovo radi

Envoy se distribuira samo kao binarna Docker slika. Slika već uključuje primjer statičke konfiguracije, ali nas zanima samo kako bismo razumjeli strukturu.

Statička konfiguracija envoy.yaml

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

Dinamička konfiguracija

Koji problem želimo riješiti? Ne možemo jednostavno ponovno učitati konfiguraciju uravnoteživača opterećenja; pojavit će se neki "manji" problemi:

  • Validacija konfiguracije.

Konfiguracija može biti velika, može biti jako velika, ako je odjednom preopteretimo, povećavaju se šanse za grešku negdje.

  • Dugotrajni spojevi.

Prilikom inicijalizacije novog slušača, morate se pobrinuti za veze koje se izvode na starom. Ako se promjene događaju često i postoje dugotrajne veze, morat ćete pronaći kompromis. Pozdrav, Kubernetes ingress na nginxu.

  • Aktivne zdravstvene provjere.

Ako imamo aktivne provjere ispravnosti, trebali bismo ih sve ponovno provjeriti na novoj konfiguraciji prije slanja prometa. Ako ima puno uzvodnih tokova, to traje neko vrijeme. Pozdrav, haproxy.

Kako se ovo rješava u poslaoDinamičkim učitavanjem konfiguracije pomoću skupa modela možete je podijeliti na odvojene dijelove i izbjeći ponovnu inicijalizaciju dijelova koji se nisu promijenili. Na primjer, može se koristiti slušač, čija je ponovna inicijalizacija skupa i rijetko se mijenja.

Konfiguracija poslao (iz gornje datoteke) ima sljedeće entitete:

  • slušalac — slušač koji visi na određenoj IP adresi/portu
  • virtualni host — virtualni host prema nazivu domene
  • put - pravilo uravnoteženja
  • grozd — skupina uzvodnih vodova s ​​parametrima uravnoteženja
  • krajnja — adresa uzvodne instance

Svaki od ovih entiteta, zajedno s nekim drugima, može se dinamički popuniti navođenjem adrese servisa s kojeg će se konfiguracija dohvatiti u konfiguraciji. Servis može biti REST ili gRPC, ali gRPC je poželjniji.

Usluge su nazvane u skladu s tim: LDS, VHDS, RDS, CDS i EDS. Statičke i dinamičke konfiguracije mogu se kombinirati, uz napomenu da se dinamički resurs ne može specificirati unutar statičkog.

Za većinu zadataka dovoljno je implementirati posljednje tri usluge, one se nazivaju ADS (Aggregated Discovery Service), za Java i go ima gotovu implementaciju gRPC podatkovne ravnine, u kojoj samo trebate popuniti objekte iz svog izvora.

Konfiguracija ima sljedeći oblik:

dinamička konfiguracija envoy.yaml

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

Prilikom pokretanja poslao S ovom konfiguracijom, spojit će se na upravljačku ravninu i pokušati zatražiti konfiguraciju RDS-a, CDS-a i EDS-a. Proces interakcije opisan je u nastavku. здесь.

Ukratko, poslao Šalje zahtjev u kojem se navodi vrsta traženog resursa, verzija i parametri čvora. Kao odgovor prima resurs i verziju. Ako se verzija na upravljačkoj ravnini nije promijenila, ne odgovara.
Postoje 4 mogućnosti za interakciju:

  • Jedan gRPC stream za sve vrste resursa, šalje se puno stanje resursa.
  • Odvojeni potoci, potpuno stanje.
  • Jedan tok, inkrementalno stanje.
  • Odvojeni tokovi, inkrementalno stanje.

Inkrementalni xDS omogućuje smanjenje prometa između upravljačke ravnine i poslaoOvo je relevantno za velike konfiguracije. Međutim, komplicira interakciju jer zahtjev zahtijeva popis resursa za odjavu i pretplatu.

Naš primjer koristi ADS - jedan stream za RDS, CDS, EDS i neinkrementalni način rada. Za omogućavanje inkrementalnog načina rada potrebno je odrediti api_type: DELTA_GRPC

Budući da zahtjev sadrži parametre čvora, možemo poslati različite resurse upravljačkoj ravnini za različite instance. poslao, ovo je praktično za izgradnju servisne mreže.

Zagrijati se

Na poslao Prilikom pokretanja ili primanja nove konfiguracije iz kontrolne ravnine, pokreće se proces zagrijavanja resursa. Podijeljen je na zagrijavanje slušača i zagrijavanje klastera. Prvo se pokreće kada se promijeni RDS/LDS, a drugo kada se promijeni CDS/EDS. To znači da ako se promijene samo uzvodni kanali, slušač se ne ponovno stvara.

Tijekom procesa zagrijavanja, ovisni resursi iz kontrolne ravnine čekaju se tijekom vremenskog ograničenja. Ako vremensko ograničenje istekne, inicijalizacija neće uspjeti i novi slušač neće početi slušati na portu.
Redoslijed inicijalizacije: EDS, CDS, aktivna provjera ispravnosti, RDS, LDS. Ako su omogućene aktivne provjere ispravnosti, promet će ići uzvodno tek nakon jedne uspješne provjere ispravnosti.

Ako se slušač ponovno kreira, stari prelazi u stanje DRAIN i bit će izbrisan nakon što se sve veze zatvore ili istekne vremensko ograničenje. --drain-time-s, zadano 10 minuta.

Nastaviti.

Izvor: www.habr.com

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster