Anvwaye. 1. Entwodiksyon

Bonjou! Sa a se yon atik kout ki reponn kesyon yo: "ki sa ki anvwaye?", "poukisa li nesesè?" ak "ki kote yo kòmanse?".

Ki sa ki sa a

Envoy se yon balans L4-L7 ekri nan C++, konsantre sou pèfòmans segondè ak disponiblite. Sou yon bò, sa a se nan kèk fason yon analogue nan nginx ak haproxy, ki konparab nan pèfòmans yo. Nan lòt men an, li se plis oryante nan achitekti mikwosèvis epi li gen fonksyonalite pa pi mal pase java and go balancers, tankou zuul oswa traefik.

Tablo konparezon haproxy/nginx/envoy, li pa fè reklamasyon yo se verite a absoli, men li bay yon foto jeneral.

nginx
haproxy
anvwaye
traefik

zetwal sou github
11.2k / glas
1.1k / glas
12.4k
27.6k

ekri nan
C
C
C ++
go

API
нет
priz sèlman/pouse
plan done/rale
rale

chèk sante aktif
нет
repons lan se wi
repons lan se wi
repons lan se wi

Louvri tras
ekstèn plugin
нет
repons lan se wi
repons lan se wi

J.W.T.
ekstèn plugin
нет
repons lan se wi
нет

ekstansyon
Lua/C
Lua/C
Lua/C++
нет

Poukisa

Sa a se yon pwojè jèn, gen anpil bagay ki manke, kèk nan alfa bonè. Men anvwaye, tou akòz jèn li yo, ap devlope rapidman e li deja gen anpil karakteristik enteresan: konfigirasyon dinamik, anpil filtè pare yo, yon koòdone senp pou ekri pwòp filtè ou yo.
Zòn aplikasyon yo swiv sa a, men premye gen 2 antimodèl:

  • Recul estatik.

Reyalite a se ke nan moman sa a nan anvwaye pa gen sipò kachèt. Mesye Google yo ap eseye sa ranje. Lide a pral aplike yon fwa nan anvwaye tout sibtilite yo (tèt zou) nan konfòmite RFC, ak pou aplikasyon espesifik fè yon koòdone. Men, pou kounye a li pa menm alfa, achitekti a se sou diskisyon, PR louvri (pandan mwen te ekri atik PR a, PR a te jele, men pwen sa a toujou enpòtan).

Pou kounye a, sèvi ak nginx pou estatik.

  • Konfigirasyon estatik.

Ou ka sèvi ak li, men anvwaye Se pa pou sa li te kreye. Karakteristik nan yon konfigirasyon estatik pa pral ekspoze. Gen anpil moman:

Lè w ap modifye konfigirasyon an nan yaml, w ap fè erè, reprimande devlopè yo pou verite epi panse ke konfigirasyon nginx/haproxy yo, byenke mwens estriktire, yo pi kout. Sa a se pwen an. Konfigirasyon Nginx ak Haproxy te kreye pou koreksyon alamen, ak anvwaye pou jenerasyon soti nan kòd. Tout konfigirasyon an dekri nan protobuf, jenere li nan dosye proto se pi difisil fè yon erè.

Canary, senaryo deplwaman b/g ak plis ankò yo nòmalman aplike sèlman nan yon konfigirasyon dinamik. Mwen pa di ke sa pa ka fè statique, nou tout fè li. Men, pou sa ou bezwen mete sou beki, nan nenpòt nan balans yo, nan anvwaye ki gen ladan.

Travay ki Envoy endispansab:

  • Balanse trafik nan sistèm konplèks ak dinamik. Sa a gen ladan may sèvis la, men li pa nesesèman youn nan sèlman.
  • Bezwen pou fonksyonalite trase distribiye, otorizasyon konplèks oswa lòt fonksyonalite ki disponib nan anvwaye soti nan bwat la oswa pratikman aplike, men nan nginx / haproxy ou bezwen antoure pa lua ak grefon ézitan.

Tou de, si sa nesesè, bay pèfòmans segondè.

Kijan travay sa a

Envoy distribye nan binè sèlman kòm yon imaj docker. Imaj la deja gen yon egzanp yon konfigirasyon estatik. Men, nou enterese nan li sèlman pou konprann estrikti a.

envoy.yaml konfigirasyon estatik

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

Konfigirasyon dinamik

Pou ki pwoblèm nap chèche yon solisyon? Ou pa ka jis rechaje konfigirasyon balans chaj la anba chaj; "ti" pwoblèm ap parèt:

  • Validasyon konfigirasyon.

Konfigirasyon an ka gwo, li ka trè gwo, si nou surcharge li tout nan yon fwa, chans yo nan yon erè yon kote ogmante.

  • Koneksyon ki dire lontan.

Lè w inisyalize yon nouvo koute, ou bezwen pran swen koneksyon yo kouri sou ansyen an; si chanjman yo rive souvan epi gen koneksyon ki dire lontan, w ap oblije chèche yon konpwomi. Bonjou, kubernetes antre sou nginx.

  • Chèk sante aktif.

Si nou gen chèk sante aktif, nou bezwen double-tcheke yo tout nan nouvo konfigirasyon an anvan voye trafik. Si gen yon anpil nan upstreams, sa a pran tan. Bonjou haproxy.

Ki jan sa rezoud nan anvwayePa chaje konfigirasyon an dinamik, dapre modèl pisin lan, ou ka divize li an pati separe epi ou pa re-inisyalize pati ki pa chanje. Pou egzanp, yon koute, ki se chè reinitialize ak raman chanje.

Konfigirasyon anvwaye (ki soti nan dosye ki anwo a) gen antite sa yo:

  • koute — koute pandye sou yon ip/pò espesifik
  • lame vityèl - lame vityèl pa non domèn
  • wout - règ balanse
  • gwoup - yon gwoup amont ak paramèt balanse
  • pwen final - adrès egzanp en

Chak nan antite sa yo ak kèk lòt ka ranpli dinamik; pou sa a, konfigirasyon an presize adrès sèvis la soti nan kote yo pral resevwa konfigirasyon an. Sèvis la ka REST oswa gRPC, gRPC pi preferab.

Sèvis yo rele respektivman: LDS, VHDS, RDS, CDS ak EDS. Ou ka konbine konfigirasyon estatik ak dinamik, ak limit ke yon resous dinamik pa ka espesifye nan yon yon sèl estatik.

Pou pifò travay, li ase pou aplike twa dènye sèvis yo, yo rele yo ADS (Aggregated Discovery Service), pou Java epi ale gen yon aplikasyon pare-fè nan gRPC dataplane nan ki ou jis bezwen ranpli nan objè yo soti nan sous ou.

Konfigirasyon an pran fòm sa a:

envoy.yaml konfigirasyon dinamik

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

Nan demaraj anvwaye ak konfigirasyon sa a, li pral konekte nan avyon kontwòl la epi eseye mande RDS, CDS ak EDS konfigirasyon an. Yo dekri kijan pwosesis entèraksyon an rive isit la.

An rezime, anvwaye voye yon demann ki endike ki kalite resous ke yo te mande, vèsyon an ak paramèt ne la. Kòm repons, li resevwa yon resous ak yon vèsyon; si vèsyon an sou avyon kontwòl la pa chanje, li pa reponn.
Gen 4 opsyon entèraksyon:

  • Yon kouran gRPC pou tout kalite resous, yo voye estati konplè resous la.
  • Kouran separe, kondisyon konplè.
  • Yon sèl kouran, eta incrémentielle.
  • Kouran separe, eta incrémentielle.

Incrémental xDS pèmèt ou redwi trafik ant kontwòl avyon an ak anvwaye, sa a enpòtan pou konfigirasyon gwo. Men, li konplike entèraksyon an; demann lan gen yon lis resous pou dezabònman ak abònman.

Egzanp nou an sèvi ak ADS - yon sèl kouran pou RDS, CDS, EDS ak mòd ki pa enkreman. Pou pèmèt mòd incrémentielle, ou bezwen presize api_type: DELTA_GRPC

Depi demann lan gen paramèt ne, nou ka voye resous diferan nan avyon kontwòl la pou diferan ka anvwaye, sa a se pratik pou bati yon may sèvis.

Chofe

Sou anvwaye nan demaraj oswa lè w ap resevwa yon nouvo konfigirasyon nan plan kontwòl, pwosesis chofe resous la te lanse. Li divize an chofe oditè ak chofe grap. Premye a lanse lè gen chanjman nan RDS/LDS, dezyèm lan lè CDS/EDS. Sa vle di ke si sèlman upstreams chanje, koute a pa rkree.

Pandan pwosesis chofe a, resous depandan yo atann nan plan kontwòl la pandan tan an. Si tan an rive, inisyalizasyon pa pral reyisi epi nouvo moun k ap koute a pa pral kòmanse koute sou pò a.
Lòd inisyalizasyon: EDS, CDS, chèk sante aktif, RDS, LDS. Avèk chèk sante aktif yo aktive, trafik yo pral monte sèlman apre yon chèk sante siksè.

Si moun k ap koute a te rkree, ansyen an ale nan eta DRAIN epi yo pral efase apre tout koneksyon yo fèmen oswa tan an ekspire. --drain-time-s, default 10 minit.

Yo dwe kontinye.

Sous: www.habr.com

Add nouvo kòmantè