Migrācija no Nginx uz Envoy Proxy

Sveiks, Habr! Es vērÅ”u jÅ«su uzmanÄ«bu uz ziņas tulkojumu: Migrācija no Nginx uz Envoy Proxy.

Envoy ir augstas veiktspējas izplatÄ«ts starpniekserveris (rakstÄ«ts C++ valodā), kas paredzēts atseviŔķiem pakalpojumiem un lietojumprogrammām, tas ir arÄ« sakaru kopne un ā€œuniversālā datu plakneā€, kas paredzēta lielām mikropakalpojumu ā€œservice meshā€ arhitektÅ«rām. To veidojot, tika ņemti vērā risinājumi problēmām, kas radās tādu serveru kā NGINX, HAProxy, aparatÅ«ras slodzes balansētāju un mākoņu slodzes balansētāju izstrādes laikā. Envoy darbojas kopā ar katru lietojumprogrammu un apkopo tÄ«klu, lai nodroÅ”inātu kopÄ«gu funkcionalitāti neatkarÄ«gi no platformas. Kad visa pakalpojumu trafika infrastruktÅ«rā plÅ«st caur Envoy tÄ«klu, ir viegli vizualizēt problemātiskās zonas ar konsekventu novērojamÄ«bu, pielāgot vispārējo veiktspēju un pievienot pamatfunkcionalitāti noteiktā vietā.

Spējas

  • Ārpusprocesa arhitektÅ«ra: envoy ir autonoms, augstas veiktspējas serveris, kas aizņem nelielu daudzumu RAM. Tas darbojas kopā ar jebkuru lietojumprogrammas valodu vai sistēmu.
  • http/2 un grpc atbalsts: envoy ir pirmās klases http/2 un grpc atbalsts ienākoÅ”ajiem un izejoÅ”ajiem savienojumiem. Å is ir caurspÄ«dÄ«gs starpniekserveris no http/1.1 lÄ«dz http/2.
  • Uzlabotā slodzes lÄ«dzsvaroÅ”ana: sÅ«tnis atbalsta uzlabotas slodzes lÄ«dzsvaroÅ”anas funkcijas, tostarp automātiskus atkārtotus mēģinājumus, ķēdes pārtraukÅ”anu, globālās ātruma ierobežoÅ”anu, pieprasÄ«juma ēnojumu, lokālās zonas slodzes lÄ«dzsvaroÅ”anu utt.
  • Konfigurācijas pārvaldÄ«bas API: envoy nodroÅ”ina spēcÄ«gu API jÅ«su konfigurācijas dinamiskai pārvaldÄ«bai.
  • NovērojamÄ«ba: L7 trafika dziļa novērojamÄ«ba, vietējais atbalsts izplatÄ«tai izsekoÅ”anai un mongodb, dynamodb un daudzu citu lietojumprogrammu novērojamÄ«ba.

1. darbÄ«ba ā€” NGINX konfigurācijas piemērs

Å is skripts izmanto Ä«paÅ”i izveidotu failu nginx.conf, pamatojoties uz pilnu piemēru no NGINX Wiki. Konfigurāciju var apskatÄ«t redaktorā, atverot nginx.conf

nginx avota konfigurācija

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 konfigurācijām parasti ir trīs galvenie elementi:

  1. NGINX servera, žurnāla struktÅ«ras un Gzip funkcionalitātes konfigurÄ“Å”ana. Tas visos gadÄ«jumos ir definēts globāli.
  2. NGINX konfigurÄ“Å”ana, lai pieņemtu pieprasÄ«jumus saimniekdatoram one.example.com portā 8080.
  3. MērÄ·a atraÅ”anās vietas iestatÄ«Å”ana, kā apstrādāt trafiku dažādām URL daļām.

Ne visas konfigurācijas attieksies uz Envoy Proxy, un daži iestatījumi nav jākonfigurē. Envoy Proxy ir četri galvenie veidi, kas atbalsta NGINX piedāvāto pamatinfrastruktūru. Kodols ir:

  • KlausÄ«tāji: Tie nosaka, kā Envoy Proxy pieņem ienākoÅ”os pieprasÄ«jumus. Envoy Proxy paÅ”laik atbalsta tikai uz TCP balstÄ«tus klausÄ«tājus. Kad savienojums ir izveidots, tas tiek nodots apstrādei filtru kopai.
  • Filtri: Tie ir daļa no konveijera arhitektÅ«ras, kas var apstrādāt ienākoÅ”os un izejoÅ”os datus. Å Ä« funkcionalitāte ietver filtrus, piemēram, Gzip, kas saspiež datus pirms to nosÅ«tÄ«Å”anas klientam.
  • MarÅ”rutētāji: Tie pārsÅ«ta trafiku uz vajadzÄ«go galamērÄ·i, kas definēts kā klasteris.
  • Kopas: Tie nosaka trafika un konfigurācijas parametru beigu punktu.

Mēs izmantosim Å”os četrus komponentus, lai izveidotu sÅ«tņa starpniekservera konfigurāciju, kas atbilstu noteiktai NGINX konfigurācijai. SÅ«tņa mērÄ·is ir strādāt ar API un dinamisku konfigurāciju. Å ajā gadÄ«jumā bāzes konfigurācijā tiks izmantoti statiski, stingri kodēti NGINX iestatÄ«jumi.

2. darbÄ«ba ā€” NGINX konfigurācija

Pirmā daļa nginx.conf definē dažus NGINX iekŔējos elementus, kas jākonfigurē.

Darbinieku savienojumi

Tālāk sniegtā konfigurācija nosaka darbinieku procesu un savienojumu skaitu. Tas norāda, kā NGINX mērogos, lai apmierinātu pieprasījumu.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy pārvalda darbplūsmas un savienojumus dažādos veidos.

Envoy izveido darbinieka pavedienu katram sistēmas aparatÅ«ras pavedienam. Katrs darbinieka pavediens izpilda nebloķējoÅ”u notikumu cilpu, kas ir atbildÄ«ga par

  1. Uzklausot katru klausītāju
  2. Jaunu savienojumu pieņemÅ”ana
  3. Filtru komplekta izveide savienojumam
  4. Apstrādājiet visas I/O darbības savienojuma darbības laikā.

Visa turpmākā savienojuma apstrāde tiek pilnībā apstrādāta darbinieka pavedienā, tostarp jebkura pārsūtīŔanas darbība.

Katram darbinieka pavedienam programmā Envoy ir savienojumu pÅ«ls. Tātad HTTP/2 savienojumu pÅ«li vienlaikus izveido tikai vienu savienojumu katram ārējam resursdatoram, ja ir četri darbinieku pavedieni, stabilā stāvoklÄ« katram ārējam resursdatoram bÅ«s četri HTTP/2 savienojumi. Saglabājot visu vienā darbinieka pavedienā, gandrÄ«z visu kodu var ierakstÄ«t bez bloÄ·Ä“Å”anas, it kā tas bÅ«tu viens pavediens. Ja tiek pieŔķirts vairāk darbinieku pavedienu nekā nepiecieÅ”ams, tas var novest pie atmiņas izŔķērdÄ“Å”anas, radot lielu skaitu dÄ«kstāves savienojumu un samazinot to reižu skaitu, kad savienojumi tiek atgriezti atpakaļ pÅ«lā.

Lai iegūtu vairāk informācijas, apmeklējiet vietni Emuārs Envoy Proxy.

HTTP konfigurācija

Šis NGINX konfigurācijas bloks definē HTTP iestatījumus, piemēram:

  • Kādi mime veidi tiek atbalstÄ«ti
  • Noklusējuma noildzes
  • Gzip konfigurācija

Varat pielāgot Å”os aspektus, izmantojot filtrus programmā Envoy Proxy, par ko mēs runāsim vēlāk.

3. darbÄ«ba ā€” servera konfigurÄ“Å”ana

HTTP konfigurācijas blokā NGINX konfigurācija nosaka klausÄ«ties portā 8080 un atbildēt uz ienākoÅ”ajiem domēnu pieprasÄ«jumiem. one.example.com Šø www.one.example.com.

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

Inside Envoy to kontrolē Klausītāji.

Sūtni klausītājus

Vissvarīgākais aspekts, lai sāktu darbu ar Envoy Proxy, ir definēt klausītājus. Jums ir jāizveido konfigurācijas fails, kurā aprakstīts, kā vēlaties palaist Envoy gadījumu.

Tālāk sniegtais fragments izveidos jaunu uztvērēju un saistÄ«s to ar portu 8080. Konfigurācija norāda sÅ«tņa starpniekserveri, ar kuriem portiem tam ir jāsaista ienākoÅ”o pieprasÄ«jumu gadÄ«jumā.

Envoy Proxy konfigurācijai izmanto YAML apzÄ«mējumu. Ievadu par Å”o apzÄ«mējumu skatiet Å”eit saite.

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

Nav nepiecieÅ”ams definēt servera_vārds, jo ar to tiks galā sÅ«tņa starpniekservera filtri.

4. darbÄ«ba ā€“ atraÅ”anās vietas konfigurÄ“Å”ana

Kad NGINX tiek saņemts pieprasÄ«jums, atraÅ”anās vietas bloks nosaka, kā apstrādāt un kur marÅ”rutēt trafiku. Nākamajā fragmentā visa datplÅ«sma uz vietni tiek pārsÅ«tÄ«ta uz augÅ”up straumi (tulkotāja piezÄ«me: augÅ”pus parasti ir lietojumprogrammu serveris) klasteru ar nosaukumu mērÄ·aCluster. AugŔējā klasteris definē mezglus, kuriem jāapstrādā pieprasÄ«jums. Mēs to apspriedÄ«sim nākamajā darbÄ«bā.

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

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

Uzņēmumā Envoy Filtri to dara.

Sūtņu filtri

Statiskai konfigurācijai filtri nosaka, kā apstrādāt ienākoÅ”os pieprasÄ«jumus. Å ajā gadÄ«jumā mēs iestatām atbilstoÅ”os filtrus serveru_nosaukumi iepriekŔējā solÄ«. Kad tiek saņemti ienākoÅ”ie pieprasÄ«jumi, kas atbilst noteiktiem domēniem un marÅ”rutiem, trafiks tiek novirzÄ«ts uz kopu. Tas ir lÄ«dzvērtÄ«gs NGINX augÅ”upējai konfigurācijai.

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

Vārds sūtnis.http_connection_manager ir sūtņa starpniekserverī iebūvēts filtrs. Citi filtri ietver Redis, Mongo, TCP. Pilnu sarakstu varat atrast vietnē dokumentācija.

Lai iegÅ«tu papildinformāciju par citām slodzes lÄ«dzsvaroÅ”anas politikām, apmeklējiet vietni SÅ«tņa dokumentācija.

5. darbÄ«ba ā€” starpniekservera un augÅ”puses konfigurācija

NGINX augŔējā konfigurācija nosaka mērÄ·a serveru kopu, kas apstrādās trafiku. Å ajā gadÄ«jumā tika pieŔķirtas divas kopas.

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

Programmā Envoy to pārvalda kopas.

Sūtņu kopas

AugÅ”puses ekvivalents ir definēts kā kopas. Å ajā gadÄ«jumā ir identificēti saimnieki, kas apkalpos trafiku. Veids, kādā tiek piekļūts saimniekdatoriem, piemēram, noildze, ir definēts kā klastera konfigurācija. Tas ļauj precÄ«zāk kontrolēt tādus aspektus kā latentums un slodzes lÄ«dzsvaroÅ”ana.

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

Izmantojot pakalpojumu atklāŔanu STRICT_DNS SÅ«tnis nepārtraukti un asinhroni atrisinās norādÄ«tos DNS mērÄ·us. Katra atgrieztā IP adrese no DNS rezultāta tiks uzskatÄ«ta par nepārprotamu saimniekdatoru augÅ”upējā klasterÄ«. Tas nozÄ«mē, ka, ja pieprasÄ«jums atgriež divas IP adreses, Envoy pieņems, ka klasterÄ« ir divi resursdatori un abiem jābÅ«t lÄ«dzsvarotiem. Ja resursdators tiek noņemts no rezultāta, Envoy pieņems, ka tas vairs nepastāv, un piesaistÄ«s trafiku no visiem esoÅ”ajiem savienojumu pÅ«liem.

PlaŔāku informāciju skat SÅ«tņa pilnvaru dokumentācija.

6. darbÄ«ba. Piekļuve žurnālam un kļūdas

Pēdējā konfigurācija ir reÄ£istrācija. Tā vietā, lai kļūdu žurnālus ievietotu diskā, Envoy Proxy izmanto uz mākoņiem balstÄ«tu pieeju. Visi lietojumprogrammu žurnāli tiek izvadÄ«ti uz stdout Šø Stderr.

Kad lietotāji iesniedz pieprasÄ«jumu, piekļuves žurnāli nav obligāti un pēc noklusējuma ir atspējoti. Lai HTTP pieprasÄ«jumiem iespējotu piekļuves žurnālus, iespējojiet konfigurāciju piekļuves_žurnāls HTTP savienojuma pārvaldniekam. CeļŔ var bÅ«t vai nu ierÄ«ce, piemēram, stdout, vai failu diskā, atkarÄ«bā no jÅ«su prasÄ«bām.

Tālāk norādÄ«tajā konfigurācijā visi piekļuves žurnāli tiks novirzÄ«ti uz stdout (tulkotāja piezÄ«me - stdout ir nepiecieÅ”ams, lai izmantotu envoy inside docker. Ja to lieto bez dockera, aizstājiet /dev/stdout ar ceļu uz parastu žurnālfailu). Kopējiet fragmentu savienojuma pārvaldnieka konfigurācijas sadaļā:

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

Rezultātiem vajadzētu izskatÄ«ties Ŕādi:

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

Pēc noklusējuma Envoy ir formāta virkne, kas ietver HTTP pieprasījuma informāciju:

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

Šīs formāta virknes rezultāts ir:

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

Izvades saturu var pielāgot, iestatot formāta lauku. Piemēram:

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"

Žurnāla rindiņu var arī izvadīt JSON formātā, iestatot lauku json_format. Piemēram:

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

Lai iegūtu papildinformāciju par sūtņu reģistrācijas metodiku, apmeklējiet vietni

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

Mežizstrāde nav vienÄ«gais veids, kā gÅ«t ieskatu darbā ar Envoy Proxy. Tajā ir iebÅ«vētas uzlabotas izsekoÅ”anas un metrikas iespējas. JÅ«s varat uzzināt vairāk vietnē izsekoÅ”anas dokumentācija vai caur InteraktÄ«vs izsekoÅ”anas skripts.

7. darbÄ«ba ā€” palaiÅ”ana

Jūs tagad esat migrējis savu konfigurāciju no NGINX uz Envoy Proxy. Pēdējais solis ir palaist Envoy Proxy instanci, lai to pārbaudītu.

Palaist kā lietotājs

NGINX konfigurācijas rindas augÅ”pusē lietotājs www www; nosaka palaist NGINX kā zemu priviliģētu lietotāju, lai uzlabotu droŔību.

Envoy Proxy izmanto uz mākoņiem balstītu pieeju, lai pārvaldītu, kam process pieder. Kad mēs palaižam sūtņa starpniekserveri caur konteineru, mēs varam norādīt zemu priviliģētu lietotāju.

SÅ«tņa starpniekservera palaiÅ”ana

Tālāk norādÄ«tā komanda palaidÄ«s Envoy Proxy caur Docker konteineru resursdatorā. Å Ä« komanda sniedz Envoy iespēju noklausÄ«ties ienākoÅ”os pieprasÄ«jumus 80. portā. Tomēr, kā norādÄ«ts klausÄ«tāja konfigurācijā, sÅ«tņa starpniekserveris klausās ienākoÅ”o trafiku portā 8080. Tas ļauj procesam darboties kā lietotājam ar zemām priviliģētām tiesÄ«bām.

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

TestēŔana

Kad starpniekserveris darbojas, tagad var veikt un apstrādāt testus. Šī cURL komanda izdod pieprasījumu ar starpniekservera konfigurācijā definēto resursdatora galveni.

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

HTTP pieprasÄ«jums radÄ«s kļūdu 503. Tas ir tāpēc, ka augÅ”upējie savienojumi nedarbojas un nav pieejami. Tāpēc sÅ«tņa starpniekserveram nav pieejami pieprasÄ«juma galamērÄ·i. Å Ä« komanda sāks HTTP pakalpojumu sēriju, kas atbilst konfigurācijai, kas definēta Envoy.

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

Izmantojot pieejamos pakalpojumus, Envoy var veiksmīgi nosūtīt trafiku uz galamērķi.

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

Jums vajadzētu redzēt atbildi, kas norāda, kurÅ” Docker konteiners apstrādāja pieprasÄ«jumu. SÅ«tņa starpniekservera žurnālos jums vajadzētu redzēt arÄ« piekļuves virknes izvadi.

Papildu HTTP atbildes galvenes

JÅ«s redzēsiet papildu HTTP galvenes faktiskā pieprasÄ«juma atbildes galvenēs. Galvenē tiek parādÄ«ts laiks, ko augŔējais saimniekdators pavadÄ«ja, apstrādājot pieprasÄ«jumu. Izteikts milisekundēs. Tas ir noderÄ«gi, ja klients vēlas noteikt apkalpoÅ”anas laiku salÄ«dzinājumā ar tÄ«kla latentumu.

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

Galīgā konfigurācija

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 }

Papildu informācija no tulka

NorādÄ«jumus par Envoy Proxy instalÄ“Å”anu var atrast vietnē https://www.getenvoy.io/

Pēc noklusējuma rpm nav sistēmas pakalpojuma konfigurācijas.

Pievienojiet systemd pakalpojuma konfigurāciju /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

Jums ir jāizveido direktorija /etc/envoy/ un jāievieto tur config.yaml konfigurācija.

Ir telegrammas tērzÄ“Å”ana, izmantojot sÅ«tņa starpniekserveri: https://t.me/envoyproxy_ru

SÅ«tņa starpniekserveris neatbalsta statiska satura apkalpoÅ”anu. Tāpēc, kas var balsot par funkciju: https://github.com/envoyproxy/envoy/issues/378

Aptaujā var piedalīties tikai reģistrēti lietotāji. Ielogoties, lūdzu.

Vai Ŕī ziņa mudināja jÅ«s instalēt un pārbaudÄ«t sÅ«tņa starpniekserveri?

  • jā

  • nē

Nobalsoja 75 lietotāji. 18 lietotāji atturējās.

Avots: www.habr.com

Pievieno komentāru