Siirtyminen Nginxistä Envoy Proxyyn

Hei, Habr! Tuon huomionne käännöksen viestistä: Siirtyminen Nginxistä Envoy Proxyyn.

Envoy on korkean suorituskyvyn hajautettu välityspalvelin (kirjoitettu C++-kielellä), joka on suunniteltu yksittäisiin palveluihin ja sovelluksiin, se on myös tietoliikenneväylä ja "yleinen tietotaso", joka on suunniteltu suuriin mikropalveluiden "service mesh" -arkkitehtuureihin. Sitä luotaessa otettiin huomioon ratkaisut ongelmiin, jotka syntyivät palvelinten, kuten NGINX, HAProxy, hardware load balancers ja pilvi kuormantasaajat, kehitystyössä. Envoy toimii jokaisen sovelluksen rinnalla ja tiivistää verkon tarjotakseen yhteisiä toimintoja alustasta riippumatta. Kun infrastruktuurin kaikki palveluliikenne kulkee Envoy-verkon läpi, ongelma-alueiden visualisointi on helppoa tasaisen havaittavissa, virittää yleistä suorituskykyä ja lisätä ydintoimintoja tietyssä paikassa.

Kyvyt

  • Prosessin ulkopuolinen arkkitehtuuri: Envoy on itsenäinen, suorituskykyinen palvelin, joka vie pienen määrän RAM-muistia. Se toimii yhdessä minkä tahansa sovelluskielen tai -kehyksen kanssa.
  • http/2- ja grpc-tuki: Envoylla on ensiluokkainen http/2- ja grpc-tuki saapuville ja lähteville yhteyksille. Tämä on läpinäkyvä välityspalvelin välillä http/1.1 - http/2.
  • Kehittynyt kuormantasaus: Envoy tukee edistyneitä kuorman tasausominaisuuksia, kuten automaattisia uudelleenyrityksiä, ketjun katkaisua, yleistä nopeuden rajoitusta, pyyntöjen varjostusta, paikallisen vyöhykkeen kuormituksen tasapainotusta jne.
  • Configuration Management API: envoy tarjoaa vankan API:n konfiguraatioidesi dynaamiseen hallintaan.
  • Havaittavuus: L7-liikenteen syvä havaittavuus, hajautetun jäljityksen natiivi tuki ja mongodb-, dynamodb- ja monien muiden sovellusten havaittavuus.

Vaihe 1 — Esimerkki NGINX Config

Tämä komentosarja käyttää erityisesti muotoiltua tiedostoa nginx.conf, perustuu täydelliseen esimerkkiin osoitteesta NGINX Wiki. Voit tarkastella asetuksia editorissa avaamalla nginx.conf

nginx-lähdemääritys

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-kokoonpanoissa on yleensä kolme avainelementtiä:

  1. NGINX-palvelimen, lokirakenteen ja Gzip-toimintojen määrittäminen. Tämä määritellään kaikissa tapauksissa globaalisti.
  2. NGINX:n määrittäminen hyväksymään pyynnöt isännälle one.example.com portissa 8080.
  3. Kohdepaikan määrittäminen, kuinka käsitellä URL-osoitteen eri osien liikennettä.

Kaikki asetukset eivät koske Envoy Proxya, eikä sinun tarvitse määrittää joitain asetuksia. Envoy Proxylla on neljä avaintyyppiä, jotka tukevat NGINX:n tarjoamaa ydininfrastruktuuria. Ydin on:

  • Kuuntelijat: He määrittävät, kuinka Envoy Proxy hyväksyy saapuvat pyynnöt. Envoy Proxy tukee tällä hetkellä vain TCP-pohjaisia ​​kuuntelijoita. Kun yhteys on muodostettu, se välitetään suodattimille käsittelyä varten.
  • Suodattimet: Ne ovat osa putkiarkkitehtuuria, joka voi käsitellä saapuvia ja lähteviä tietoja. Tämä toiminto sisältää suodattimia, kuten Gzip, joka pakkaa tiedot ennen lähettämistä asiakkaalle.
  • Reitittimet: Ne välittävät liikenteen vaadittuun määränpäähän, joka määritellään klusteriksi.
  • Klusterit: Ne määrittelevät päätepisteen liikenne- ja konfigurointiparametreille.

Käytämme näitä neljää komponenttia luodaksemme Envoy Proxy -kokoonpanon, joka vastaa tiettyä NGINX-kokoonpanoa. Envoyn tavoitteena on työskennellä API:iden ja dynaamisen konfiguroinnin kanssa. Tässä tapauksessa peruskokoonpano käyttää staattisia, kovakoodattuja NGINX-asetuksia.

Vaihe 2 - NGINX-määritys

Ensimmäinen osa nginx.conf määrittää joitakin NGINX-sisäosia, jotka on määritettävä.

Työntekijöiden yhteydet

Alla oleva kokoonpano määrittää työntekijäprosessien ja yhteyksien määrän. Tämä osoittaa, kuinka NGINX skaalautuu kysyntään.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy hallitsee työnkulkuja ja yhteyksiä eri tavoin.

Envoy luo työsäikeen jokaiselle järjestelmän laitteistosäikeelle. Jokainen työsäie suorittaa estävän tapahtumasilmukan, joka on vastuussa

  1. Kuuntelemalla jokaista kuulijaa
  2. Uusien yhteyksien hyväksyminen
  3. Suodatinsarjan luominen yhteyttä varten
  4. Käsittele kaikki I/O-toiminnot yhteyden elinkaaren aikana.

Kaikki yhteyden jatkokäsittely käsitellään kokonaan työntekijäsäikeessä, mukaan lukien edelleenlähetyskäyttäytyminen.

Jokaiselle Envoyn työntekijäsäikeelle on yhteysvarasto. Joten HTTP/2-yhteyspoolit muodostavat vain yhden yhteyden ulkoista isäntä kohden kerrallaan. Jos työsäikeitä on neljä, HTTP/2-yhteyksiä on neljä vakaassa tilassa olevaa ulkoista isäntäkohtaa. Kun kaikki säilytetään yhdessä työsäikeessä, lähes kaikki koodi voidaan kirjoittaa ilman estoa, ikään kuin se olisi yksisäikeinen. Jos työsäikeitä on varattu enemmän kuin on tarpeen, tämä voi johtaa muistin hukkaan, luo suuren määrän käyttämättömiä yhteyksiä ja vähentää yhteyksien palauttamisen määrää.

Lisätietoja käy osoitteessa Envoy Proxy -blogi.

HTTP-määritys

Seuraava NGINX-määrityslohko määrittää HTTP-asetukset, kuten:

  • Mitä mime-tyyppejä tuetaan
  • Oletusaikakatkaisut
  • Gzip-määritykset

Voit mukauttaa näitä ominaisuuksia Envoy Proxyn suodattimilla, joista keskustelemme myöhemmin.

Vaihe 3 - Palvelimen määritykset

HTTP-määrityslohkossa NGINX-kokoonpano määrittää kuuntelemaan porttia 8080 ja vastaamaan saapuviin toimialuepyyntöihin. one.example.com и www.one.example.com.

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

Envoyn sisällä sitä hallitsevat Kuuntelijat.

Lähettiläät kuuntelijat

Tärkein näkökohta Envoy Proxyn käytön aloittamisessa on kuuntelijoiden määritteleminen. Sinun on luotava määritystiedosto, joka kuvaa, kuinka haluat suorittaa Envoy-esiintymän.

Alla oleva koodinpätkä luo uuden kuuntelijan ja sitoo sen porttiin 8080. Kokoonpano kertoo Envoy Proxylle, mihin portteihin sen tulee sitoutua saapuvia pyyntöjä varten.

Envoy Proxy käyttää YAML-merkintää kokoonpanossaan. Johdatus tähän merkintään löytyy täältä linkki.

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

Ei tarvitse määritellä palvelimen nimi, koska Envoy Proxy -suodattimet käsittelevät tämän.

Vaihe 4 - Sijainnin määrittäminen

Kun pyyntö tulee NGINX:ään, sijaintilohko määrittää, kuinka liikenne käsitellään ja minne reititetään. Seuraavassa fragmentissa kaikki liikenne sivustolle siirretään ylävirran (kääntäjän huomautus: ylävirta on yleensä sovelluspalvelin) klusteriin nimeltä kohderyhmä. Ylävirran klusteri määrittelee solmut, joiden tulee käsitellä pyyntö. Keskustelemme tästä seuraavassa vaiheessa.

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

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

Envoyssa Filters tekee tämän.

lähettilässuodattimet

Staattisessa kokoonpanossa suodattimet määrittävät, kuinka saapuvat pyynnöt käsitellään. Tässä tapauksessa asetamme vastaavat suodattimet palvelimen_nimet edellisessä vaiheessa. Kun saapuvat pyynnöt vastaavat tiettyjä verkkotunnuksia ja reittejä, liikenne reititetään klusteriin. Tämä vastaa NGINX-alhaalta ylös -kokoonpanoa.

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 lähettiläs.http_connection_manager on Envoy Proxyn sisäänrakennettu suodatin. Muita suodattimia ovat mm Redis, Mongo, TCP. Löydät täydellisen luettelon osoitteessa dokumentointi.

Lisätietoja muista kuormituksen tasauskäytännöistä on osoitteessa Lähettilään asiakirjat.

Vaihe 5 - Välityspalvelimen ja ylävirran määritys

NGINX:ssä ylävirran asetukset määrittelevät joukon kohdepalvelimia, jotka käsittelevät liikennettä. Tässä tapauksessa osoitettiin kaksi klusteria.

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

Envoyssa tätä hallitaan klustereilla.

lähettiläsklusterit

Ylävirran vastine määritellään klustereiksi. Tässä tapauksessa liikennettä palvelevat isännät on tunnistettu. Isäntien käyttötapa, kuten aikakatkaisut, määritellään klusterin kokoonpanoksi. Tämä mahdollistaa tarkemman hallinnan sellaisista näkökohdista kuin latenssi ja kuormituksen tasapainotus.

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 }}
    ]

Palveluhakua käytettäessä STRICT_DNS Envoy ratkaisee jatkuvasti ja asynkronisesti määritetyt DNS-kohteet. Jokaista DNS-tuloksen palauttamaa IP-osoitetta pidetään eksplisiittisenä isäntänä ylävirran klusterissa. Tämä tarkoittaa, että jos pyyntö palauttaa kaksi IP-osoitetta, Envoy olettaa, että klusterissa on kaksi isäntää, ja molempien on oltava kuormitettuja. Jos isäntä poistetaan tuloksesta, Envoy olettaa, että sitä ei enää ole olemassa ja vetää liikenteen kaikista olemassa olevista yhteyspoolista.

Katso lisätietoja Lähettiläsasiakirjat.

Vaihe 6 – Kirjaa pääsy ja virheet

Lopullinen konfigurointi on rekisteröinti. Virhelokien levylle työntämisen sijaan Envoy Proxy käyttää pilvipohjaista lähestymistapaa. Kaikki sovelluslokit tulostetaan osoitteeseen stdout и stderr.

Kun käyttäjät tekevät pyynnön, käyttölokit ovat valinnaisia ​​ja oletuksena pois käytöstä. Ota määritys käyttöön ottaaksesi HTTP-pyyntöjen käyttölokit käyttöön access_log HTTP-yhteydenhallintaa varten. Polku voi olla joko laite, kuten stdouttai levyllä oleva tiedosto tarpeidesi mukaan.

Seuraava määritys uudelleenohjaa kaikki käyttölokit kohteeseen stdout (Kääntäjän huomautus - stdout vaaditaan envoy-käyttöön Dockerin sisällä. Jos käytetään ilman dockeria, korvaa /dev/stdout tavallisen lokitiedoston polulla). Kopioi katkelma yhteydenhallinnan määritysosioon:

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

Tulosten pitäisi näyttää tältä:

      - 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:

Envoylla on oletusarvoisesti muotomerkkijono, joka sisältää HTTP-pyynnön tiedot:

[%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

Tämän muotoisen merkkijonon tulos 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"

Tulosteen sisältöä voidaan mukauttaa asettamalla muotokenttä. Esimerkiksi:

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"

Lokirivi voidaan tulostaa myös JSON-muodossa asettamalla kenttä json_format. Esimerkiksi:

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

Lisätietoja lähettiläsrekisteröintimenetelmistä on osoitteessa

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

Kirjaaminen ei ole ainoa tapa saada tietoa työskentelystä Envoy Proxyn kanssa. Siihen on sisäänrakennettu edistyneitä jäljitys- ja mittausominaisuuksia. Voit tutustua tarkemmin osoitteessa jäljitysasiakirjat kautta tai Interaktiivinen jäljitysskripti.

Vaihe 7 - Käynnistä

Olet nyt siirtänyt kokoonpanosi NGINX:stä Envoy Proxyyn. Viimeinen vaihe on käynnistää Envoy Proxy -esiintymä sen testaamiseksi.

Suorita käyttäjänä

NGINX-määritysrivin yläosassa käyttäjä www www; määrittelee NGINX:n ajavan heikommassa asemassa olevana käyttäjänä turvallisuuden parantamiseksi.

Envoy Proxy käyttää pilvipohjaista lähestymistapaa prosessin hallintaan. Kun käytämme Envoy-välityspalvelinta säilön kautta, voimme määrittää heikommassa asemassa olevan käyttäjän.

Käynnistetään Envoy Proxy

Alla oleva komento suorittaa Envoy Proxy -palvelimen Docker-säilön kautta isännässä. Tämä komento antaa Envoylle mahdollisuuden kuunnella saapuvia pyyntöjä portissa 80. Kuitenkin, kuten kuuntelijan kokoonpanossa on määritetty, Envoy Proxy kuuntelee saapuvaa liikennettä portissa 8080. Tämä mahdollistaa prosessin suorittamisen heikon käyttäjänä.

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

Testaus

Kun välityspalvelin on käynnissä, testejä voidaan nyt tehdä ja käsitellä. Seuraava cURL-komento lähettää pyynnön välityspalvelimen määrityksissä määritetyllä isäntäotsikolla.

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

HTTP-pyyntö aiheuttaa virheen 503. Tämä johtuu siitä, että ylävirran yhteydet eivät toimi eivätkä ole käytettävissä. Siksi Envoy Proxylla ei ole käytettävissä olevia kohteita pyynnölle. Seuraava komento käynnistää sarjan HTTP-palveluita, jotka vastaavat Envoylle määritettyä kokoonpanoa.

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

Saatavilla olevien palvelujen avulla Envoy voi onnistuneesti välittää liikennettä määränpäähänsä.

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

Sinun pitäisi nähdä vastaus, joka osoittaa, mikä Docker-säilö käsitteli pyynnön. Envoy Proxy -lokeissa sinun pitäisi nähdä myös pääsymerkkijono.

Muita HTTP-vastausotsikoita

Näet muita HTTP-otsikoita varsinaisen pyynnön vastausotsikoissa. Otsikko näyttää ajan, jonka ylävirran isäntä käytti pyynnön käsittelyyn. Ilmaistu millisekunteina. Tämä on hyödyllistä, jos asiakas haluaa määrittää palveluajan verkon latenssiin verrattuna.

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

Lopullinen konfigurointi

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 }

Lisätiedot kääntäjältä

Ohjeet Envoy Proxyn asentamiseen löytyvät verkkosivulta https://www.getenvoy.io/

Oletusarvoisesti rpm:llä ei ole systemd-palvelukonfiguraatiota.

Lisää 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

Sinun on luotava hakemisto /etc/envoy/ ja asetettava config.yaml config sinne.

Siellä on sähkekeskustelu lähettilään välityspalvelimella: https://t.me/envoyproxy_ru

Envoy Proxy ei tue staattisen sisällön näyttämistä. Joten kuka voi äänestää ominaisuutta: https://github.com/envoyproxy/envoy/issues/378

Vain rekisteröityneet käyttäjät voivat osallistua kyselyyn. Kirjaudu sisään, ole kiltti.

Rohkaisiko tämä viesti sinua asentamaan ja testaamaan lähettivälityspalvelimen?

  • kyllä

  • ei

75 käyttäjää äänesti. 18 käyttäjää pidättyi äänestämästä.

Lähde: will.com

Lisää kommentti