Mibgħut. 1. Introduzzjoni

Tislijiet! Dan huwa artiklu qasir li jwieġeb il-mistoqsijiet: "x'inhu l-mibgħut?", "għaliex huwa meħtieġ?" u "minn tibda?".

X'inhu

Envoy huwa balancer L4-L7 miktub f'C++, iffukat fuq prestazzjoni għolja u disponibbiltà. Min-naħa waħda, dan huwa b'xi mod analogu ta 'nginx u haproxy, komparabbli magħhom fil-prestazzjoni. Min-naħa l-oħra, hija aktar orjentata lejn l-arkitettura tal-mikroservizz u għandha funzjonalità mhux agħar minn java and go balancers, bħal zuul jew traefik.

Tabella ta 'tqabbil ta' haproxy / nginx / mibgħut, ma tippretendix li hija l-verità assoluta, iżda tagħti stampa ġenerali.

nginx
haproxy
mibgħuta
traefik

stilel fuq github
11.2k/mera
1.1k/mera
12.4k
27.6k

bil-miktub
C
C
C ++
go

API
ebda
sokit biss/imbotta
dataplane/pull
iġbed

verifika tas-saħħa attiva
ebda
iva
iva
iva

Traċċar miftuħ
plugin estern
ebda
iva
iva

J.W.T.
plugin estern
ebda
iva
ebda

estensjoni
Lua/C
Lua/C
Lua/C++
ebda

Dak għal

Dan huwa proġett żagħżugħ, hemm ħafna affarijiet neqsin, xi wħud f'alpha bikrija. Iżda mibgħuta, ukoll minħabba ż-żgħażagħ tagħha, qed tiżviluppa malajr u diġà għandha ħafna karatteristiċi interessanti: konfigurazzjoni dinamika, ħafna filtri lesti, interface sempliċi għall-kitba tal-filtri tiegħek.
L-oqsma ta 'applikazzjoni ġejjin minn dan, iżda l-ewwel hemm 2 antipatterns:

  • Recoil statiku.

Il-fatt hu li bħalissa fil mibgħuta ebda appoġġ caching. Il-guys tal-Google qed jippruvaw dan biex tiffissa. L-idea se tiġi implimentata darba mibgħuta l-irqaqat kollha (headers taż-żoo) tal-konformità RFC, u għal implimentazzjonijiet speċifiċi jagħmlu interface. Imma għalissa lanqas mhi alpha, l-arkitettura qed tiġi diskussa, PR miftuħ (filwaqt li kont qed nikteb l-artiklu PR, il-PR ffriżat, iżda dan il-punt għadu rilevanti).

Għalissa, uża nginx għall-istatika.

  • Konfigurazzjoni statika.

Tista' tużah, imma mibgħuta Dak mhux għalxiex inħoloq. Karatteristiċi f'konfigurazzjoni statika mhux se jkunu esposti. Hemm ħafna mumenti:

Meta teditja l-konfigurazzjoni f'yaml, tkun żbaljat, ċanfar lill-iżviluppaturi għal verbosity u taħseb li l-konfigurazzjonijiet nginx/haproxy, għalkemm inqas strutturati, huma aktar konċiżi. Dak hu l-punt. Il-konfigurazzjoni ta 'Nginx u Haproxy inħolqot għall-editjar bl-idejn, u mibgħuta għall-ġenerazzjoni mill-kodiċi. Il-konfigurazzjoni kollha hija deskritta fi protobuf, li tiġġeneraha minn proto files hija ħafna aktar diffiċli li tagħmel żball.

Canary, xenarji ta' skjerament b/g u ħafna aktar huma normalment implimentati biss f'konfigurazzjoni dinamika. Mhux qed ngħid li dan ma jistax isir b’mod statiku, nagħmluh ilkoll. Iżda għal dan għandek bżonn tpoġġi l-krozzi, fi kwalunkwe mill-balancers, in mibgħuta inkluż.

Kompiti li għalihom il-Mibgħut huwa indispensabbli:

  • Ibbilanċjar tat-traffiku f'sistemi kumplessi u dinamiċi. Dan jinkludi l-malji tas-servizz, iżda mhux neċessarjament l-uniku wieħed.
  • Il-ħtieġa għal funzjonalità ta' traċċar distribwit, awtorizzazzjoni kumplessa jew funzjonalità oħra li hija disponibbli fi mibgħuta barra mill-kaxxa jew implimentati b'mod konvenjenti, iżda f'nginx/haproxy jeħtieġ li tkun imdawwar minn lua u plugins dubjużi.

It-tnejn, jekk meħtieġ, jipprovdu prestazzjoni għolja.

Kif taħdem din

Envoy huwa mqassam f'binarji biss bħala immaġni docker. L-immaġni diġà fiha eżempju ta 'konfigurazzjoni statika. Imma aħna interessati fiha biss biex nifhmu l-istruttura.

konfigurazzjoni statika 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

Konfigurazzjoni dinamika

Għal liema problema qed infittxu soluzzjoni? Ma tistax sempliċement terġa' tgħabbi l-konfigurazzjoni tal-bilanċjar tat-tagħbija taħt tagħbija; se jinqalgħu problemi "żgħar":

  • Validazzjoni tal-konfigurazzjoni.

Il-konfigurazzjoni tista 'tkun kbira, tista' tkun kbira ħafna, jekk aħna tagħbija żejda kollha f'daqqa, iċ-ċansijiet ta 'żball x'imkien jiżdiedu.

  • Konnessjonijiet ta 'ħajja twila.

Meta tibda semmiegħ ġdid, trid tieħu ħsieb il-konnessjonijiet li jaħdmu fuq dak il-qadim; jekk il-bidliet iseħħu ta 'spiss u jkun hemm konnessjonijiet fit-tul, ikollok tfittex kompromess. Hello, kubernetes ingress fuq nginx.

  • Kontrolli tas-saħħa attivi.

Jekk ikollna kontrolli tas-saħħa attivi, irridu niċċekkjawhom kollha fil-konfigurazzjoni l-ġdida qabel nibagħtu t-traffiku. Jekk ikun hemm ħafna upstreams, dan jieħu ż-żmien. Hello haproxy.

Kif dan solvut fi mibgħutaBilli tgħabbi l-konfigurazzjoni b'mod dinamiku, skont il-mudell tal-pool, tista 'taqsamha f'partijiet separati u ma terġax tibda l-parti li ma nbidlitx. Per eżempju, semmiegħa, li huwa għali biex jerġa 'jibda u rarament jinbidel.

Konfigurazzjoni mibgħuta (mill-fajl ta' hawn fuq) għandha l-entitajiet li ġejjin:

  • semmiegħ — is-semmiegħ imdendel fuq ip/port speċifiku
  • ospitanti virtwali - host virtwali bl-isem tad-dominju
  • rotta - regola ta' bilanċ
  • cluster — grupp ta' upstreams b'parametri ta' bilanċ
  • endpoint — indirizz tal-istanza upstream

Kull waħda minn dawn l-entitajiet flimkien ma 'xi oħrajn jistgħu jimtlew b'mod dinamiku; għal dan, il-konfigurazzjoni tispeċifika l-indirizz tas-servizz minn fejn se tiġi riċevuta l-konfigurazzjoni. Is-servizz jista 'jkun REST jew gRPC, gRPC huwa preferibbli.

Is-servizzi huma msemmija rispettivament: LDS, VHDS, RDS, CDS u EDS. Tista 'tgħaqqad konfigurazzjoni statika u dinamika, bil-limitazzjoni li riżors dinamiku ma jistax jiġi speċifikat f'waħda statika.

Għall-biċċa l-kbira tal-kompiti, huwa biżżejjed li jiġu implimentati l-aħħar tliet servizzi, huma msejħa ADS (Aggregated Discovery Service), għal Java u mur hemm implimentazzjoni lesta ta 'gRPC dataplane li fiha għandek bżonn biss li timla l-oġġetti mis-sors tiegħek.

Il-konfigurazzjoni tieħu l-forma li ġejja:

konfigurazzjoni dinamika 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

Fl-istartjar mibgħuta b'din il-konfigurazzjoni, se tikkonnettja mal-pjan ta 'kontroll u tipprova titlob il-konfigurazzjoni RDS, CDS u EDS. Kif iseħħ il-proċess ta 'interazzjoni huwa deskritt hawn.

Fil-qosor, mibgħuta jibgħat talba li tindika t-tip ta’ riżorsa li qed tintalab, il-verżjoni u l-parametri tan-node. Bi tweġiba, jirċievi riżors u verżjoni; jekk il-verżjoni fuq il-pjan ta 'kontroll ma nbidlitx, ma tirrispondix.
Hemm 4 għażliet ta' interazzjoni:

  • Nixxiegħa gRPC waħda għat-tipi kollha ta 'riżorsi, jintbagħat l-istatus sħiħ tar-riżorsa.
  • Nixxigħat separati, kundizzjoni sħiħa.
  • Nixxiegħa waħda, stat inkrementali.
  • Flussi separati, stat inkrementali.

XDS inkrementali jippermettilek tnaqqas it-traffiku bejn il-kontroll-pjan u mibgħuta, dan huwa rilevanti għal konfigurazzjonijiet kbar. Iżda tikkomplika l-interazzjoni; it-talba fiha lista ta’ riżorsi għat-tneħħija tal-abbonament u l-abbonament.

L-eżempju tagħna juża ADS - fluss wieħed għal RDS, CDS, EDS u modalità mhux inkrementali. Biex tippermetti l-mod inkrementali, trid tispeċifika api_type: DELTA_GRPC

Peress li t-talba fiha parametri tan-nodi, nistgħu nibagħtu riżorsi differenti lill-pjan ta 'kontroll għal każijiet differenti mibgħuta, dan huwa konvenjenti għall-bini ta 'malji ta' servizz.

Warmup

Fuq mibgħuta fl-istartjar jew meta tirċievi konfigurazzjoni ġdida mill-pjan ta 'kontroll, jitnieda l-proċess ta' tisħin tar-riżorsi. Huwa maqsum fi warmup tas-semmiegħ u warmup cluster. L-ewwel titnieda meta jkun hemm bidliet f'RDS/LDS, it-tieni meta CDS/EDS. Dan ifisser li jekk biss upstreams jinbidlu, is-semmiegħ ma jiġix rikrejat.

Matul il-proċess ta 'tisħin, riżorsi dipendenti huma mistennija mill-pjan ta' kontroll matul il-timeout. Jekk isseħħ il-timeout, l-inizjalizzazzjoni ma tirnexxix u s-semmiegħ il-ġdid mhux se jibda jisma fuq il-port.
Ordni ta 'inizjalizzazzjoni: EDS, CDS, kontroll tas-saħħa attiva, RDS, LDS. Bil-kontrolli tas-saħħa attivi attivati, it-traffiku se jitla' 'l fuq biss wara kontroll tas-saħħa wieħed b'suċċess.

Jekk is-semmiegħ ġie rikrejat, il-qadim imur fl-istat DRAIN u jitħassar wara li jingħalqu l-konnessjonijiet kollha jew jiskadi l-timeout --drain-time-s, default 10 minuti.

Għandha titkompla.

Sors: www.habr.com

Żid kumment