Envoy. 1. Aleedung

Gréiss! Dëst ass e kuerzen Artikel deen d'Froen beäntwert: "Wat ass Envoy?", "Firwat ass et néideg?" an "wou ufänken?".

Wat ass dat?

Envoy ass e L4-L7 Balancer geschriwwen an C ++, fokusséiert op héich Leeschtung an Disponibilitéit. Engersäits ass dëst op iergendeng Manéier en Analog vun Nginx an Haproxy, vergläichbar a Leeschtung mat hinnen. Op der anerer Säit ass et méi op d'Mikroservicearchitektur orientéiert an huet Funktionalitéit net méi schlëmm wéi Java a Go Balancer, sou wéi Zuul oder Traefik.

Vergläichstabell vun Haproxy / nginx / Envoy, et behaapt net déi absolut Wourecht ze sinn, awer gëtt en allgemengt Bild.

nginx
haproxy
geschéckt
traefik

Stären op github
11.2k/spigel
1.1k/spigel
12.4k
27.6k

geschriwwen an
C
C
C ++
go

API
kee
nëmmen Socket / dréckt
dataplane / zéien
zitt

aktiv Gesondheetscheck
kee
jo
jo
jo

Open Tracing
externen Plugin
kee
jo
jo

J.W.T.
externen Plugin
kee
jo
kee

Extensioun
Lua/C
Lua/C
Lua/C++
kee

Wat fir

Dëst ass e jonke Projet, et feelt vill Saachen, e puer am fréie Alpha. Mee geschéckt, och wéinst senger Jugend, entwéckelt sech séier an huet scho vill interessant Features: dynamesch Konfiguratioun, vill fäerdeg Filteren, eng einfach Interface fir Är eege Filteren ze schreiwen.
Applikatiounsberäicher kommen dovun aus, awer als éischt ginn et 2 Antimuster:

  • Statesch Recoil.

D'Tatsaach ass, datt am Moment am geschéckt keng Caching Ënnerstëtzung. D'Google Kärelen probéieren dëst ze flécken. D'Iddi wäert eemol ëmgesat ginn geschéckt all d'Subtletien (Zoo Header) vun der RFC Konformitéit, a fir spezifesch Implementatiounen eng Interface maachen. Awer fir de Moment ass et net emol Alpha, d'Architektur ass ënner Diskussioun, PR oppen (während ech de PR-Artikel geschriwwen hunn, huet de PR gefruer, awer dëse Punkt ass nach ëmmer relevant).

Fir de Moment benotzt nginx fir Statik.

  • Statesch Configuratioun.

Dir kënnt et benotzen, mä geschéckt Dofir ass et net erstallt ginn. Features an enger statescher Konfiguratioun ginn net ausgesat. Et gi vill Momenter:

Wann Dir d'Konfiguratioun an yaml ännert, gitt Dir Iech falsch, schellt d'Entwéckler fir Verbositéit an denkt datt d'nginx / Haproxy Konfiguratiounen, obwuel manner strukturéiert, méi präzis sinn. Dat ass de Punkt. D'Konfiguratioun vun Nginx an Haproxy gouf erstallt fir mat der Hand z'änneren, an geschéckt fir Generatioun aus Code. Déi ganz Konfiguratioun gëtt an protobuf, et aus Protodateien ze generéieren ass vill méi schwéier e Feeler ze maachen.

Canary, b / g Deployment Szenarie a vill méi ginn normalerweis nëmmen an enger dynamescher Konfiguratioun ëmgesat. Ech soen net datt dat net statesch ka gemaach ginn, mir maachen et all. Mä fir dëst musst Dir op Crutches setzen, an engem vun de Balancer, an geschéckt abegraff.

Aufgaben fir déi den Envoy onverzichtbar ass:

  • Verkéiersbalancéierung a komplexen an dynamesche Systemer. Dëst beinhalt de Service Mesh, awer et ass net onbedéngt deen eenzegen.
  • De Besoin fir verdeelt Tracing Funktionalitéit, komplex Autorisatioun oder aner Funktionalitéit déi verfügbar ass geschéckt aus der Këscht oder bequem implementéiert, awer an nginx / Haproxy musst Dir vu lua an zweifelhafte Plugins ëmginn.

Béid, wann néideg, bidden héich Leeschtung.

Wéi heescht dat Aarbecht

Envoy gëtt a Binären nëmmen als Docker-Bild verdeelt. D'Bild enthält schonn e Beispill vun enger statesch Konfiguratioun. Mä mir sinn interesséiert et nëmmen fir d'Struktur ze verstoen.

envoy.yaml statesch Configuratioun

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

Dynamesch Configuratioun

Fir wat fir ee Problem sichen mir no enger Léisung? Dir kënnt net nëmmen d'Laaschtbalancer Konfiguratioun ënner Laascht nei lueden; "kleng" Probleemer entstoen:

  • Configuratioun Validatioun.

D'Configuratioun ka grouss sinn, et kann ganz grouss sinn, wa mir alles op eemol iwwerlaascht, erhéijen d'Chancen op e Feeler iergendwou.

  • Laang gelieft Verbindungen.

Wann Dir en neie Lauschterer initialiséiert, musst Dir ëm d'Verbindunge këmmeren déi op der aler lafen; wann Ännerungen dacks optrieden an et laanglieweg Verbindunge sinn, musst Dir no engem Kompromiss sichen. Hallo, kubernetes ingress op nginx.

  • Aktiv Gesondheetskontrolle.

Wa mir aktiv Gesondheetschecken hunn, musse mir se all an der neier Configuratioun duebel iwwerpréiwen ier Dir de Traffic schéckt. Wann et vill Upstream gëtt, brauch dat Zäit. Moien haproxy.

Wéi ass dëst geléist an geschécktAndeems Dir d'Konfiguratioun dynamesch gelueden hutt, laut dem Poolmodell, kënnt Dir et an getrennten Deeler opdeelen an den Deel deen net geännert huet nei initialiséieren. Zum Beispill en Nolauschterer, deen deier ass fir nei ze initialiséieren a seelen ännert.

Configuratioun geschéckt (vum Fichier hei uewen) huet déi folgend Entitéiten:

  • Nolauschterer - Nolauschterer hänkt op engem spezifeschen IP / Hafen
  • virtuelle Host - virtuelle Host mam Domain Numm
  • Wee - Equiliber Regel
  • Stärekoup - eng Grupp vu Upstreams mat Balanceparameter
  • Endpunkt - Upstream Instanz Adress

All eenzel vun dësen Entitéiten plus e puer anerer kënnen dynamesch ausgefëllt ginn; dofir spezifizéiert d'Konfiguratioun d'Adress vum Service vu wou d'Konfiguratioun kritt gëtt. De Service kann REST oder gRPC sinn, gRPC ass léiwer.

D'Servicer ginn respektiv genannt: LDS, VHDS, RDS, CDS an EDS. Dir kënnt statesch an dynamesch Konfiguratioun kombinéieren, mat der Begrenzung datt eng dynamesch Ressource net an enger statesch spezifizéiert ka ginn.

Fir déi meescht Aufgaben ass et genuch fir déi lescht dräi Servicer ëmzesetzen, si ginn ADS (Aggregated Discovery Service) genannt, fir Java a gitt do ass eng fäerdeg Ëmsetzung vun gRPC Dataplane an deem Dir just d'Objete vun Ärer Quell ausfëllt.

D'Konfiguratioun hëlt déi folgend Form:

envoy.yaml dynamesch Configuratioun

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

Beim Startup geschéckt mat dëser Configuratioun, wäert et un de Kontroll-Fliger verbannen a probéiert d'RDS, CDS an EDS Konfiguratioun ze froen. Wéi den Interaktiounsprozess geschitt ass beschriwwen hei.

Kurz gesoot, geschéckt schéckt eng Ufro déi d'Zort vun der Ressource ugefrot gëtt, d'Versioun an d'Parameter vum Node. Als Äntwert kritt et eng Ressource an eng Versioun; wann d'Versioun um Kontrollplan net geännert huet, reagéiert se net.
Et gi 4 Interaktiounsoptiounen:

  • Ee gRPC Stream fir all Zorte vu Ressourcen, de komplette Status vun der Ressource gëtt geschéckt.
  • Separat Baachen, voll Zoustand.
  • Ee Stroum, inkrementell Staat.
  • Separat Baachen, inkrementell Staat.

Inkrementell xDS erlaabt Iech Verkéier tëscht der Kontroll-Fliger ze reduzéieren an geschéckt, Dëst ass relevant fir grouss Konfiguratiounen. Awer et komplizéiert d'Interaktioun; d'Ufro enthält eng Lëscht vu Ressourcen fir sech z'ënnerschreiwen an ze abonnéieren.

Eist Beispill benotzt ADS - ee Stroum fir RDS, CDS, EDS an net-inkrementelle Modus. Fir inkrementell Modus z'aktivéieren, musst Dir spezifizéieren api_type: DELTA_GRPC

Zënter datt d'Ufro Nodeparameter enthält, kënne mir verschidde Ressourcen op d'Kontrollplan fir verschidden Instanzen schécken geschéckt, Dëst ass bequem fir e Service Mesh ze bauen.

Opwiermen

op geschéckt beim Startup oder wann Dir eng nei Konfiguratioun vu Kontrollplane kritt, gëtt de Ressourcewaarmprozess gestart. Et ass ënnerdeelt an Nolauschterer Warmup a Cluster Warmup. Déi éischt gëtt lancéiert wann et Ännerungen am RDS / LDS sinn, déi zweet wann CDS / EDS. Dëst bedeit datt wann nëmmen Upstreams änneren, den Nolauschterer net nei erstallt gëtt.

Wärend dem Erwiermungsprozess ginn ofhängeg Ressourcen vum Kontrollfliger wärend dem Timeout erwaart. Wann den Timeout geschitt ass, wäert d'Initialiséierung net erfollegräich sinn an den neie Lauschterer fänkt net um Hafen ze lauschteren.
Initialiséierungsuerdnung: EDS, CDS, aktive Gesondheetscheck, RDS, LDS. Mat aktive Gesondheetschecken aktivéiert, wäert de Traffic nëmmen no engem erfollegräiche Gesondheetscheck upstream goen.

Wann den Nolauschterer erstallt gouf, geet deen alen an den DRAIN-Status a gëtt geläscht nodeems all Verbindungen zougemaach sinn oder den Timeout eriwwer ass --drain-time-s, Standard 10 Minutten.

Fir weidergeleet gëtt.

Source: will.com

Setzt e Commentaire