Migratioun vun Nginx op Envoy Proxy

Moien, Habr! Ech bréngen Är Opmierksamkeet eng Iwwersetzung vum Post: Migratioun vun Nginx op Envoy Proxy.

Envoy ass en High-Performance verdeelt Proxy Server (geschriwwe an C ++) entworf fir eenzel Servicer an Uwendungen, et ass och eng Kommunikatioun Bus an "Universal Daten Fliger" fir grouss microservice "Service Mesh" Architekturen entworf. Wann Dir et erstellt, goufen Léisunge fir Probleemer berécksiichtegt, déi während der Entwécklung vu Serveren wéi NGINX, HAProxy, Hardware Load Balancers a Cloud Load Balancer entstane sinn. Envoy schafft niewent all Applikatioun an abstrakt d'Netzwierk fir gemeinsam Funktionalitéit ze bidden onofhängeg vun der Plattform. Wann all Serviceverkéier an enger Infrastruktur duerch den Envoy Mesh fléisst, gëtt et einfach Problemberäicher mat konsequent Beobachtbarkeet ze visualiséieren, d'Gesamtleistung ofzestëmmen an d'Kärfunktionalitéit op enger spezifescher Plaz ze addéieren.

Features

  • Out-of-Prozess Architektur: Envoy ass e selbststännegen, High-Performance Server deen eng kleng Quantitéit u RAM ophëlt. Et funktionnéiert a Verbindung mat all Applikatiounssprooch oder Kader.
  • http/2 an grpc Ënnerstëtzung: Envoy huet éischtklasseg http/2 an grpc Ënnerstëtzung fir Entréeën an erausginn Verbindungen. Dëst ass en transparenten Proxy vun http/1.1 op http/2.
  • Fortgeschratt Load Balancing: Envoy ënnerstëtzt fortgeschratt Laaschtbalancéierungsfunktiounen inklusiv automatesch Widderhuelungen, Kettenbriechung, global Tariflimitéierung, Ufro Shadowing, Lokal Zone Load Balancing, etc.
  • Configuration Management API: Envoy bitt eng robust API fir dynamesch Är Konfiguratioun ze managen.
  • Observabilitéit: Déif Observabilitéit vum L7 Traffic, gebierteg Ënnerstëtzung fir verdeelt Tracing an Observabilitéit vu Mongodb, Dynamodb a vill aner Uwendungen.

Schrëtt 1 - Beispill NGINX Config

Dëse Skript benotzt eng speziell erstallt Datei nginx.conf, baséiert op der voller Beispill aus NGINX Wiki. Dir kënnt d'Konfiguratioun am Editor kucken andeems Dir opmaacht nginx.conf

nginx Quell config

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 Konfiguratiounen hunn typesch dräi Schlësselelementer:

  1. NGINX Server konfiguréieren, Log Struktur a Gzip Funktionalitéit. Dëst ass an alle Fäll global definéiert.
  2. NGINX konfiguréieren fir Ufroen un den Host ze akzeptéieren one.example.com op Hafen 8080.
  3. D'Zilplaz opzestellen, wéi Dir Traffic fir verschidden Deeler vun der URL behandelt.

Net all Konfiguratioun gëlle fir Envoy Proxy, an Dir musst net e puer Astellunge konfiguréieren. Envoy Proxy huet véier Schlëssel Zorte, déi d'Kärinfrastruktur ënnerstëtzen, déi vun NGINX ugebuede gëtt. De Kär ass:

  • Nolauschterer: Si bestëmmen wéi Envoy Proxy erakommen Ufroe akzeptéiert. Envoy Proxy ënnerstëtzt de Moment nëmmen TCP-baséiert Nolauschterer. Wann eng Verbindung etabléiert ass, gëtt se an eng Rei vu Filtere fir d'Veraarbechtung weiderginn.
  • Filteren: Si sinn Deel vun enger Pipelinearchitektur déi erakommen an erausgoend Daten veraarbecht kann. Dës Funktionalitéit enthält Filtere wéi Gzip, déi d'Donnéeën kompriméiert ier se un de Client geschéckt ginn.
  • Router: Si schécken de Verkéier op déi erfuerderlech Destinatioun, definéiert als Cluster.
  • Cluster: Si definéieren den Endpunkt fir Traffic a Konfiguratiounsparameter.

Mir benotzen dës véier Komponente fir eng Envoy Proxy Konfiguratioun ze kreéieren fir eng spezifesch NGINX Konfiguratioun ze passen. Dem Envoy säin Zil ass et mat APIen an dynamescher Konfiguratioun ze schaffen. An dësem Fall wäert d'Basiskonfiguratioun statesch, schwéier kodéiert Astellunge vun NGINX benotzen.

Schrëtt 2 - NGINX Configuratioun

Éischten Deel nginx.conf definéiert e puer NGINX Interner déi musse konfiguréiert ginn.

Aarbechter Verbindungen

D'Konfiguratioun hei drënner bestëmmt d'Zuel vun den Aarbechterprozesser a Verbindungen. Dëst weist wéi NGINX wäert skala fir d'Nofro ze treffen.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy geréiert Workflows a Verbindungen op verschidde Manéieren.

Envoy erstellt en Aarbechter thread fir all Hardware thread am System. All Aarbechter thread féiert eng net blockéierend Event Loop aus, déi verantwortlech ass fir

  1. Nolauschteren all Nolauschterer
  2. Akzeptéieren nei Verbindungen
  3. Schafen eng Rei vu Filtere fir eng Verbindung
  4. Veraarbecht all I / O Operatiounen während der Liewensdauer vun der Verbindung.

All weider Verbindungsveraarbechtung gëtt ganz am Aarbechter thread gehandhabt, inklusiv all Forwardverhalen.

Fir all Aarbechter thread am Envoy gëtt et e Verbindungspool. Also HTTP/2 Verbindungspools etabléieren nëmmen eng Verbindung pro externen Host gläichzäiteg, wann et véier Aarbechter thread sinn, da ginn et véier HTTP/2 Verbindungen pro externen Host an engem stabilen Zoustand. Andeems Dir alles an engem Workerthread hält, ka bal all Code geschriwwe ginn ouni ze blockéieren, wéi wann et eenzel thread wier. Wann méi Aarbechter thread wéi néideg zougewisen ginn, kann dëst zu verschwenden Erënnerung Féierung, eng grouss Zuel vun Idle Verbindungen schafen, an d'Zuel vun Mol reduzéieren Verbindungen zréck an de Pool zréck.

Fir méi Informatiounen besicht Envoy Proxy Blog.

HTTP Konfiguratioun

Déi folgend NGINX Konfiguratiounsblock definéiert HTTP Astellunge wéi:

  • Wéi eng Mime-Typen ginn ënnerstëtzt
  • Standard Timeouts
  • Gzip Configuratioun

Dir kënnt dës Aspekter personaliséieren andeems Dir Filteren am Envoy Proxy benotzt, wat mir spéider diskutéieren.

Schrëtt 3 - Server Configuratioun

Am HTTP Konfiguratiounsblock spezifizéiert d'NGINX Konfiguratioun fir um Port 8080 ze lauschteren an op erakommen Ufroe fir Domainen z'äntwerten one.example.com и www.one.example.com.

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

Bannen Envoy gëtt et vun Nolauschterer kontrolléiert.

Envoy Nolauschterer

De wichtegsten Aspekt fir mam Envoy Proxy unzefänken ass Är Nolauschterer ze definéieren. Dir musst eng Konfiguratiounsdatei erstellen déi beschreift wéi Dir d'Envoy-Instanz lafe wëllt.

D'Snippet hei ënnen erstellt en neie Lauschterer a bindt et un den Hafen 8080. D'Konfiguratioun erzielt den Envoy Proxy op wéi eng Ports et soll binde fir opkommend Ufroen.

Envoy Proxy benotzt YAML Notatioun fir seng Konfiguratioun. Fir eng Aféierung zu dëser Notatioun, kuckt hei Link.

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

Net néideg ze definéieren Servernumm, zënter Envoy Proxy Filtere wäerten dëst handhaben.

Schrëtt 4 - Location Configuratioun

Wann eng Ufro an NGINX kënnt, bestëmmt de Standortblock wéi et veraarbecht gëtt a wou de Traffic route gëtt. Am folgende Fragment gëtt all Traffic op de Site op en Upstream (Notiz vum Iwwersetzer: Upstream ass normalerweis en Applikatiounsserver) Cluster mam Numm transferéiert targetCluster. De Upstream-Cluster definéiert d'Noden déi d'Ufro solle veraarbechten. Mir wäerten dëst am nächste Schrëtt diskutéieren.

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

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

Bei Envoy mécht Filters dat.

Envoy Filtere

Fir eng statesch Konfiguratioun bestëmmen d'Filtere wéi d'Entrée Ufroe veraarbecht ginn. An dësem Fall setzen mir Filteren déi passen server_names am virege Schrëtt. Wann erakommen Ufroe kommen, déi mat bestëmmte Domainen a Strecken passen, gëtt de Traffic an de Cluster geréckelt. Dëst ass den Äquivalent vun enger NGINX Bottom-up Konfiguratioun.

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

Numm envoy.http_connection_manager ass en agebaute Filter am Envoy Proxy. Aner Filtere enthalen Redis, Mongo, TCP. Dir fannt déi komplett Lëscht op Dokumentatioun.

Fir méi Informatiounen iwwer aner Belaaschtungspolitik, besicht Envoy Dokumentatioun.

Schrëtt 5 - Proxy an Upstream Konfiguratioun

Am NGINX definéiert d'Upstream Konfiguratioun eng Rei vun Zilserveren déi de Traffic veraarbechten. An dësem Fall goufen zwee Cluster zougewisen.

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

Am Envoy gëtt dëst vu Cluster geréiert.

Envoy Cluster

Den Upstream Equivalent gëtt als Cluster definéiert. An dësem Fall sinn d'Hosten, déi de Traffic déngen, identifizéiert ginn. De Wee wéi d'Host zougänglech sinn, sou wéi Timeouts, gëtt als Clusterkonfiguratioun definéiert. Dëst erlaabt méi granulär Kontroll iwwer Aspekter wéi Latenz a Laaschtbalancéierung.

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

Wann Dir Service Entdeckung benotzt STRICT_DNS Envoy wäert kontinuéierlech an asynchron de spezifizéierte DNS Ziler léisen. All zréckginn IP Adress vum DNS Resultat gëtt als explizit Host am Upstream Cluster ugesinn. Dëst bedeit datt wann eng Ufro zwou IP Adressen zréckkënnt, Envoy ugeholl datt et zwee Hosten am Stärekoup sinn, a béid musse equilibréiert sinn. Wann e Host aus dem Resultat geläscht gëtt, wäert den Envoy unhuelen datt et net méi existéiert an de Traffic aus all existente Verbindungspools zitt.

Fir méi Informatioun kuckt Envoy Proxy Dokumentatioun.

Schrëtt 6 - Log Zougang a Feeler

Déi lescht Konfiguratioun ass Aschreiwung. Amplaz vu Feeler Logbicher op Disk ze drécken, hëlt Envoy Proxy eng Cloud-baséiert Approche. All Applikatioun Logbicher ginn erausginn stdout и stderr.

Wann d'Benotzer eng Ufro maachen, sinn Zougangsprotokoller fakultativ an als Standard behënnert. Fir Zougangsprotokoller fir HTTP-Ufroen z'aktivéieren, aktivéiert d'Konfiguratioun access_log fir den HTTP-Verbindungsmanager. De Wee kann entweder en Apparat wéi z stdout, oder e Fichier op Disk, jee no Ärem Ufuerderunge.

Déi folgend Konfiguratioun wäert all Zougangsprotokoller op stdout (Notiz vum Iwwersetzer - stdout ass erfuerderlech fir den Envoy am Docker ze benotzen. Wann Dir ouni Docker benotzt, da ersetzt /dev/stdout mam Wee op eng regulär Logdatei). Kopéiert den Snippet an d'Konfiguratiounssektioun fir de Verbindungsmanager:

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

D'Resultater sollen esou ausgesinn:

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

Par défaut huet Envoy e Formatstring deen d'Detailer vun der HTTP-Ufro enthält:

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

D'Resultat vun dësem Format String ass:

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

Den Outputinhalt kann personaliséiert ginn andeems Dir de Formatfeld setzt. Zum Beispill:

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"

D'Logbuchlinn kann och am JSON-Format ausginn andeems Dir d'Feld setzt json_format. Zum Beispill:

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

Fir méi Informatiounen iwwer d'Envoy Registration Methodology, besicht

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

Loggen ass net deen eenzege Wee fir Abléck ze kréien an d'Aarbecht mat Envoy Proxy ze kréien. Et huet fortgeschratt Tracing- a Metrikfäegkeeten dra gebaut. Dir kënnt méi gewuer ginn op Tracing Dokumentatioun oder duerch Interaktiven Tracing Skript.

Schrëtt 7 - Start

Dir hutt elo Är Konfiguratioun vun NGINX op Envoy Proxy migréiert. De leschte Schrëtt ass eng Envoy Proxy Instanz ze starten fir se ze testen.

Run als Benotzer

Am Top vun der NGINX Konfiguratiounslinn Benotzer www www; spezifizéiert fir NGINX als niddereg-privilegiéierten Benotzer ze lafen fir d'Sécherheet ze verbesseren.

Envoy Proxy hëlt eng Cloud-baséiert Approche fir ze managen wien e Prozess besëtzt. Wa mir Envoy Proxy duerch e Container lafen, kënne mir e niddereg privilegiéierte Benotzer uginn.

Envoy Proxy starten

De Kommando hei drënner féiert Envoy Proxy duerch en Docker Container um Host. Dëse Kommando gëtt Envoy d'Fähegkeet fir Entréeën Ufroen op port ze lauschteren 80. Wéi och ëmmer, wéi an der Nolauschterer Configuratioun uginn, Envoy Proxy lauschtert fir Entréeën Verkéier op port 8080. Dëst erlaabt de Prozess als niddereg-privilegiéierten Benotzer lafen.

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

Testen

Wann de Proxy leeft, kënnen Tester elo gemaach a veraarbecht ginn. De folgende cURL Kommando gëtt eng Ufro mat dem Hostheader deen an der Proxy Konfiguratioun definéiert.

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

D'HTTP-Ufro féiert zu engem Feeler 503. Dëst ass well Upstream Verbindungen net funktionnéieren an net verfügbar sinn. Dofir huet den Envoy Proxy keng verfügbar Destinatioune fir d'Ufro. De folgende Kommando fänkt eng Serie vun HTTP-Servicer un, déi mat der Konfiguratioun passen, déi fir Envoy definéiert ass.

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

Mat de verfügbare Servicer, Envoy kann erfollegräich Proxy Traffic op seng Destinatioun.

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

Dir sollt eng Äntwert gesinn, déi weist wéi en Docker Container d'Ufro veraarbecht huet. An den Envoy Proxy Logbicher sollt Dir och en Zougang String Output gesinn.

Zousätzlech HTTP Äntwert Header

Dir gesitt zousätzlech HTTP Header an den Äntwert Header vun der aktueller Ufro. Den Header weist d'Zäit déi den Upstream-Host mat der Ufro veraarbecht huet. Ausgedréckt a Millisekonnen. Dëst ass nëtzlech wann de Client Servicezäit am Verglach mat Netzwierklatenz bestëmmen wëllt.

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

Finale Configuratioun

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 }

Zousätzlech Informatioun vum Iwwersetzer

Instruktioune fir den Envoy Proxy z'installéieren kënnen op der Websäit fonnt ginn https://www.getenvoy.io/

Par défaut huet rpm keng Systemd Service Configuratioun.

Füügt systemd Service config /etc/systemd/system/envoy.service derbäi:

[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

Dir musst e Verzeechnes /etc/envoy/ erstellen an d'config.yaml config do setzen.

Et gëtt en Telegramm Chat mam Envoy Proxy: https://t.me/envoyproxy_ru

Envoy Proxy ënnerstëtzt net statesche Inhalt ze servéieren. Dofir, wien kann fir d'Feature ofstëmmen: https://github.com/envoyproxy/envoy/issues/378

Nëmme registréiert Benotzer kënnen un der Ëmfro deelhuelen. Umellen, wann ech glift.

Huet dëse Post Iech encouragéiert den Envoy Proxy z'installéieren an ze testen?

  • jo

  • kee

75 Benotzer hunn gestëmmt. 18 Benotzer hu sech enthalen.

Source: will.com

Setzt e Commentaire