Migrácia z Nginx na Envoy Proxy

Ahoj, Habr! Predkladajú vám preklad príspevku: Migrácia z Nginx na Envoy Proxy.

Envoy je vysokovýkonný distribuovaný proxy server (naprogramovaný v C++), určený pre jednotlivé služby a aplikácie; je to tiež komunikačná zbernica a „univerzálna dátová rovina“, vyvinutá pre veľké mikroslužobné architektúry „service mesh“. Pri jeho vývoji boli zohľadnené riešenia problémov, ktoré sa objavili pri vytváraní takých serverov, ako sú NGINX, HAProxy, hardvérové vyrovnávače záťaže a cloudové vyrovnávače záťaže. Envoy funguje v súčinnosti s každou aplikáciou a abstrahuje sieť, poskytujúc spoločné funkcie bez ohľadu na platformu. Keď celá prevádzka v infraštruktúre prechádza cez sieť Envoy, je ľahké vizualizovať problémové oblasti pomocou jednotného monitorovania, ladenia celkového výkonu a pridávania kľúčových funkcií na konkrétnych miestach.

Možnosti

  • Architektúra mimo procesu: envoy je autonómny, vysokovýkonný server s nízkou spotrebou pamäte. Pracuje spoločne s akýmkoľvek jazykom aplikácie alebo rámcom.
  • Podpora http/2 a grpc: envoy má prvotriednu podporu http/2 a grpc pre prichádzajúce a odchádzajúce pripojenia. Je to priehľadný proxy od http/1.1 po http/2.
  • Rozšírené vyrovnávanie záťaže: envoy podporuje rozšírené funkcie vyrovnávania záťaže, vrátane automatických pokusov, prerušenia reťazca, globálneho obmedzovania rýchlosti, zatienenia požiadaviek, lokálneho vyrovnávania záťaže v zóne a pod.
  • API pre správu konfigurácie: envoy poskytuje spoľahlivé API pre dynamickú správu svojej konfigurácie.
  • Monitorovanie: hĺbkové sledovanie L7 prevádzky, vstavaná podpora pre distribučné trasovanie a monitorovanie mongodb, dynamodb a mnohých ďalších aplikácií.

Krok 1 — Príklad konfigurácie NGINX

V tomto scenári sa používa špeciálne vytvorený súbor nginx.conf, založený na úplnom príklade z NGINX Wiki. Môžete si pozrieť konfiguráciu v editore tak, že ju otvoríte nginx.conf

Pôvodná konfigurácia nginx

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

Konfigurácie NGINX zvyčajne obsahujú tri kľúčové prvky:

  1. Nastavenia servera NGINX, štruktúry protokolov a funkčnosti Gzip. Tieto sa určujú globálne vo všetkých prípadoch.
  2. Nastavenie NGINX na prijímanie požiadaviek na hostiteľa one.example.com na porte 8080.
  3. Nastavenie cieľovej lokality, ako spracovávať prenos pre rôzne časti URL.

Nie všetky konfigurácie sa použijú na Envoy Proxy a niektoré parametre nie je potrebné nastavovať. Envoy Proxy má štyri kľúčové typy, ktoré podporujú základnú infraštruktúru poskytovanú NGINX. Jadro je:

  • Poslucháči: Určujú, ako Envoy Proxy prijíma prichádzajúce požiadavky. V súčasnosti Envoy Proxy podporuje iba poslucháčov na báze TCP. Akonáhle je spojenie nadviazané, je prenesené do súboru filtrov na spracovanie.
  • Filtre: Sú súčasťou architektúry potrubia, ktorá môže spracovávať prichádzajúce aj odchádzajúce dáta. Táto funkčnosť obsahuje filtre, ako Gzip, ktorý komprimuje dáta pred ich odoslaním klientovi.
  • Routery: Presmerovávajú prenos do požadovaného cieľa definovaného ako klaster.
  • Klastre: Definujú konečný bod pre prenos a parametre konfigurácie.

Týchto štyroch komponentov použijeme na vytvorenie konfigurácie Envoy Proxy, aby sme vyhoveli špecifikovanej konfigurácii NGINX. Cieľom Envoy je práca s API a dynamická konfigurácia. V tomto prípade základná konfigurácia bude používať statické, pevne stanovené parametre z NGINX.

Krok 2 — Nastavenie NGINX

Prvá časť nginx.conf definuje niektoré interné komponenty NGINX, ktoré musia byť nastavené.

Pracovné pripojenia (Worker Connections)

Nižšie uvedená konfigurácia určuje počet pracovných procesov a pripojení. To ukazuje, ako sa NGINX bude škálovať na uspokojenie dopytu.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy rôzne spravuje pracovné procesy a pripojenia.

Envoy vytvára pracovný prúd pre každý hardvérový prúd v systéme. Každý pracovný prúd vykonáva neblokujúci cyklus udalostí, ktorý zodpovedá za

  1. Počúvanie každého poslucháča (listener)
  2. Prijímanie nových pripojení
  3. Vytváranie súboru filtrov pre pripojenie
  4. Spracovanie všetkých vstupno-výstupných operácií počas existencie pripojenia.

Celé ďalšie spracovanie pripojenia je úplne spracované v pracovnom prúde, vrátane akéhokoľvek správania presmerovania.

Pre každý pracovný prúd v Envoy existuje pripojenie v poole. Takže, poole pripojení HTTP/2 nastavujú iba jedno pripojenie pre každého vonkajšieho hostiteľa naraz, ak je k dispozícii štyri pracovné prúdy, bude štyri pripojenia HTTP/2 pre každého vonkajšieho hostiteľa v stabilnom stave. Udržiavanie všetkého v jednom pracovnom prúde umožňuje takmer celý kód napísať bez blokovania, akoby bol jednorozmerným. Ak je pridelene viac pracovných prúdov ako je potrebné, môže to viesť k neefektívnemu využívaniu pamäte, vytváraniu veľkého množstva nečinných pripojení a zníženiu počtu návratov pripojenia späť do poolu.

Pre viac informácií navštívte Envoy Proxy blog.

Konfigurácia HTTP

Nasledujúci blok konfigurácie NGINX určuje nastavenia HTTP, ako sú:

  • Aké mime typy sú podporované
  • Predvolené timeouty
  • Konfigurácia Gzip

Tieto aspekty môžete nastaviť pomocou filtrov v Envoy Proxy, čo sa neskôr prediskutuje.

Krok 3 — Konfigurácia Server

V bloku konfigurácie HTTP, konfigurácia NGINX určuje, aby počúval port 8080 a odpovedal na prichádzajúce požiadavky pre domény one.example.com a www.one.example.com.

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

Vnútri Envoy to spravujú poslucháči.

Poslucháči Envoy

Najdôležitejší aspekt začatia práce s Envoy Proxy je určiť poslucháčov. Musíte vytvoriť súbor konfigurácie, ktorý popisuje, ako chcete spustiť inštanciu Envoy.

Nasledujúca časť vytvorí nového poslucháča a spojí ho s portom 8080. Konfigurácia určuje, na ktoré porty by sa mal Envoy Proxy viazať pre prichádzajúce požiadavky.

Envoy Proxy používa notáciu YAML pre svoju konfiguráciu. Pre oboznámenie s touto notáciou pozrite sem odkaz.

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

Nie je potrebné definovať server_name, pretože filtre Envoy Proxy si s tým poradia.

Krok 4 — Konfigurácia umiestnenia

Keď požiadavka príde do NGINX, blok umiestnenia určuje, ako spracovať a kam smerovať prevádzku. V nasledujúcej časti sa celá prevádzka na stránku odovzdáva do upstream (poznámka prekladateľa: upstream — zvyčajne sérvery aplikácií) klasteru s názvom targetCluster. Upstream klaster určuje uzly, ktoré by mali spracovať požiadavku. O tom budeme diskutovať v ďalšom kroku.

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

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

V Envoy to zabezpečujú filtre.

Envoy Filters

Pre statickú konfiguráciu filtre určujú, ako spracovávať prichádzajúce požiadavky. V tomto prípade nastavujeme filtre, ktoré zodpovedajú server_names z predchádzajúceho kroku. Keď prichádzajú požiadavky, ktoré zodpovedajú určitým doménam a trasám, traffic je smerovaný do klasteru. To je ekvivalent vzostupnej konfigurácie NGINX.

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

Názov envoy.http_connection_manager je zabudovaný filter v Envoy Proxy. Ďalšie filtre zahŕňajú Kľuč-hodnota, Mongo, TCP. Môžete nájsť úplný zoznam v dokumenácie.

Pre viac informácií o iných politikách vyváženia zaťaženia navštívte Dokumentáciu Envoy.

Krok 5 — Konfigurácia proxy a upstream

V NGINX konfigurácia upstream určuje súbor cieľových serverov, ktoré budú spracovávať prevádzku. V tomto prípade boli priradené dva klastre.

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

V Envoy to riadia klastre.

Envoy Clusters

Ekvivalent upstream sa definuje ako clustre. V tomto prípade boli určené hostiteľské servery, ktoré budú odbavovať prevádzku. Spôsob prístupu k hostiteľom, napríklad časový limit, sa určuje ako konfigurácia clustra. To umožňuje presnejšie kontrolovať jemnosť takých aspektov, ako sú časový limit a zaťaženie.

Kopírovať do editora  clustre:
  - názov: cieľovýCluster
    connect_timeout: 0.25s
    typ: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hostitelia: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

Pri používaní objavovania služby STRICT_DNS Envoy bude neustále a asynchrónne rozpoznať určené cieľové DNS. Každá vrátená IP adresa v dôsledku DNS bude považovaná za explicitného hostiteľa vo vzostupnom clustri. To znamená, že ak dotaz vráti dve IP adresy, Envoy predpokladá, že v clustre sú dve hostiteľské servery, a oba by mali byť rozložené zaťaženie. Ak je hostiteľ odstránený z výsledku, Envoy predpokladá, že už neexistuje, a bude presmerovávať prevádzku z akýchkoľvek existujúcich spojovacích skupín.

Pre ďalšie informácie pozri. Dokumentácia proxy servera Envoy.

Krok 6 - Prístup k logu a chybám

Konečná konfigurácia - registrácia. Namiesto toho, aby sa protokoly chýb odosielali na disk, Envoy Proxy používa cloudový prístup. Všetky protokoly aplikácií sú odosielané do stdout a stderr.

Keď používatelia podajú požiadavku, protokoly prístupu sú voliteľné a predvolene sú vypnuté. Ak chcete aktivovať protokoly prístupu pre HTTP požiadavky, aktivujte konfiguráciu access_log pre správcu pripojení HTTP. Cesta môže byť buď zariadením, ako je stdout, alebo súborom na disku, v závislosti od vašich požiadaviek.

Nasledujúca konfigurácia presmeruje všetky protokoly prístupu do stdout (poznámka prekladateľa - stdout je potrebné na použitie envoy vo vnútri dockeru. Ak sa používa bez dockera, nahraďte /dev/stdout cestou k bežnému logu). Skopírujte úryvok do sekcie konfigurácie pre správcu pripojení:

Kopírovať do schránkyaccess_log:
- názov: envoy.file_access_log
  config:
    path: "\/dev\/stdout"

Výsledky by mali vyzerať takto:

      - názov: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - názov: envoy.file_access_log
            config:
              path: "\/dev\/stdout"
          route_config:

Predvolene má Envoy formátovací reťazec, ktorý obsahuje podrobnosti o HTTP požiadavke:

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

Výsledok tohto formátového riadku:

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

Obsah výstupu môžeme nastaviť pomocou poľa formátu. Napríklad:

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"

Riadok denníka môže byť tiež vyvedený vo formáte JSON nastavením poľa json_format. Napríklad:

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

Pre ďalšie informácie o metódach zaznamenávania Envoy navštívte

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

Zaznamenávanie nie je jediný spôsob, ako získať prehľad o fungovaní Envoy Proxy. Obsahuje pokročilé možnosti trasovania a metriky. Môžete sa dozvedieť viac v dokumentácii k trasovaniu alebo prostredníctvom Scenár interaktívneho trasovania.

Krok 7 — Spustenie

Teraz ste preložili konfiguráciu z NGINX na Envoy Proxy. Posledný krok — spustiť inštanciu Envoy Proxy na testovanie.

Spustenie ako používateľ

Na vrchole konfigurácie NGINX sa nachádza riadok user www www; ukazuje, že NGINX beží ako používateľ s nízkou úrovňou práv na zvýšenie bezpečnosti.

Envoy Proxy používa cloudový prístup na riadenie vlastníka procesu. Keď spúšťame Envoy Proxy cez kontajner, môžeme určiť používateľa s nízkou úrovňou práv.

Spustenie Envoy Proxy

Nasledujúci príkaz spustí Envoy Proxy cez Docker kontajner na hostiteľovi. Tento príkaz umožňuje Envoy počúvať prichádzajúce požiadavky cez port 80. Avšak, ako je uvedené v konfigurácii poslucháča, Envoy Proxy počúva prichádzajúcu prevádzku cez port 8080. To umožňuje procesu bežať ako používateľ s nízkymi právami.

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

Testovanie

So spusteným proxy môžu byť teraz vykonané a spracované testy. Nasledujúci príkaz cURL vydáva požiadavku s hlavičkou hostiteľa definovanou v konfigurácii proxy.

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

HTTP požiadavka privedie k chybe 503To je spôsobené tým, že prichádzajúce spojenia nefungujú a nie sú dostupné. Takže Envoy Proxy nemá dostupné cieľové adresy pre požiadavku. Následujúci príkaz spustí sériu HTTP služieb, ktoré zodpovedajú konfigurácii definovanej pre Envoy.

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

S dostupnými službami môže Envoy úspešne proxyovať prevádzku na cieľ.

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

Mali by ste vidieť odpoveď, ktorá ukazuje, ktorý kontajner Docker spracoval požiadavku. V logoch Envoy Proxy by ste mali tiež vidieť vyvedený prístupový riadok.

Ďalšie hlavičky odpovede HTTP (HTTP Response)

V hlavičkách odpovede platného požiadavku uvidíte ďalšie hlavičky HTTP. V hlavičke je zobrazený čas, ktorý vyšší hosť strávil spracovaním požiadavky. Je vyjadrený v milisekundách. To je užitočné, ak sa klient chce určiť čas obsluhy v porovnaní s oneskorením v sieti.

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

Záverečná konfigurácia

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 }

Ďalšie informácie od prekladateľa

Inštrukcie na inštaláciu Envoy Proxy nájdete na stránkach https://www.getenvoy.io/

Predvolene v rpm chýba konfigurácia systemd služby.

Pridajte konfiguráciu systemd služby \/etc\/systemd\/system\/envoy.service:

[Unit]
Description=Envoy Proxy
Documentation=https:\/\/www.envoyproxy.io\/\nAfter=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

Musíte vytvoriť adresár \/etc\/envoy\/ a umiestniť tam konfiguráciu config.yaml.

Pre envoy proxy je telegram chat: https://t.me/envoyproxy_ru

Envoy Proxy nemá podporu pre doručovanie statického obsahu. Preto, kto môže, hlasujte za funkciu: https://github.com/envoyproxy/envoy/issues/378

Len registrovaní používatelia sa môžu zúčastniť prieskumu. Prihláste sa, prosím.

Podnietil tento príspevok k inštalácii a testovaniu envoy proxy?

  • áno

  • nie

Hlasovalo 75 používateľov. Zdržalo sa 18 používateľov.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster