Envoy. 1. Destpêk

Silav! Ev gotarek kurt e ku bersiva pirsan dide: "qasid çi ye?", "Çima hewce ye?" û "ji ku dest pê bike?".

Ev çi ye?

Envoy balansek L4-L7 ye ku bi C ++ hatî nivîsandin, li ser performansa bilind û hebûna balê dikişîne. Ji aliyek ve, ev bi rengekî analogek nginx û haproxy ye, ku di performansê de bi wan re tê berhev kirin. Ji hêla din ve, ew bêtir ber bi mîmariya mîkro-servîsê ve tê rêve kirin û fonksiyonek wê ji balanserên java û go-ê ne xirabtir e, wek zuul an traefik.

Tabloya berhevdana haproxy / nginx / şandî, ew îdîa nake ku rastiya bêkêmasî ye, lê wêneyek giştî dide.

nginx
haproxy
şandin
traefik

stêrên li ser github
11.2k/neynik
1.1k/neynik
12.4k
27.6k

tê de hatiye nivîsandin
C
C
C ++
go

API
na
soket tenê/push
dataplane / vekişîne
kişandin

kontrola tenduristiyê ya çalak
na
erê
erê
erê

Vekirina şopandinê
pêveka derve
na
erê
erê

J.W.T.
pêveka derve
na
erê
na

dirêjkirinê
Lua/C
Lua/C
Lua/C++
na

Whyima

Ev projeyek ciwan e, gelek tişt kêm in, hin di destpêka alpha de. Lebê şandin, di heman demê de ji ber ciwaniya xwe, bi lez pêş dikeve û jixwe xwedan gelek taybetmendiyên balkêş e: veavakirina dînamîk, gelek fîlterên amade, navgînek hêsan ji bo nivîsandina fîlterên xwe.
Qadên serîlêdanê ji vê yekê peyda dibin, lê pêşî 2 antipattern hene:

  • Vegera statîk.

Rastî ev e ku niha di şandin piştgiriya caching tune. Xortên Google vê yekê diceribînin rast bikin. Fikir dê carekê were pêkanîn şandin Hemî hûrguliyên (sernivîsên zoo) lihevhatina RFC, û ji bo pêkanînên taybetî navgîniyek çêdikin. Lê naha ew ne alpha jî ye, mîmarî di bin nîqaşê de ye, PR vekirî (dema ku min gotara PR dinivîsand, PR cemidand, lê ev xal hîn jî têkildar e).

Heya nuha, nginx ji bo statîk bikar bînin.

  • Veavakirina statîk.

Hûn dikarin wê bikar bînin, lê şandin Ne ji bo wê hatiye afirandin. Taybetmendiyên di veavakirinek statîk de dê neyên eşkere kirin. Gelek dem hene:

Dema ku hûn mîhengê di yaml-ê de biguherînin, hûn ê şaş bibin, pêşdebiran ji ber devbêjiyê bişopînin û bifikirin ku mîhengên nginx/haproxy, her çend hindiktir sazkirî bin jî, kurttir in. Mesele ev e. Veavakirina Nginx û Haproxy ji bo guherandinê bi destan hate afirandin, û şandin ji bo nifşê ji kodê. Tevahiya veavakirinê di nav de tête diyar kirin protobuf, çêkirina wê ji pelên proto xeletiyek pir dijwartir e.

Kanarya, senaryoyên bicihkirina b/g û hêj bêtir bi gelemperî tenê di veavakirinek dînamîkî de têne bicîh kirin. Ez nabêjim ku ev yek statîk nayê kirin, em hemî wiya dikin. Lê ji bo vê yekê hûn hewce ne ku di nav her yek ji hevsengkeran de, qirçan li xwe bikin şandin giştî.

Karên ku şandî ji bo wan hewce ne:

  • Di pergalên tevlihev û dînamîkî de hevsengiya trafîkê. Ev tevna karûbarê tê de ye, lê ne hewce ye ku ew yekane ye.
  • Pêdivî ye ku fonksiyona şopandina belavkirî, destûrnameya tevlihev an fonksiyonek din a ku tê de heye şandin ji qutikê an bi hêsanî hatî bicîh kirin, lê di nginx/haproxy de hûn hewce ne ku ji hêla lua û pêvekên gumanbar ve werin dorpêç kirin.

Her du, ger hewce be, performansa bilind peyda dikin.

Çawa ev karê

Envoy tenê wekî wêneyek docker di binaryeyan de tê belav kirin. Wêne jixwe mînakek veavakirina statîk heye. Lê em tenê ji bo têgihiştina strukturê pê re eleqedar dibin.

envoy.yaml veavakirina statîk

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

Veavakirina dînamîk

Em ji kîjan pirsgirêkê re li çareyekê digerin? Hûn nekarin tenê veavakirina balansa barkirinê di bin barkirinê de ji nû ve bar bikin; dê pirsgirêkên "biçûk" derkevin holê:

  • Verastkirina veavakirinê.

Vesazkirin dikare mezin be, ew dikare pir mezin be, heke em wiya bi yekcarî zêde bar bikin, şansê xeletiyek li cîhek zêde dibe.

  • Têkiliyên demdirêj.

Dema ku hûn guhdarvanek nû dest pê bikin, hûn hewce ne ku bala xwe bidin girêdanên ku li ser ya kevin diqewimin; heke guhertin pir caran çêbibin û têkiliyên demdirêj hebin, hûn ê neçar bimînin ku lihevkirinek bigerin. Silav, kubernetes li nginx ketin.

  • Kontrolên tenduristiyê yên çalak.

Ger kontrolên tenduristiya me yên çalak hebin, berî ku em seyrûseferê bişînin divê em hemî di veavakirina nû de ducarî kontrol bikin. Heke gelek jor hene, ev dem digire. Silav haproxy.

Ev di nav de çawa çareser dibe şandinBi barkirina mîhengê bi dînamîk, li gorî modela hewzê, hûn dikarin wê li perçeyên cihê dabeş bikin û beşa ku neguherî ji nû ve dest pê nekin. Mînakî, guhdarek, ku ji nû ve destpêkirinê biha ye û kêm caran diguhezîne.

Guhertin şandin (ji pelê li jor) xwediyê van saziyan e:

  • gûhdar - guhdar li ser ip / portek taybetî daliqandî ye
  • host virtual - mêvandarê virtual bi navê domainê
  • rêk - qaîdeya hevsengiyê
  • deaktîv bike - komek ji jorîn bi parametreyên hevseng
  • endpoint - navnîşana nimûneya jorîn

Her yek ji van sazûmanan û hinên din dikarin bi dînamîk werin dagirtin; ji bo vê yekê, veavakirin navnîşana karûbarê ku dê konfigurasyon jê were wergirtin diyar dike. Karûbar dikare REST an gRPC be, gRPC tercîh e.

Karûbar bi rêz têne nav kirin: LDS, VHDS, RDS, CDS û EDS. Hûn dikarin veavakirina statîk û dînamîkî bi hev re bihêlin, bi sînorkirina ku çavkaniyek dînamîkî di yek statîk de neyê destnîşankirin.

Ji bo pir karan, bes e ku sê karûbarên paşîn bicîh bikin, ji wan re ADS (Xizmeta Keşfê ya Hevbeş) tê gotin, ji bo java û biçin wir pêkanînek amadekirî ya dataplane gRPC heye ku tê de hûn tenê hewce ne ku tiştên ji çavkaniya xwe dagirin.

Veavakirin forma jêrîn digire:

envoy.yaml veavakirina dînamîk

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

Di destpêkê de şandin bi vê veavakirinê re, ew ê bi firokeya kontrolê ve girêbide û hewl bide ku veavakirina RDS, CDS û EDS bixwaze. Pêvajoya pêwendiyê çawa çêdibe tê vegotin vir.

Bi kurtî, şandin daxwazek dişîne ku celebê çavkaniya ku tê xwestin, guherto û pîvanên girêk nîşan dide. Di bersivê de, ew çavkaniyek û guhertoyek distîne; heke guhertoya li ser firokeya kontrolê neguhere, ew bersiv nade.
4 vebijarkên danûstendinê hene:

  • Ji bo her cûre çavkaniyan yek stream gRPC, statûya tevahî ya çavkaniyê tê şandin.
  • Çemên veqetandî, rewşa tam.
  • Yek çem, rewşek zêde.
  • Çemên veqetandî, rewşa zêdebûnê.

Zêdebûna xDS dihêle hûn seyrûsefera di navbera balafir-kontrol û şandin, ev ji bo veavakirinên mezin têkildar e. Lê ew danûstendinê tevlihev dike; daxwaz navnîşek çavkaniyan ji bo betalkirin û abonetiyê vedihewîne.

Mînaka me ADS-ê bikar tîne - ji bo RDS, CDS, EDS û moda ne-zêdebûnê yek stream. Ji bo çalakkirina moda zêdebûnê, hûn hewce ne ku diyar bikin api_type: DELTA_GRPC

Ji ber ku daxwaz pîvanên nodê dihewîne, em dikarin çavkaniyên cihêreng ji bo mînakên cihêreng bişînin firokeya kontrolê şandin, ev ji bo avakirina tevnek karûbarê hêsan e.

Germ kirin

li ser şandin di destpêkê de an dema wergirtina veavakirinek nû ji firokeya kontrolê, pêvajoya germkirina çavkaniyê dest pê dike. Ew li germbûna guhdar û germkirina komê tê dabeş kirin. Ya yekem gava ku di RDS/LDS de guhertin çêbibin, ya duyemîn dema CDS/EDS tê destpêkirin. Ev tê vê wateyê ku heke tenê rêyên jorîn biguhezin, guhdar ji nû ve nayê afirandin.

Di dema pêvajoya germkirinê de, çavkaniyên girêdayî ji balafira kontrolê di dema wextê de têne hêvî kirin. Ger dem derbas bibe, destpêkkirin dê serketî nebe û guhdarê nû dê dest bi guhdarkirina li portê neke.
Fermana destpêkê: EDS, CDS, kontrolkirina tenduristiya çalak, RDS, LDS. Digel ku kontrolên tenduristiyê yên çalak hatine çalak kirin, dê seyrûsefer tenê piştî yek kontrolek tenduristiyê ya serketî biçe jor.

Ger guhdar ji nû ve hatibe afirandin, ya kevn diçe rewşa DRAIN û piştî ku hemî girêdan girtî ne an jî dema derbasbûnê dê were jêbirin. --drain-time-s, default 10 deqîqe.

Pêdivî bimînin.

Source: www.habr.com

Add a comment