Sugo. 1. Pasiuna

Mga pangomosta! Kini usa ka mubo nga artikulo nga nagtubag sa mga pangutana: "unsa ang sinugo?", "ngano nga kinahanglan kini?" ug "asa magsugod?".

Unsa kini

Ang Envoy usa ka L4-L7 balancer nga gisulat sa C ++, nga naka-focus sa taas nga pasundayag ug pagkaanaa. Sa usa ka bahin, kini sa usa ka paagi usa ka analogue sa nginx ug haproxy, nga ikatandi sa pasundayag sa kanila. Sa laing bahin, kini mas nakapunting sa microservice nga arkitektura ug adunay pagpaandar nga dili mas grabe kay sa java ug go balancers, sama sa zuul o traefik.

Talaan sa pagtandi sa haproxy / nginx / envoy, wala kini nag-angkon nga hingpit nga kamatuoran, apan naghatag usa ka kinatibuk-ang litrato.

nginx
haproxy
nagpadala
traefik

mga bituon sa github
11.2k/salamin
1.1k/salamin
12.4k
27.6k

gisulat sa
C
C
C ++
go

API
dili
socket lang/push
dataplane/pagbira
pagbitad

aktibo nga pagsusi sa kahimsog
dili
oo
oo
oo

Bukas nga pagsubay
gawas nga plugin
dili
oo
oo

Ang JWT
gawas nga plugin
dili
oo
dili

extension
Lua/C
Lua/C
Lua/C++
dili

Alang alang

Kini usa ka batan-on nga proyekto, adunay daghang mga butang nga nawala, ang uban sa sayo nga alpha. Apan nagpadala, tungod usab sa iyang pagkabatan-on, paspas nga nag-uswag ug adunay daghang makapaikag nga mga bahin: dinamikong pag-configure, daghang andam nga mga pagsala, usa ka yano nga interface alang sa pagsulat sa imong kaugalingon nga mga pagsala.
Ang mga lugar sa aplikasyon nagsunod gikan niini, apan una adunay 2 nga mga antipattern:

  • Static recoil.

Ang kamatuoran mao nga sa pagkakaron sa nagpadala walay suporta sa caching. Gisulayan kini sa mga tawo sa Google pag-ayo. Ang ideya ipatuman sa makausa sa nagpadala ang tanan nga mga subtleties (zoo header) sa pagsunod sa RFC, ug alang sa piho nga mga pagpatuman maghimo usa ka interface. Apan sa pagkakaron dili pa kini alpha, ang arkitektura gihisgutan, PR bukas (samtang nagsulat ako sa artikulo sa PR, ang PR nagyelo, apan kini nga punto may kalabutan gihapon).

Sa pagkakaron, gamita ang nginx para sa statics.

  • Static nga configuration.

Mahimo nimo kini gamiton, apan nagpadala Dili kana kung unsa kini gilalang. Ang mga feature sa usa ka static nga configuration dili ibutyag. Adunay daghang mga higayon:

Kung gi-edit ang configuration sa yaml, masayop ka, sawayon ang mga developers alang sa verbosity ug hunahunaa nga ang nginx/haproxy configs, bisan dili kaayo structured, mas mubo. Mao na ang punto. Ang pag-configure sa Nginx ug Haproxy gihimo alang sa pag-edit pinaagi sa kamot, ug nagpadala alang sa henerasyon gikan sa code. Ang tibuok nga configuration gihulagway sa protobuf, ang paghimo niini gikan sa mga proto file labi ka lisud nga masayop.

Ang Canary, b/g deployment scenario ug daghan pa kay kasagarang gipatuman lang sa dinamikong configuration. Wala ako nag-ingon nga dili kini mahimo nga static, buhaton naton tanan. Apan alang niini kinahanglan nimo nga isul-ob ang mga saklay, sa bisan unsang mga balanse, sa nagpadala apil.

Mga buluhaton nga gikinahanglan sa Envoy:

  • Pagbalanse sa trapiko sa komplikado ug dinamikong mga sistema. Naglakip kini sa mesh sa serbisyo, apan dili kinahanglan nga usa ra.
  • Ang panginahanglan alang sa giapod-apod nga pagsubay sa pag-andar, komplikado nga pagtugot o uban pang gamit nga magamit sa nagpadala gikan sa kahon o sayon ​​​​nga gipatuman, apan sa nginx / haproxy kinahanglan nimo nga mapalibutan sa lua ug mga dubious plugins.

Ang duha, kung gikinahanglan, naghatag og taas nga performance.

Unsa nga paagi nga kini nga buhat

Ang Envoy giapod-apod sa mga binary lamang ingon usa ka imahe sa docker. Ang hulagway aduna nay usa ka pananglitan sa usa ka static nga configuration. Apan kami interesado niini alang lamang sa pagsabut sa istruktura.

envoy.yaml static nga configuration

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

Dinamikong configuration

Unsa nga problema ang atong gipangita nga solusyon? Dili lang nimo ma-reload ang configuration sa load balancer ubos sa load; mutungha ang "gamay" nga mga problema:

  • Pag-validate sa pag-configure.

Ang config mahimo nga dako, kini mahimong dako kaayo, kon kita mag-overload sa tanan sa usa ka higayon, ang mga kahigayonan sa usa ka sayop sa usa ka dapit sa pagdugang.

  • Madugay nga mga koneksyon.

Sa pagsugod sa usa ka bag-ong tigpaminaw, kinahanglan nimo nga atimanon ang mga koneksyon nga nagdagan sa daan; kung ang mga pagbag-o kanunay nga mahitabo ug adunay dugay nga mga koneksyon, kinahanglan nimo pangitaon ang usa ka kompromiso. Hello, kubernetes ingress sa nginx.

  • Aktibo nga pagsusi sa kahimsog.

Kung kami adunay aktibo nga mga pagsusi sa kahimsog, kinahanglan namon nga susihon kini tanan sa bag-ong config sa dili pa ipadala ang trapiko. Kung adunay daghang mga upstream, kini nagkinahanglag panahon. Hello haproxy.

Giunsa kini pagsulbad sa nagpadalaPinaagi sa pag-load sa config nga dinamiko, sumala sa modelo sa pool, mahimo nimong bahinon kini sa lainlaing mga bahin ug dili i-re-initialize ang bahin nga wala mausab. Pananglitan, ang usa ka tigpaminaw, nga mahal sa pag-reinitialize ug panagsa ra mausab.

Pagsalig nagpadala (gikan sa file sa ibabaw) adunay mosunod nga mga entidad:

  • tigpaminaw β€” tigpaminaw nga nagbitay sa usa ka piho nga ip/port
  • virtual nga host - virtual host pinaagi sa domain name
  • ruta - pagbalanse nga lagda
  • cluster - usa ka grupo sa mga upstream nga adunay mga parameter sa pagbalanse
  • katapusang punto β€” adres sa upstream nga pananglitan

Ang matag usa niini nga mga entidad ug uban pa mahimong mapuno sa dinamikong paagi; tungod niini, ang configuration nagtino sa adres sa serbisyo gikan diin ang config madawat. Ang serbisyo mahimong REST o gRPC, gRPC mas gusto.

Ang mga serbisyo gihinganlan matag usa: LDS, VHDS, RDS, CDS ug EDS. Mahimo nimong ikombinar ang static ug dynamic nga configuration, uban ang limitasyon nga ang usa ka dinamikong kapanguhaan dili matino sa usa ka static.

Alang sa kadaghanan nga mga buluhaton, igo na nga ipatuman ang katapusan nga tulo nga mga serbisyo, kini gitawag nga ADS (Aggregated Discovery Service), alang sa java ug adto adunay andam nga pagpatuman sa gRPC dataplane diin kinahanglan nimo nga pun-on ang mga butang gikan sa imong gigikanan.

Ang configuration nagkinahanglan sa mosunod nga porma:

envoy.yaml dinamikong configuration

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

Sa pagsugod nagpadala uban niini nga config, kini magkonektar sa control-plane ug mosulay sa paghangyo sa RDS, CDS ug EDS configuration. Gihulagway kung giunsa ang proseso sa interaksyon mahitabo dinhi.

Sa laktod, nagpadala nagpadala ug hangyo nga nagpakita sa matang sa kahinguhaan nga gipangayo, ang bersyon ug mga parametro sa node. Agig tubag, nakadawat kini usa ka kapanguhaan ug usa ka bersyon; kung ang bersyon sa control-plane wala mausab, dili kini motubag.
Adunay 4 ka opsyon sa interaksyon:

  • Usa ka stream sa gRPC alang sa tanan nga mga matang sa mga kapanguhaan, ang tibuuk nga kahimtang sa kapanguhaan gipadala.
  • Lahi nga mga sapa, hingpit nga kahimtang.
  • Usa ka sapa, incremental nga estado.
  • Lahi nga mga sapa, incremental nga estado.

Ang Incremental xDS nagtugot kanimo sa pagpakunhod sa trapiko tali sa control-plane ug nagpadala, kini may kalabutan alang sa dagkong mga configuration. Apan gikomplikado niini ang interaksyon; ang hangyo adunay usa ka lista sa mga kapanguhaan alang sa pag-unsubscribe ug pag-subscribe.

Ang among pananglitan naggamit sa ADS - usa ka sapa alang sa RDS, CDS, EDS ug non-incremental mode. Aron mahimo ang incremental mode, kinahanglan nimo nga ipiho api_type: DELTA_GRPC

Tungod kay ang hangyo adunay mga parameter sa node, mahimo namon ipadala ang lainlaing mga kapanguhaan sa control-plane alang sa lainlaing mga higayon nagpadala, kini sayon ​​alang sa pagtukod sa usa ka service mesh.

Pag-init

sa nagpadala sa pagsugod o sa dihang nakadawat og bag-ong configuration gikan sa control-plane, ang resource warmup nga proseso gilunsad. Gibahin kini sa listener warmup ug cluster warmup. Ang una gilusad kung adunay mga pagbag-o sa RDS/LDS, ang ikaduha kung CDS/EDS. Kini nagpasabot nga kon ang mga upstream lang ang mausab, ang tigpaminaw dili mugnaon.

Atol sa proseso sa pagpainit, ang nagsalig nga mga kapanguhaan gipaabut gikan sa control-plane sa panahon sa timeout. Kung mahitabo ang timeout, ang pagsugod dili magmalampuson ug ang bag-ong tigpaminaw dili magsugod sa pagpaminaw sa pantalan.
Pag-order sa pagsugod: EDS, CDS, aktibo nga pagsusi sa kahimsog, RDS, LDS. Sa aktibo nga mga pagsusi sa kahimsog nga mahimo, ang trapiko moadto sa agos lamang pagkahuman sa usa ka malampuson nga pagsusi sa kahimsog.

Kung ang tigpaminaw gimugna pag-usab, ang daan moadto sa DRAIN nga kahimtang ug mapapas human ang tanan nga koneksyon sirado o ang timeout matapos. --drain-time-s, default 10 minutos.

Ang pagpadayon.

Source: www.habr.com

Idugang sa usa ka comment