Nginxilt üleminek Envoy Proxyle

Tere, Habr! Juhin teie tähelepanu postituse tõlkele: Nginxilt üleminek Envoy Proxyle.

Envoy on suure jõudlusega hajutatud puhverserver (kirjutatud C++ keeles), mis on loodud üksikute teenuste ja rakenduste jaoks, see on ka sidesiin ja "universaalne andmetasand", mis on mõeldud suurte mikroteenuste "service mesh" arhitektuuride jaoks. Selle loomisel võeti arvesse lahendusi probleemidele, mis tekkisid serverite nagu NGINX, HAProxy, riistvara koormuse tasakaalustajad ja pilvekoormuse tasakaalustajad arendamise käigus. Envoy töötab iga rakenduse kõrval ja võtab võrgust kokku, et pakkuda ühist funktsionaalsust olenemata platvormist. Kui kogu teenuseliiklus infrastruktuuris voolab läbi Envoy võrgusilma, on probleemsete piirkondade järjepideva jälgitavusega visualiseerimine, üldise jõudluse häälestamine ja põhifunktsioonide lisamine konkreetses asukohas lihtne.

võimalusi

  • Protsessiväline arhitektuur: envoy on iseseisev, suure jõudlusega server, mis võtab enda alla väikese koguse RAM-i. See töötab koos mis tahes rakenduskeele või raamistikuga.
  • http/2 ja grpc tugi: envoy'l on esmaklassiline http/2 ja grpc tugi sissetulevate ja väljaminevate ühenduste jaoks. See on läbipaistev puhverserver vahemikust http/1.1 kuni http/2.
  • Täiustatud koormuse tasakaalustamine: saadik toetab täiustatud koormuse tasakaalustamise funktsioone, sealhulgas automaatseid korduskatseid, ahela katkestamist, globaalset kiiruse piiramist, päringu varjutamist, kohaliku tsooni koormuse tasakaalustamist jne.
  • Konfiguratsioonihalduse API: envoy pakub tugevat API-t teie konfiguratsiooni dünaamiliseks haldamiseks.
  • Vaadeldavus: L7 liikluse sügav jälgitavus, natiivne tugi hajutatud jälgimiseks ning mongodb, dynamodb ja paljude muude rakenduste jälgitavus.

1. samm – NGINX-i konfiguratsiooni näide

See skript kasutab spetsiaalselt loodud faili nginx.conf, mis põhineb kogu näitel alates NGINX Wiki. Saate konfiguratsiooni vaadata redaktoris avades nginx.conf

nginxi lähtekoodi konfiguratsioon

user  www www;
pid /var/run/nginx.pid;
worker_processes  2;

events {
  worker_connections   2000;
}

http {
  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 8k;
  gzip_types       text/plain;

  log_format main      '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';

  log_format download  '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

  server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

    access_log   /var/log/nginx.access_log  main;
    error_log  /var/log/nginx.error_log  info;

    location / {
      proxy_pass         http://targetCluster/;
      proxy_redirect     off;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
    }
  }
}

NGINX-i konfiguratsioonidel on tavaliselt kolm põhielementi:

  1. NGINX-serveri, logistruktuuri ja Gzipi funktsioonide seadistamine. See on kõigil juhtudel globaalselt määratletud.
  2. NGINX-i konfigureerimine hostile saadetavate taotluste vastuvõtmiseks one.example.com pordis 8080.
  3. Sihtkoha seadistamine, URL-i erinevate osade liikluse haldamine.

Kõik konfiguratsioonid ei kehti Envoy Proxy puhul ja te ei pea mõnda seadet konfigureerima. Envoy Proxy on neli võtmetüüpi, mis toetavad NGINX-i pakutavat põhiinfrastruktuuri. Tuum on:

  • Kuulajad: Nad määravad, kuidas saadiku puhverserver sissetulevaid taotlusi vastu võtab. Envoy Proxy toetab praegu ainult TCP-põhiseid kuulajaid. Kui ühendus on loodud, edastatakse see töötlemiseks filtrite komplektile.
  • Filtrid: Need on osa torujuhtme arhitektuurist, mis suudab töödelda sissetulevaid ja väljaminevaid andmeid. See funktsioon sisaldab filtreid, nagu Gzip, mis tihendab andmed enne nende kliendile saatmist.
  • Ruuterid: Nad edastavad liikluse soovitud sihtkohta, mis on määratletud klastrina.
  • Klastrid: Need määravad liikluse ja konfiguratsiooniparameetrite lõpp-punkti.

Kasutame neid nelja komponenti, et luua konkreetne NGINX-i konfiguratsioonile vastav Envoy Proxy konfiguratsioon. Envoy eesmärk on töötada API-de ja dünaamilise konfiguratsiooniga. Sel juhul kasutab põhikonfiguratsioon NGINXi staatilisi, kõvakodeeritud sätteid.

2. samm – NGINX-i konfigureerimine

Esimene osa nginx.conf määratleb mõned NGINX-i sisemised elemendid, mida tuleb konfigureerida.

Töötajate ühendused

Allolev konfiguratsioon määrab tööprotsesside ja ühenduste arvu. See näitab, kuidas NGINX mastaabib nõudluse rahuldamiseks.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy haldab töövooge ja ühendusi erineval viisil.

Envoy loob iga süsteemi riistvaralõime jaoks töölõime. Iga töötaja lõim käivitab mitteblokeeriva sündmusetsükli, mille eest vastutab

  1. Iga kuulaja ärakuulamine
  2. Uute ühenduste vastuvõtmine
  3. Ühenduse jaoks filtrite komplekti loomine
  4. Töötlege kõiki I/O toiminguid ühenduse eluea jooksul.

Kogu edasist ühenduse töötlemist, sealhulgas edasisaatmiskäitumist, käsitletakse täielikult töötaja lõimes.

Iga töötaja niidi jaoks on Envoy's ühendusbassein. Seega loovad HTTP/2-ühenduse kogumid korraga ainult ühe ühenduse välise hosti kohta. Kui töölõime on neli, on stabiilses olekus neli HTTP/2-ühendust välise hosti kohta. Hoides kõike ühes töölõimes, saab peaaegu kogu koodi kirjutada ilma blokeerimata, nagu oleks see ühe lõimega. Kui eraldatakse rohkem töölõime, kui vaja, võib see kaasa tuua mälu raiskamise, tekitades suure hulga jõudeolevaid ühendusi ja vähendades ühenduste basseini tagasisaatmise arvu.

Lisateabe saamiseks külastage veebisaiti Envoy Proxy ajaveeb.

HTTP konfiguratsioon

Järgmine NGINX-i konfiguratsiooniplokk määratleb HTTP-sätted, näiteks:

  • Milliseid mime tüüpe toetatakse
  • Vaikimisi ajalõpud
  • Gzipi konfiguratsioon

Saate neid aspekte kohandada Envoy Proxy filtrite abil, millest räägime hiljem.

3. samm – serveri konfigureerimine

HTTP konfiguratsiooniplokis määrab NGINX konfiguratsioon kuulama porti 8080 ja vastama domeenide sissetulevatele päringutele one.example.com и www.one.example.com.

 server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

Envoy sees kontrollivad seda kuulajad.

Saatke kuulajaid

Envoy Proxyga alustamise kõige olulisem aspekt on kuulajate määratlemine. Peate looma konfiguratsioonifaili, mis kirjeldab, kuidas soovite Envoy eksemplari käitada.

Allolev koodilõik loob uue kuulaja ja seob selle pordiga 8080. Konfiguratsioon ütleb Envoy Proxyle, milliste portidega see peaks sissetulevate päringute puhul seostuma.

Envoy Proxy kasutab oma konfigureerimiseks YAML-i tähistust. Selle tähise sissejuhatuseks vaadake siit link.

Copy to Editorstatic_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }

Pole vaja määratleda server_nimi, kuna Envoy Proxy filtrid saavad sellega hakkama.

4. samm – asukoha konfigureerimine

Kui päring saabub NGINX-i, määrab asukohaplokk, kuidas liiklust töödelda ja kuhu suunata. Järgmises fragmendis kantakse kogu saidi liiklus üle ülesvoolu (tõlkija märkus: ülesvoolu on tavaliselt rakendusserver) klastrisse nimega sihtklaster. Ülesvoolu klaster määratleb sõlmed, mis peaksid päringut töötlema. Arutame seda järgmises etapis.

location / {
    proxy_pass         http://targetCluster/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
}

Envoy's teeb seda Filters.

Saadiku filtrid

Staatilise konfiguratsiooni puhul määravad filtrid, kuidas sissetulevaid päringuid töödelda. Sel juhul määrame sobivad filtrid serveri_nimed eelmises etapis. Kui saabuvad sissetulevad päringud, mis vastavad teatud domeenidele ja marsruutidele, suunatakse liiklus klastrisse. See on samaväärne NGINX-i alt-üles konfiguratsiooniga.

Copy to Editor    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router

Nimi saadik.http_ühenduse_haldur on Envoy Proxy sisseehitatud filter. Muud filtrid hõlmavad Redis, Mongo, TCP. Täieliku nimekirja leiate aadressilt dokumentatsioon.

Lisateavet muude koormuse tasakaalustamise poliitikate kohta leiate aadressilt Saadiku dokumentatsioon.

5. samm – puhverserveri ja ülesvoolu konfigureerimine

NGINX-is määratleb ülesvoolu konfiguratsioon sihtserverite komplekti, mis töötlevad liiklust. Sel juhul määrati kaks klastrit.

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

Envoys haldavad seda klastrid.

Saadik Klastrid

Ülesvoolu ekvivalent on määratletud klastritena. Sel juhul on liiklust teenindavad hostid tuvastatud. Hostidele juurdepääsu viis (nt ajalõpud) on määratletud klastri konfiguratsioonina. See võimaldab täpsemat kontrolli selliste aspektide üle nagu latentsusaeg ja koormuse tasakaalustamine.

Copy to Editor  clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

Teenusetuvastuse kasutamisel STRICT_DNS Envoy lahendab pidevalt ja asünkroonselt määratud DNS-i sihtmärgid. Iga DNS-tulemuse tagastatud IP-aadress loetakse ülesvoolu klastris selgesõnaliseks hostiks. See tähendab, et kui päring tagastab kaks IP-aadressi, eeldab Envoy, et klastris on kaks hosti ja mõlemad peavad olema koormatud. Kui host eemaldatakse tulemusest, eeldab Envoy, et seda enam ei eksisteeri, ja tõmbab liikluse kõigist olemasolevatest ühenduse kogumitest.

Lisateavet vt Esindaja volikirja dokumentatsioon.

6. samm – logi juurdepääs ja vead

Lõplik konfiguratsioon on registreerimine. Vealogide kettale surumise asemel kasutab Envoy Proxy pilvepõhist lähenemist. Kõik rakenduste logid väljastatakse aadressile stdout и stderr.

Kui kasutajad esitavad päringu, on juurdepääsulogid valikulised ja vaikimisi keelatud. HTTP-päringute juurdepääsulogide lubamiseks lubage konfiguratsioon juurdepääsu_log HTTP-ühenduse halduri jaoks. Tee võib olla kas seade, näiteks stdoutvõi faili kettale, olenevalt teie vajadustest.

Järgmine konfiguratsioon suunab kõik juurdepääsulogid ümber stdout (Tõlkija märkus – stdout on nõutav dockeri sees envoy kasutamiseks. Kui seda kasutatakse ilma dockerita, siis asenda /dev/stdout tavalise logifaili teega). Kopeerige koodilõik ühendusehalduri konfiguratsiooni jaotisesse:

Copy to Clipboardaccess_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"

Tulemused peaksid välja nägema järgmised:

      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:

Vaikimisi on saadikul vormingustring, mis sisaldab HTTP-päringu üksikasju:

[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n

Selle vormingu stringi tulemus on:

[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"

Väljundi sisu saab kohandada vorminguvälja määramisega. Näiteks:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n"

Logirea saab välja seadistades väljastada ka JSON-vormingus json_format. Näiteks:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}

Lisateavet saadiku registreerimise metoodika kohta leiate aadressilt

https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries

Logimine pole ainus viis Envoy Proxyga töötamise kohta ülevaate saamiseks. Sellesse on sisse ehitatud täiustatud jälgimise ja mõõdikute võimalused. Lisateavet saate aadressilt jälitusdokumentatsioon või kaudu Interaktiivne jälgimisskript.

7. samm – käivitamine

Olete nüüd oma konfiguratsiooni üle viinud NGINX-ilt Envoy Proxyle. Viimane samm on Envoy Proxy eksemplari käivitamine selle testimiseks.

Käivita kasutajana

NGINX-i konfiguratsioonirea ülaosas kasutaja www www; määrab turvalisuse parandamiseks NGINX-i käitama madala privilegeeritud kasutajana.

Envoy Proxy kasutab pilvepõhist lähenemist protsesside haldamiseks. Kui käivitame Envoy Proxy konteineri kaudu, saame määrata madala privilegeeritud kasutaja.

Envoy Proxy käivitamine

Allolev käsk käivitab Envoy Proxy hostis Dockeri konteineri kaudu. See käsk annab saadikule võimaluse kuulata sissetulevaid päringuid pordis 80. Kuid nagu on määratud kuulaja konfiguratsioonis, kuulab Envoy Proxy sissetulevat liiklust pordis 8080. See võimaldab protsessil töötada madala privilegeeritud kasutajana.

docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy

Katsetamine

Kui puhverserver töötab, saab nüüd teste teha ja töödelda. Järgmine käsk cURL väljastab päringu puhverserveri konfiguratsioonis määratletud hosti päisega.

curl -H "Host: one.example.com" localhost -i

HTTP-päring toob kaasa vea 503. Põhjus on selles, et ülesvoolu ühendused ei tööta ega ole saadaval. Seetõttu pole saadiku puhverserveril päringu jaoks saadaolevaid sihtkohti. Järgmine käsk käivitab HTTP-teenuste seeria, mis vastab saadiku jaoks määratud konfiguratsioonile.

docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;

Saadaolevate teenuste abil saab Envoy edukalt edastada liiklust sihtkohta.

curl -H "Host: one.example.com" localhost -i

Peaksite nägema vastust, mis näitab, milline Dockeri konteiner päringu töötles. Envoy Proxy logides peaksite nägema ka juurdepääsustringi väljundit.

Täiendavad HTTP vastuse päised

Tegeliku päringu vastuse päistes näete täiendavaid HTTP-päiseid. Päises kuvatakse aeg, mille ülesvoolu host kulutas päringu töötlemiseks. Väljendatakse millisekundites. See on kasulik, kui klient soovib võrgu latentsusega võrreldes määrata teenindusaega.

x-envoy-upstream-service-time: 0
server: envoy

Lõplik konfiguratsioon

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router
          clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9090 }

Lisainfo tõlkijalt

Envoy Proxy installimise juhised leiate veebisaidilt https://www.getenvoy.io/

Vaikimisi pole rpm-il süsteemiteenuse konfiguratsiooni.

Lisa systemd service config /etc/systemd/system/envoy.service:

[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
After=network-online.target
Requires=envoy-auth-server.service
Wants=nginx.service

[Service]
User=root
Restart=on-failure
ExecStart=/usr/bin/envoy --config-path /etc/envoy/config.yaml
[Install]
WantedBy=multi-user.target

Peate looma kataloogi /etc/envoy/ ja panema sinna config.yaml config.

Telegrammivestlus toimub saadiku puhverserveri abil: https://t.me/envoyproxy_ru

Envoy Proxy ei toeta staatilise sisu esitamist. Seega, kes saavad funktsiooni poolt hääletada: https://github.com/envoyproxy/envoy/issues/378

Küsitluses saavad osaleda ainult registreerunud kasutajad. Logi sissepalun.

Kas see postitus julgustas teid saatja puhverserverit installima ja testima?

  • jah

  • ei

75 kasutajat hääletas. 18 kasutajat jäi erapooletuks.

Allikas: www.habr.com

Lisa kommentaar