Sendimaður. 1. Inngangur

Kveðja! Þetta er stutt grein sem svarar spurningunum: "hvað er sendimaður?", "af hverju er það þörf?" og "hvar á að byrja?".

Hvað er þetta?

Envoy er L4-L7 jafnvægisbúnaður skrifaður í C++, með áherslu á afkastagetu og aðgengi. Annars vegar er þetta á einhvern hátt hliðstæða nginx og haproxy, sambærileg í frammistöðu við þá. Aftur á móti miðar það meira að örþjónustuarkitektúr og hefur virkni ekki verri en java og go jafnvægistæki, eins og zuul eða traefik.

Samanburðartafla haproxy/nginx/senvoy, hún segist ekki vera alger sannleikur, en gefur almenna mynd.

nginx
haproxy
sendiherra
traefik

stjörnur á github
11.2k/spegill
1.1k/spegill
12.4k
27.6k

skrifað í
C
C
C + +
go

API
ekki
aðeins innstunga/ýta
gagnaplan/tog
draga

virkt heilsufarsskoðun
ekki


Opin rakning
ytri viðbót
ekki

J.W.T.
ytri viðbót
ekki

ekki

framlenging
Lua/C
Lua/C
Lua/C++
ekki

Hvað fyrir

Þetta er ungt verkefni, það vantar ýmislegt, sumt í byrjun alfa. En sendiherra, einnig vegna æsku sinnar, þróast hratt og hefur nú þegar marga áhugaverða eiginleika: kraftmikla uppsetningu, margar tilbúnar síur, einfalt viðmót til að skrifa þínar eigin síur.
Notkunarsvið fylgja þessu, en fyrst eru 2 mótmynstur:

  • Statískt bakslag.

Staðreyndin er sú að í augnablikinu í sendiherra enginn stuðningur við skyndiminni. Google krakkar eru að reyna þetta að laga. Hugmyndin verður hrint í framkvæmd einu sinni sendiherra allar fíngerðir (dýragarðshausar) RFC samræmis, og fyrir sérstakar útfærslur búa til viðmót. En í bili er það ekki einu sinni alfa, arkitektúrinn er til umræðu, PR opinn (meðan ég var að skrifa PR-greinina frosaði PR-ið, en þetta atriði á samt við).

Í bili, notaðu nginx fyrir truflanir.

  • Statísk stilling.

Þú getur notað það, en sendiherra Það er ekki það sem það var búið til. Eiginleikar í kyrrstæðum stillingum verða ekki afhjúpaðir. Það eru mörg augnablik:

Þegar þú breytir stillingunum í yaml muntu skjátlast, skamma þróunaraðilana fyrir orðræðu og halda að nginx/haproxy stillingarnar séu hnitmiðaðri, þó þær séu síður skipulagðar. Það er tilgangurinn. Uppsetning Nginx og Haproxy var búin til til að breyta með höndunum, og sendiherra til að búa til úr kóða. Öllum uppsetningunni er lýst í frumefni, að búa til það úr frumskrám er miklu erfiðara að gera mistök.

Kanarí, b/g dreifingaratburðarás og margt fleira er venjulega aðeins útfært í kraftmikilli uppsetningu. Ég er ekki að segja að þetta sé ekki hægt að gera statískt, við gerum það öll. En til þess þarftu að setja á hækjur, í hvaða jafnvægistæki sem er, inn sendiherra þar á meðal.

Verkefni sem sendimaður er ómissandi fyrir:

  • Jafnvægi á umferð í flóknum og kraftmiklum kerfum. Þetta felur í sér þjónustunetið, en það er ekki endilega það eina.
  • Þörfin fyrir dreifða rakningarvirkni, flókna heimild eða aðra virkni sem er tiltæk í sendiherra út úr kassanum eða útfært á þægilegan hátt, en í nginx/haproxy þarftu að vera umkringdur lua og vafasömum viðbótum.

Bæði, ef nauðsyn krefur, veita mikla afköst.

Hvernig virkar þetta

Sendiboði er aðeins dreift í tvíþættum sem docker mynd. Myndin inniheldur nú þegar dæmi um fasta stillingu. En við höfum áhuga á því aðeins til að skilja uppbygginguna.

envoy.yaml truflanir stillingar

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

Dynamic stillingar

Hvaða vandamál erum við að leita að lausn á? Þú getur ekki bara endurhlaða uppsetningu álagsjafnarans undir álagi; „lítil“ vandamál munu koma upp:

  • Staðfesting stillinga.

Stillingin getur verið stór, hún getur verið mjög stór, ef við ofhleðum allt í einu aukast líkurnar á villu einhvers staðar.

  • Langlíf tengsl.

Þegar þú frumstillir nýjan hlustanda þarftu að gæta að tengingunum sem keyra á þeim gamla; ef breytingar verða oft og það eru langlífar tengingar verður þú að leita að málamiðlun. Halló, kubernetes ingress á nginx.

  • Virk heilsufarsskoðun.

Ef við erum með virkar heilsufarsskoðanir þurfum við að tvítékka þær allar í nýju stillingunni áður en umferð er send. Ef það er mikið af andstreymi tekur þetta tíma. Halló haproxy.

Hvernig er þetta leyst í sendiherraMeð því að hlaða stillingunni á virkan hátt, í samræmi við sundlaugarlíkanið, geturðu skipt henni í aðskilda hluta og ekki endurræst þann hluta sem hefur ekki breyst. Til dæmis hlustandi, sem er dýrt að endurræsa og breytist sjaldan.

Stillingar sendiherra (úr skránni hér að ofan) hefur eftirfarandi einingar:

  • hlustandi — hlustandi hangir á tilteknu ip/porti
  • sýndargestgjafi - sýndargestgjafi eftir lén
  • leið - jafnvægisregla
  • þyrping — hópur andstreymis með jafnvægisbreytur
  • endapunktur — heimilisfang tilviks andstreymis

Hægt er að fylla út hverja þessara aðila auk nokkurra annarra á virkan hátt; fyrir þetta tilgreinir stillingin heimilisfang þjónustunnar þaðan sem stillingin verður móttekin. Þjónustan getur verið REST eða gRPC, gRPC er æskilegt.

Þjónustan heitir hvort um sig: LDS, VHDS, RDS, CDS og EDS. Þú getur sameinað kyrrstæða og kraftmikla uppsetningu, með þeim takmörkunum að ekki er hægt að tilgreina kraftmikla tilföng í kyrrstöðu.

Fyrir flest verkefni er nóg að innleiða síðustu þrjár þjónusturnar, þær kallast ADS (Aggregated Discovery Service), þ. Java og farðu þangað er tilbúin útfærsla á gRPC dataplane þar sem þú þarft bara að fylla út hlutina frá upprunanum þínum.

Stillingin tekur eftirfarandi form:

envoy.yaml dynamic stillingar

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

Við ræsingu sendiherra með þessari stillingu mun það tengjast stjórnborðinu og reyna að biðja um RDS, CDS og EDS stillingar. Lýst er hvernig samspilsferlinu á sér stað hér.

Í stuttu máli, sendiherra sendir beiðni sem gefur til kynna hvers konar auðlind er beðið um, útgáfu og færibreytur hnútsins. Sem svar fær það tilföng og útgáfu; ef útgáfan á stjórnborðinu hefur ekki breyst, svarar það ekki.
Það eru 4 samskiptamöguleikar:

  • Einn gRPC straumur fyrir allar tegundir auðlinda, full staða auðlindarinnar er send.
  • Aðskildir lækir, fullt ástand.
  • Einn straumur, stigvaxandi ástand.
  • Aðskildir straumar, stigvaxandi ástand.

Stigvaxandi xDS gerir þér kleift að draga úr umferð milli stjórnvélarinnar og sendiherra, þetta á við fyrir stórar stillingar. En það flækir samskiptin; beiðnin inniheldur lista yfir úrræði til að hætta áskrift og gerast áskrifandi.

Dæmið okkar notar ADS - einn straum fyrir RDS, CDS, EDS og ekki stigvaxandi ham. Til að virkja stigvaxandi ham þarftu að tilgreina api_type: DELTA_GRPC

Þar sem beiðnin inniheldur hnútabreytur getum við sent mismunandi tilföng til stjórnborðsins fyrir mismunandi tilvik sendiherra, þetta er þægilegt til að byggja upp þjónustunet.

Upphitun

Á sendiherra við ræsingu eða við móttöku nýrrar stillingar frá stjórnflugvél er upphitunarferlið ræst. Það skiptist í hlustendaupphitun og klasaupphitun. Sá fyrri er settur af stað þegar breytingar verða á RDS/LDS, sá síðari þegar CDS/EDS. Þetta þýðir að ef aðeins andstreymi breytast er hlustandinn ekki endurskapaður.

Meðan á upphitunarferlinu stendur er búist við háðum tilföngum frá stjórnborðinu á meðan á tímanum stendur. Ef tíminn á sér stað mun frumstilling ekki ná árangri og nýi hlustandinn mun ekki byrja að hlusta á portinu.
Frumstillingaröð: EDS, CDS, virk heilsuskoðun, RDS, LDS. Þegar virkt heilsufarspróf er virkt mun umferð fara upp í strauminn aðeins eftir eina árangursríka heilsuskoðun.

Ef hlustandinn var endurskapaður fer sá gamli í DRAIN ástandið og verður eytt eftir að allar tengingar eru lokaðar eða tíminn rennur út --drain-time-s, sjálfgefið 10 mínútur.

Til að halda áfram.

Heimild: www.habr.com

Bæta við athugasemd