Migrazione da Nginx à Envoy Proxy

Ciao, Habr! Aghju purtatu à a vostra attenzione una traduzzione di u post: Migrazione da Nginx à Envoy Proxy.

Envoy hè un servitore proxy distribuitu d'altu rendiment (scrittu in C++) cuncepitu per i servizii è l'applicazioni individuali, hè ancu un bus di cumunicazione è un "pianu di dati universale" cuncepitu per grandi architetture di "serviziu mesh" di microserviziu. Quandu si creanu, i suluzioni à i prublemi chì si sò sviluppati durante u sviluppu di servitori cum'è NGINX, HAProxy, equilibratori di carica di hardware è equilibratori di carica di nuvola sò stati cunsiderati. Envoy travaglia à fiancu à ogni applicazione è astrae a rete per furnisce una funziunalità cumuni indipendendu da a piattaforma. Quandu tuttu u trafficu di serviziu in una infrastruttura scorri attraversu a mesh Envoy, diventa faciule visualizà e zone problematiche cun osservabilità coherente, sintonizza u rendiment generale è aghjunghje funziunalità core in un locu specificu.

Caratteristiche

  • Architettura fora di prucessu: l'envoy hè un servitore autonomu, d'altu rendiment chì occupa una piccula quantità di RAM. Funziona in cunjunzione cù qualsiasi lingua o framework di l'applicazione.
  • Supportu http/2 è grpc: l'envoy hà supportu http/2 è grpc di prima classe per e cunnessione in entrata è in uscita. Questu hè un proxy trasparente da http/1.1 à http/2.
  • Equilibramentu Avanzatu di Carichi: Envoy supporta funzioni avanzate di bilanciamentu di carica cumpresi riprovazioni automatiche, rottura di a catena, limitazione di a tarifa globale, ombra di richieste, bilanciamentu di carica di zona lucale, etc.
  • API di Gestione di Configurazione: Envoy furnisce una API robusta per a gestione dinamica di a vostra cunfigurazione.
  • Osservabilità: Osservabilità profonda di u trafficu L7, supportu nativu per a traccia distribuita è osservabilità di mongodb, dynamodb è parechje altre applicazioni.

Passu 1 - Esempiu NGINX Config

Stu script usa un schedariu apposta nginx.conf, basatu annantu à l'esempiu cumpletu da NGINX Wiki. Pudete vede a cunfigurazione in l'editore aprendu nginx.conf

nginx source cunfig

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

E cunfigurazioni NGINX sò tipicamente trè elementi chjave:

  1. Configurazione di u servitore NGINX, struttura di log è funziunalità Gzip. Questu hè definitu globalmente in tutti i casi.
  2. Configurazione di NGINX per accettà e dumande à l'ospite unu.esempiu.com nant'à u portu 8080.
  3. Configurazione di u locu di destinazione, cumu gestisce u trafficu per e diverse parti di l'URL.

Micca tutta a cunfigurazione s'applicà à Envoy Proxy, è ùn avete micca bisognu di cunfigurà certi paràmetri. Envoy Proxy hà quattru tippi chjave, chì sustene l'infrastruttura core offerta da NGINX. U core hè:

  • Ascoltatori: Determinanu cumu Envoy Proxy accetta e richieste entrate. Envoy Proxy attualmente supporta solu ascoltatori basati in TCP. Quandu una cunnessione hè stabilita, hè passata à un settore di filtri per u processu.
  • Filtri: Sò parti di una architettura di pipeline chì ponu processà e dati in entrata è in uscita. Questa funziunalità include filtri cum'è Gzip, chì compresses i dati prima di mandà à u cliente.
  • Routers: Trasmettenu u trafficu à a destinazione necessaria, definita cum'è un cluster.
  • Clusters: Defininu l'endpoint per u trafficu è i paràmetri di cunfigurazione.

Adupremu questi quattru cumpunenti per creà una cunfigurazione Envoy Proxy per currisponde à una cunfigurazione NGINX specifica. L'obiettivu di Envoy hè di travaglià cù API è cunfigurazione dinamica. In questu casu, a cunfigurazione di basa utilizerà paràmetri statici, codificati da NGINX.

Passu 2 - Configurazione NGINX

Prima parte nginx.conf definisce qualchi internu NGINX chì deve esse cunfigurati.

Cunnessioni di u travagliu

A cunfigurazione sottu determina u numeru di prucessi di travagliu è cunnessione. Questu indica cumu NGINX scala per risponde à a dumanda.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy gestisce i flussi di travagliu è e cunnessione in modi diffirenti.

Envoy crea un filu di travagliu per ogni filu di hardware in u sistema. Ogni filu di u travagliu eseguisce un ciclu di l'avvenimentu senza bloccu chì hè rispunsevule

  1. Ascoltà ogni ascoltatore
  2. Accetta novi cunnessione
  3. Crià un settore di filtri per una cunnessione
  4. Prucessa tutte e operazioni I/O durante a vita di a cunnessione.

Tuttu u prucessu di cunnessione ulteriore hè trattatu interamente in u filu di u travagliu, cumpresu qualsiasi cumpurtamentu di spedizione.

Per ogni filu di travagliu in Envoy, ci hè un pool di cunnessione. Allora i pools di cunnessione HTTP / 2 stabiliscenu solu una cunnessione per host esternu à tempu, se ci sò quattru fili di u travagliu, ci saranu quattru cunnessione HTTP / 2 per host esternu in un statu stabile. Mantenendu tuttu in un filu di travagliu, quasi tuttu u codice pò esse scrittu senza bluccà, cum'è s'ellu era un filu unicu. Se più fili di travagliadori sò attribuiti di ciò chì hè necessariu, questu pò purtà à a memoria persa, creendu un gran numaru di cunnessione inattivu, è riducendu u numeru di volte chì e cunnessione sò tornate à a piscina.

Per più infurmazione visitate Blog di Envoy Proxy.

Configurazione HTTP

U seguente bloccu di cunfigurazione NGINX definisce paràmetri HTTP cum'è:

  • Chì tipi di mime sò supportati
  • Timeouts predeterminati
  • Configurazione Gzip

Pudete persunalizà questi aspetti utilizendu filtri in Envoy Proxy, chì discuteremu più tardi.

Passu 3 - Configurazione di u Server

In u bloccu di cunfigurazione HTTP, a cunfigurazione NGINX specifica à sente à u portu 8080 è risponde à e dumande entrate per i domini. unu.esempiu.com и www.one.example.com.

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

Dentru Envoy, hè cuntrullatu da Listeners.

Ascoltatori mandatari

L'aspettu più impurtante di cumincià cù Envoy Proxy hè di definisce i vostri ascoltatori. Avete bisognu di creà un schedariu di cunfigurazione chì descrive cumu vulete eseguisce l'istanza Envoy.

U snippet sottu hà da creà un novu listener è ligà à u portu 8080. A cunfigurazione dice à Envoy Proxy à quali porti deve ligà per e dumande entrate.

Envoy Proxy usa a notazione YAML per a so cunfigurazione. Per una introduzione à sta notazione, fighjate quì una lea.

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

Ùn ci hè bisognu di definisce server_name, postu chì i filtri Envoy Proxy anu da trattà questu.

Passu 4 - Configurazione Location

Quandu una dumanda vene in NGINX, u bloccu di locu determina cumu processà è induve indirizzà u trafficu. In u frammentu seguente, tuttu u trafficu à u situ hè trasferitu à un cluster upstream (nota di u traduttore: upstream hè di solitu un servitore di applicazioni) chjamatu. targetCluster. U cluster upstream definisce i nodi chì devenu processà a dumanda. Discuteremu questu in u prossimu passu.

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

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

À Envoy, Filtri faci questu.

Filtri Envoy

Per una cunfigurazione statica, i filtri determinanu cumu processà e richieste entrate. In questu casu avemu stabilitu filtri chì currispondenu server_names in u passu precedente. Quandu e dumande entrate arrivanu chì currispondenu à certi domini è rotte, u trafficu hè instradatu à u cluster. Questu hè l'equivalente di una cunfigurazione NGINX bottom-up.

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

nomu envoy.http_connection_manager hè un filtru integratu in Envoy Proxy. Altri filtri includenu Redis, Mongo, TCP. Pudete truvà a lista cumpleta à ducumentazione.

Per più infurmazione nantu à altre pulitiche di bilanciamentu di carica, visitate Documentation Envoy.

Passu 5 - Configurazione Proxy è Upstream

In NGINX, a cunfigurazione upstream definisce un settore di servitori di destinazione chì prucessarà u trafficu. In questu casu, dui gruppi sò stati attribuiti.

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

In Envoy, questu hè gestitu da clusters.

Clusters di mandatari

L'equivalente upstream hè definitu cum'è clusters. In questu casu, l'ospiti chì serviranu u trafficu sò stati identificati. A manera di accede à l'ospiti, cum'è timeouts, hè definitu cum'è una cunfigurazione di cluster. Questu permette un cuntrollu più granulare nantu à aspetti cum'è a latenza è l'equilibriu di carica.

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

Quandu si usa u serviziu di scuperta STRICT_DNS Envoy risolverà continuamente è asincronamente i miri DNS specificati. Ogni indirizzu IP restituitu da u risultatu DNS serà cunsideratu un host esplicitu in u cluster upstream. Questu significa chì se una dumanda torna dui indirizzi IP, Envoy assumerà chì ci sò dui ospiti in u cluster, è i dui devenu esse equilibrati di carica. Se un òspite hè eliminatu da u risultatu, Envoy assumerà chì ùn esiste più è tirarà u trafficu da ogni piscina di cunnessione esistente.

Per più infurmazione vede Documentazione proxy Envoy.

Step 6 - Log Access and Errors

A cunfigurazione finale hè a registrazione. Invece di spinghje i logs d'errore à u discu, Envoy Proxy adopta un approcciu basatu in nuvola. Tutti i logs di l'applicazione sò in output stdout и stderr.

Quandu l'utilizatori facenu una dumanda, i logs d'accessu sò opzionali è disattivati ​​per automaticamente. Per attivà i logs d'accessu per e dumande HTTP, attivate a cunfigurazione log_access per u gestore di cunnessione HTTP. U percorsu pò esse sia un dispusitivu cum'è stdout, o un schedariu nantu à u discu, secondu i vostri bisogni.

A seguente cunfigurazione redirigerà tutti i logs d'accessu à stdout (Nota di u traduttore - stdout hè necessariu d'utilizà envoy in docker. Se s'utilice senza docker, poi rimpiazzà /dev/stdout cù u percorsu à un schedariu di log regular). Copia u snippet à a sezione di cunfigurazione per u gestore di cunnessione:

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

I risultati duveranu vede cusì:

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

Per automaticamente, Envoy hà una stringa di furmatu chì include i dettagli di a dumanda HTTP:

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

U risultatu di sta stringa di formatu hè:

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

U cuntenutu di pruduzzioni pò esse persunalizatu da mette u campu di furmatu. Per esempiu:

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"

A linea di logu pò ancu esse prodotta in u formatu JSON per stabilisce u campu json_format. Per esempiu:

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

Per più infurmazione nantu à a Metodologia di Registrazione di l'Envoy, visitate

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

Logging ùn hè micca l'unicu modu per acquistà insight à travaglià cù Envoy Proxy. Hà capacità avanzate di seguimentu è metrica integrate in questu. Pudete sapè di più à documentazione di traccia o attraversu Scrittura di traccia interattiva.

Passu 7 - Lanciari

Avete avà migratu a vostra cunfigurazione da NGINX à Envoy Proxy. L'ultimu passu hè di lancià una istanza di Envoy Proxy per pruvà.

Eseguite cum'è utilizatore

À a cima di a linea di cunfigurazione NGINX utilizatore www www; specifica per eseguisce NGINX cum'è un utilizatore pocu privilegiatu per migliurà a sicurità.

Envoy Proxy adopta un approcciu basatu in nuvola per a gestione di quale pussede un prucessu. Quandu eseguimu Envoy Proxy à traversu un containeru, pudemu specificà un utilizatore à pocu privilegiu.

Lanciamentu di Envoy Proxy

U cumandimu quì sottu eseguirà Envoy Proxy attraversu un containeru Docker nantu à l'ospite. Questu cumandamentu dà à Envoy l'abilità di sente per e dumande in u portu 80. In ogni casu, cum'è specificata in a cunfigurazione di u listener, Envoy Proxy ascolta u trafficu in u portu 8080. Questu permette à u prucessu per eseguisce cum'è un usu privilegiatu.

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

Prucessioni

Cù u proxy in esecuzione, i testi ponu avà esse fatti è processati. U cumandimu cURL seguente emette una dumanda cù l'intestazione di l'ospite definita in a cunfigurazione proxy.

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

A dumanda HTTP hà da esse un errore 503. Questu hè perchè e cunnessione upstream ùn funziona micca è ùn sò micca dispunibili. Dunque, Envoy Proxy ùn hà micca destinazioni dispunibili per a dumanda. U cumandimu seguitu principià una seria di servizii HTTP chì currispondenu à a cunfigurazione definita per Envoy.

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

Cù i servizii dispunibuli, Envoy pò riesce u trafficu proxy à u so destinazione.

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

Duvete vede una risposta chì indica quale container Docker hà processatu a dumanda. In i logs di Envoy Proxy, duvete ancu vede un output di stringa d'accessu.

Intestazioni di risposta HTTP supplementari

Vederete intestazioni HTTP supplementari in l'intestazione di risposta di a dumanda attuale. L'intestazione mostra u tempu chì l'ospite upstream hà passatu à processà a dumanda. Spressa in millisecondi. Questu hè utile se u cliente vole determinà u tempu di serviziu cumparatu cù a latenza di a rete.

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

Config finale

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 }

Informazioni supplementari da u traduttore

Istruzzioni per installà Envoy Proxy ponu esse truvati nantu à u situ web https://www.getenvoy.io/

Per automaticamente, rpm ùn hà micca una configurazione di serviziu di sistema.

Aghjunghjite a configurazione di u serviziu systemd /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

Avete bisognu di creà un repertoriu /etc/envoy/ è mette a config.yaml config.

Ci hè un chat di telegramma cù proxy di l'envoy: https://t.me/envoyproxy_ru

Envoy Proxy ùn sustene micca u serviziu di cuntenutu staticu. Dunque, quale pò votà per a funzione: https://github.com/envoyproxy/envoy/issues/378

Solu l'utilizatori registrati ponu participà à l'indagine. Firmà lu, per piacè.

Questu post vi hà incuraghjitu à stallà è pruvà proxy di l'envoy?

  • micca

75 utilizatori anu vutatu. 18 utilizatori si sò astenuti.

Source: www.habr.com

Add a comment