SÅ«tnis. 1. Ievads

Sveiciens! Šis ir īss raksts, kas atbild uz jautājumiem: "Kas ir sūtnis?", "Kāpēc tas ir vajadzīgs?" un "ar ko sākt?".

Kas tas ir?

Envoy ir L4-L7 balansētājs, kas rakstīts C++ valodā un ir vērsts uz augstu veiktspēju un pieejamību. No vienas puses, tas savā ziņā ir nginx un haproxy analogs, kas pēc veiktspējas ir salīdzināms ar tiem. No otras puses, tas ir vairāk orientēts uz mikropakalpojumu arhitektūru, un tā funkcionalitāte nav sliktāka par java un go balansētājiem, piemēram, zuul vai traefik.

Haproxy/nginx/envoy salÄ«dzināŔanas tabula nepretendē uz absolÅ«tu patiesÄ«bu, bet sniedz vispārēju priekÅ”statu.

nginx
haproksi
sūtnis
traefik

zvaigznes vietnē github
11.2k/spogulis
1.1k/spogulis
12.4k
27.6k

rakstīts iekŔā
C
C
C + +
go

API
nē
tikai ligzda/spiediens
datu plakne / pull
vilkt

aktīva veselības pārbaude
nē
jā
jā
jā

Atvērt izsekoÅ”anu
ārējais spraudnis
nē
jā
jā

J.W.T.
ārējais spraudnis
nē
jā
nē

pagarināŔana
Lua/C
Lua/C
Lua/C++
nē

Kāpēc

Å is ir jauns projekts, trÅ«kst daudz lietu, dažas ir agrÄ«nā alfa versijā. Bet sÅ«tnis, arÄ« savas jaunÄ«bas dēļ, strauji attÄ«stās un jau tam ir daudz interesantu iespēju: dinamiska konfigurācija, daudzi gatavi filtri, vienkārÅ”s interfeiss savu filtru rakstÄ«Å”anai.
No tā izriet pielietoŔanas jomas, taču vispirms ir 2 pretraksti:

  • Statiskā atsitiena.

Fakts ir tāds, ka Å”obrÄ«d iekŔā sÅ«tnis nav keÅ”atmiņas atbalsta. Google puiÅ”i to mēģina lai salabotu. Ideja tiks Ä«stenota vienu reizi sÅ«tnis visus RFC atbilstÄ«bas smalkumus (zoodārza galvenes), un konkrētām implementācijām izveidojiet saskarni. Bet pagaidām tas nav pat alfa, arhitektÅ«ra tiek apspriesta, PR atvērts (kamēr es rakstÄ«ju PR rakstu, PR sastinga, bet Å”is punkts joprojām ir aktuāls).

Pagaidām statikai izmantojiet nginx.

  • Statiskā konfigurācija.

Jūs varat to izmantot, bet sūtnis Tas nav tam radīts. Statiskās konfigurācijas funkcijas netiks atklātas. Ir daudz momentu:

Rediģējot konfigurāciju yaml, jÅ«s maldÄ«sities, lamāsit izstrādātājus par daudzvārdÄ«bu un domājat, ka nginx/haproxy konfigurācijas, lai arÄ« mazāk strukturētas, tomēr ir kodolÄ«gākas. Tā ir bÅ«tÄ«ba. Nginx un Haproxy konfigurācija tika izveidota rediģēŔanai ar roku, un sÅ«tnis Ä£enerÄ“Å”anai no koda. Visa konfigurācija ir aprakstÄ«ta protobuf, Ä£enerējot to no proto failiem, ir daudz grÅ«tāk kļūdÄ«ties.

Canary, b/g izvietoÅ”anas scenāriji un daudz kas cits parasti tiek ieviests tikai dinamiskā konfigurācijā. Es nesaku, ka to nevar izdarÄ«t statiski, mēs visi tā darām. Bet Å”im nolÅ«kam jebkurā no balansieriem ir jāuzliek kruÄ·i sÅ«tnis ieskaitot.

Uzdevumi, kuru veikŔanai sūtnis ir neaizstājams:

  • Satiksmes balansÄ“Å”ana sarežģītās un dinamiskās sistēmās. Tas ietver pakalpojumu tÄ«klu, taču tas ne vienmēr ir vienÄ«gais.
  • NepiecieÅ”amÄ«ba pēc izplatÄ«tas izsekoÅ”anas funkcionalitātes, sarežģītas autorizācijas vai citas funkcionalitātes, kas ir pieejama sÅ«tnis out of the box vai ērti ieviests, bet nginx/haproxy ir jābÅ«t lua un apÅ”aubāmu spraudņu ielenkumā.

Abi, ja nepiecieÅ”ams, nodroÅ”ina augstu veiktspēju.

Kā tas darbojas

Envoy tiek izplatīts bināros failos tikai kā docker attēls. Attēlā jau ir statiskas konfigurācijas piemērs. Bet mūs tas interesē tikai struktūras izpratnei.

envoy.yaml statiskā konfigurācija

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

Dinamiskā konfigurācija

Kādai problēmai mēs meklējam risinājumu? JÅ«s nevarat vienkārÅ”i pārlādēt slodzes lÄ«dzsvara konfigurāciju zem slodzes; radÄ«sies ā€œmazasā€ problēmas:

  • Konfigurācijas validācija.

Konfigurācija var būt liela, tā var būt ļoti liela, ja mēs to visu vienlaikus pārslogojam, palielinās iespēja, ka kaut kur būs kļūda.

  • Ilgmūžīgi savienojumi.

Inicializējot jaunu klausÄ«tāju, jārÅ«pējas par savienojumiem, kas darbojas vecajā, ja izmaiņas notiek bieži un ir ilgstoÅ”i savienojumi, jums bÅ«s jāmeklē kompromiss. Sveiki, kubernetes ingress uz nginx.

  • AktÄ«vās veselÄ«bas pārbaudes.

Ja mums ir aktÄ«vas veselÄ«bas pārbaudes, pirms trafika nosÅ«tÄ«Å”anas tās visas ir vēlreiz jāpārbauda jaunajā konfigurācijā. Ja augÅ”tecē ir daudz, tas aizņem laiku. Sveiki, haproxy.

Kā tas tiek atrisināts sÅ«tnisIelādējot konfigurāciju dinamiski, atbilstoÅ”i pÅ«la modelim, var to sadalÄ«t atseviŔķās daļās un nemainÄ«t to daļu, kas nav mainÄ«jusies. Piemēram, klausÄ«tājs, kura atkārtota inicializācija ir dārga un reti mainās.

Konfigurācija sūtnis (no iepriekŔ esoŔā faila) ir Ŕādas entītijas:

  • klausÄ«tājs ā€” klausÄ«tājs, kas karājas pie noteikta IP/porta
  • virtuālais resursdators - virtuālais resursdators pēc domēna nosaukuma
  • marÅ”ruts - lÄ«dzsvaroÅ”anas noteikums
  • grupa ā€” augÅ”teču grupa ar balansÄ“Å”anas parametriem
  • galapunkts ā€” iepriekŔējās instances adrese

Katru no Ŕīm entÄ«tijām un dažas citas var aizpildÄ«t dinamiski; Å”im nolÅ«kam konfigurācijā ir norādÄ«ta pakalpojuma adrese, no kuras tiks saņemta konfigurācija. Pakalpojums var bÅ«t REST vai gRPC, vēlams gRPC.

Pakalpojumi tiek attiecīgi nosaukti: LDS, VHDS, RDS, CDS un EDS. Varat apvienot statisko un dinamisko konfigurāciju ar ierobežojumu, ka dinamisku resursu nevar norādīt statiskā resursā.

Lielākajai daļai uzdevumu pietiek ar pēdējo trÄ«s pakalpojumu ievieÅ”anu, tos sauc par ADS (Aggregated Discovery Service). Java un tur ir gatava gRPC datu plaknes ievieÅ”ana, kurā jums vienkārÅ”i jāaizpilda objekti no sava avota.

Konfigurācija notiek Ŕādā formā:

envoy.yaml dinamiskā konfigurācija

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

Darbojoties sÅ«tnis ar Å”o konfigurāciju tas izveidos savienojumu ar vadÄ«bas plakni un mēģinās pieprasÄ«t RDS, CDS un EDS konfigurāciju. Ir aprakstÄ«ts, kā notiek mijiedarbÄ«bas process Å”eit.

ÄŖsumā, sÅ«tnis nosÅ«ta pieprasÄ«jumu, norādot pieprasÄ«tā resursa veidu, mezgla versiju un parametrus. Atbildot uz to, tas saņem resursu un versiju; ja versija vadÄ«bas plaknē nav mainÄ«jusies, tā nereaģē.
Ir 4 mijiedarbības iespējas:

  • Viena gRPC straume visu veidu resursiem, tiek nosÅ«tÄ«ts pilns resursa statuss.
  • AtseviŔķas plÅ«smas, pilnā stāvoklÄ«.
  • Viena plÅ«sma, pakāpenisks stāvoklis.
  • AtseviŔķas plÅ«smas, pakāpenisks stāvoklis.

Inkrementālā xDS ļauj samazināt satiksmi starp vadÄ«bas plakni un sÅ«tnis, tas attiecas uz lielām konfigurācijām. Bet tas sarežģī mijiedarbÄ«bu; pieprasÄ«jumā ir ietverts abonÄ“Å”anas un abonÄ“Å”anas resursu saraksts.

MÅ«su piemērā tiek izmantota ADS ā€” viena straume RDS, CDS, EDS un neinkrementālajam režīmam. Lai iespējotu inkrementālo režīmu, ir jānorāda api_type: DELTA_GRPC

Tā kā pieprasījums satur mezgla parametrus, mēs varam nosūtīt dažādus resursus vadības plaknei dažādiem gadījumiem sūtnis, tas ir ērti, lai izveidotu servisa tīklu.

IesildīŔanās

uz sÅ«tnis startējot vai saņemot jaunu konfigurāciju no vadÄ«bas plaknes, tiek palaists resursa iesildÄ«Å”anas process. Tas ir sadalÄ«ts klausÄ«tāja iesildÄ«Å”anā un klastera iesildÄ«Å”anā. Pirmais tiek palaists, kad notiek izmaiņas RDS/LDS, otrais, kad CDS/EDS. Tas nozÄ«mē, ka, mainoties tikai augÅ”tecēm, klausÄ«tājs netiek izveidots no jauna.

IesildīŔanās procesa laikā taimauta laikā no vadības plaknes tiek gaidīti atkarīgi resursi. Ja iestājas taimauts, inicializācija nebūs veiksmīga un jaunais klausītājs nesāks klausīties portā.
Inicializācijas secÄ«ba: EDS, CDS, aktÄ«vā veselÄ«bas pārbaude, RDS, LDS. Ja ir iespējotas aktÄ«vās veselÄ«bas pārbaudes, satiksme sāksies augÅ”up tikai pēc vienas veiksmÄ«gas veselÄ«bas pārbaudes.

Ja klausÄ«tājs tika izveidots no jauna, vecais pāriet uz DRAIN stāvokli un tiks dzēsts pēc visu savienojumu aizvērÅ”anas vai taimauta beigām. --drain-time-s, noklusējuma 10 minÅ«tes.

Turpināsim.

Avots: www.habr.com

Pievieno komentāru