Migrasi saka Nginx menyang Envoy Proxy

Sugeng rawuh, Habr! Aku nggawa menyang manungsa waΓ© terjemahan saka kiriman: Migrasi saka Nginx menyang Envoy Proxy.

Utusan minangka server proxy sing disebarake kanthi kinerja dhuwur (ditulis ing C ++) sing dirancang kanggo layanan lan aplikasi individu, uga bis komunikasi lan "pesawat data universal" sing dirancang kanggo arsitektur "bolong layanan" microservice gedhe. Nalika nggawe, solusi kanggo masalah sing muncul sajrone pangembangan server kayata NGINX, HAProxy, load balancers hardware lan cloud load balancers dianggep. Utusan makarya bebarengan karo saben aplikasi lan abstrak jaringan kanggo nyedhiyani fungsi umum preduli saka platform. Nalika kabeh lalu lintas layanan ing infrastruktur mili liwat bolong Utusan, dadi gampang kanggo nggambarake wilayah masalah kanthi observasi konsisten, nyetel kinerja sakabèhé, lan nambah fungsi inti ing lokasi tartamtu.

Fitur

  • Arsitektur out-of-process: utusan minangka server kanthi kinerja dhuwur sing mbutuhake RAM cilik. Kerjane bebarengan karo basa utawa kerangka aplikasi apa wae.
  • Dhukungan http / 2 lan grpc: utusan duwe kelas siji http / 2 lan dhukungan grpc kanggo sambungan mlebu lan metu. Iki minangka proxy transparan saka http/1.1 nganti http/2.
  • Balancing Load Lanjut: utusan ndhukung fitur imbangan beban lanjut kalebu nyoba maneh otomatis, pemutus rantai, watesan tarif global, bayangan panjaluk, imbangan beban zona lokal, lsp.
  • API Manajemen Konfigurasi: utusan nyedhiyakake API sing kuat kanggo ngatur konfigurasi sampeyan kanthi dinamis.
  • Observability: Pengamatan jero lalu lintas L7, dhukungan asli kanggo tracing sing disebarake lan observability saka mongodb, dynamodb lan akeh aplikasi liyane.

Langkah 1 - Conto NGINX Config

Skrip iki nggunakake file sing digawe khusus nginx.conf, adhedhasar conto lengkap saka NGINX Wiki. Sampeyan bisa ndeleng konfigurasi ing editor kanthi mbukak nginx.conf

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

Konfigurasi NGINX biasane duwe telung unsur utama:

  1. Konfigurasi server NGINX, struktur log lan fungsi Gzip. Iki ditetepake sacara global ing kabeh kasus.
  2. Konfigurasi NGINX kanggo nampa panjalukan menyang host one.example.com ing port 8080.
  3. Nyetel lokasi target, carane nangani lalu lintas kanggo macem-macem bagean saka URL.

Ora kabeh konfigurasi bakal ditrapake kanggo Envoy Proxy, lan sampeyan ora perlu ngatur sawetara setelan. Utusan Proxy wis papat jinis tombol, sing ndhukung infrastruktur inti sing ditawakake NGINX. Intine yaiku:

  • pamireng: Dheweke nemtokake cara Envoy Proxy nampa panjaluk sing mlebu. Envoy Proxy saiki mung ndhukung pamireng adhedhasar TCP. Sawise sambungan ditetepake, diterusake menyang saringan kanggo diproses.
  • Filter-filter: Iki minangka bagΓ©an saka arsitektur pipa sing bisa ngolah data mlebu lan metu. Fungsi iki kalebu saringan kayata Gzip, sing ngompres data sadurunge dikirim menyang klien.
  • Router: Dheweke nerusake lalu lintas menyang tujuan sing dibutuhake, ditetepake minangka kluster.
  • Kluster: Padha nemtokake titik pungkasan kanggo lalu lintas lan paramΓ¨ter konfigurasi.

Kita bakal nggunakake papat komponen iki kanggo nggawe konfigurasi Envoy Proxy kanggo cocog konfigurasi NGINX tartamtu. Tujuane Utusan yaiku nggarap API lan konfigurasi dinamis. Ing kasus iki, konfigurasi dhasar bakal nggunakake setelan statis, hard-kode saka NGINX.

Langkah 2 - Konfigurasi NGINX

BagΓ©an pisanan nginx.conf nemtokake sawetara internal NGINX sing kudu dikonfigurasi.

Sambungan Pekerja

Konfigurasi ing ngisor iki nemtokake jumlah pangolahan lan sambungan buruh. Iki nuduhake kepiye ukuran NGINX kanggo nyukupi kabutuhan.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy ngatur alur kerja lan sambungan kanthi cara sing beda-beda.

Utusan nggawe thread buruh kanggo saben thread hardware ing sistem. Saben thread buruh nglakokake loop acara non-blocking sing tanggung jawab

  1. Ngrungokake saben pamireng
  2. Nampa sambungan anyar
  3. Nggawe saringan saringan kanggo sambungan
  4. Proses kabeh operasi I / O sajrone umur sambungan.

Kabeh pangolahan sambungan luwih ditangani kabeh ing thread buruh, kalebu prilaku nerusake.

Kanggo saben thread buruh ing Utusan, ana blumbang sambungan. Dadi blumbang sambungan HTTP / 2 mung nggawe siji sambungan saben host eksternal sekaligus, yen ana papat benang pekerja bakal ana papat sambungan HTTP / 2 saben host eksternal ing negara sing stabil. Kanthi nyimpen kabeh ing siji utas buruh, meh kabeh kode bisa ditulis tanpa diblokir, kaya-kaya thread tunggal. Yen luwih akeh thread buruh diparengake saka perlu, iki bisa mimpin kanggo memori boroske, nggawe nomer akeh sambungan meneng, lan ngurangi nomer kaping sambungan bali menyang blumbang.

Kanggo informasi luwih lengkap riko Blog Proxy Utusan.

Konfigurasi HTTP

Blok konfigurasi NGINX ing ngisor iki nemtokake setelan HTTP kayata:

  • Jinis mime apa sing didhukung
  • Wektu entek standar
  • Konfigurasi Gzip

Sampeyan bisa ngatur aspek kasebut nggunakake saringan ing Envoy Proxy, sing bakal dibahas mengko.

Langkah 3 - Konfigurasi Server

Ing blok konfigurasi HTTP, konfigurasi NGINX nemtokake kanggo ngrungokake port 8080 lan nanggapi panjalukan sing mlebu kanggo domain. one.example.com ΠΈ www.one.example.com.

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

Ing Envoy, dikontrol dening Pamireng.

Utusan pamireng

Aspek sing paling penting kanggo miwiti Envoy Proxy yaiku nemtokake pamireng sampeyan. Sampeyan kudu nggawe file konfigurasi sing nerangake carane sampeyan pengin mbukak conto Utusan.

Snippet ing ngisor iki bakal nggawe pamireng anyar lan ngiket menyang port 8080. Konfigurasi kasebut ngandhani Envoy Proxy port sing kudu diikat kanggo panjaluk sing mlebu.

Envoy Proxy nggunakake notasi YAML kanggo konfigurasi. Kanggo introduksi kanggo notasi iki, deleng kene pranala.

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

Ora perlu kanggo nemtokake jeneng server, amarga saringan Envoy Proxy bakal nangani iki.

Langkah 4 - Konfigurasi Lokasi

Nalika panyuwunan teka menyang NGINX, blok lokasi nemtokake cara ngolah lan ngendi rute lalu lintas. Ing fragmen ing ngisor iki, kabeh lalu lintas menyang situs ditransfer menyang hulu (cathetan penerjemah: hulu biasane server aplikasi) sing jenenge targetCluster. Kluster hulu nemtokake simpul sing kudu ngolah panjaluk kasebut. Kita bakal ngrembug babagan iki ing langkah sabanjure.

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

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

Ing Utusan, Filter nindakake iki.

Filter-filter Utusan

Kanggo konfigurasi statis, saringan nemtokake cara ngolah panjalukan sing mlebu. Ing kasus iki kita nyetel saringan sing cocog jeneng_server ing langkah sadurunge. Nalika panjaluk mlebu teka sing cocog karo domain lan rute tartamtu, lalu lintas diarahake menyang kluster. Iki padha karo konfigurasi ngisor 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

Имя utusan.http_connection_manager punika Filter dibangun ing Envoy Proxy. Filter liyane kalebu Redis, mongo, TCP. Sampeyan bisa nemokake dhaptar lengkap ing dokumentasi.

Kanggo informasi luwih lengkap babagan kabijakan imbangan beban liyane, bukak Dokumentasi Utusan.

Langkah 5 - Konfigurasi Proksi lan Hulu

Ing NGINX, konfigurasi hulu nemtokake set server target sing bakal ngolah lalu lintas. Ing kasus iki, rong klompok diutus.

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

Ing Utusan, iki dikelola dening kluster.

Kluster Utusan

Setara hulu ditetepake minangka kluster. Ing kasus iki, host sing bakal ngladeni lalu lintas wis diidentifikasi. Cara ngakses host, kayata wektu entek, ditetepake minangka konfigurasi kluster. Iki ngidini kontrol luwih akeh babagan aspek kayata latensi lan keseimbangan muatan.

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

Nalika nggunakake panemuan layanan STRICT_DNS Utusan bakal terus-terusan lan ora sinkron ngrampungake target DNS sing ditemtokake. Saben alamat IP sing bali saka asil DNS bakal dianggep minangka host eksplisit ing kluster hulu. Iki tegese yen panjalukan ngasilake loro alamat IP, Utusan bakal nganggep yen ana rong host ing kluster, lan loro-lorone kudu imbang. Yen host dibusak saka asil, Utusan bakal nganggep iku wis ora ana maneh lan bakal narik lalu lintas saka sembarang pools sambungan ana.

Kanggo informasi luwih lengkap, waca Dokumentasi proxy utusan.

Langkah 6 - Akses Log lan Kasalahan

Konfigurasi pungkasan yaiku registrasi. Tinimbang nyurung log kesalahan menyang disk, Envoy Proxy njupuk pendekatan berbasis awan. Kabeh log aplikasi sing output kanggo stdout ΠΈ stderr.

Nalika pangguna nggawe panjalukan, akses log opsional lan dipateni kanthi gawan. Kanggo ngaktifake log akses kanggo panjalukan HTTP, aktifake konfigurasi kasebut akses_log kanggo manajer sambungan HTTP. Path bisa dadi salah siji piranti kayata stdout, utawa file ing disk, gumantung saka kabutuhan sampeyan.

Konfigurasi ing ngisor iki bakal ngarahake kabeh log akses menyang stdout (cathetan penerjemah - stdout dibutuhake kanggo nggunakake utusan nang docker. Yen digunakake tanpa docker, banjur ngganti / dev / stdout karo path menyang file log biasa). Salin potongan kasebut menyang bagean konfigurasi kanggo manajer sambungan:

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

Asil kudu katon kaya iki:

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

Kanthi gawan, Utusan duwe string format sing kalebu rincian panjalukan 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

Asil saka string format iki yaiku:

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

Isi output bisa disesuaikan kanthi nyetel kolom format. Tuladhane:

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"

Baris log uga bisa dadi output ing format JSON kanthi nyetel lapangan json_format. Contone:

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

Kanggo informasi luwih lengkap babagan Metodologi Registrasi Utusan, bukak

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

Log ora mung siji-sijine cara kanggo ngerteni babagan nggarap Envoy Proxy. Nduwe kemampuan tracing lan metrik sing luwih maju. Sampeyan bisa ngerteni luwih akeh ing tracing dokumentasi utawa liwat Script tracing interaktif.

Langkah 7 - Bukak

Sampeyan saiki wis migrasi konfigurasi saka NGINX menyang Envoy Proxy. Langkah pungkasan yaiku miwiti conto Envoy Proxy kanggo nyoba.

Mbukak minangka pangguna

Ing sisih ndhuwur baris konfigurasi NGINX panganggo www www; nemtokake kanggo mbukak NGINX minangka pangguna sing nduweni hak istimewa kanggo nambah keamanan.

Envoy Proxy njupuk pendekatan berbasis awan kanggo ngatur sapa sing duwe proses. Nalika kita mbukak Envoy Proxy liwat wadhah, kita bisa nemtokake pangguna hak istimewa kurang.

Mbukak Envoy Proxy

Printah ing ngisor iki bakal mbukak Envoy Proxy liwat wadhah Docker ing host. Printah iki menehi Envoy kemampuan kanggo ngrungokake panjalukan sing mlebu ing port 80. Nanging, kaya sing ditemtokake ing konfigurasi pamireng, Envoy Proxy ngrungokake lalu lintas sing mlebu ing port 8080. Iki ngidini proses kasebut bisa digunakake minangka pangguna sing duwe hak istimewa.

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

Tes

Kanthi proxy mlaku, tes saiki bisa digawe lan diproses. Printah cURL ing ngisor iki ngetokake panjalukan karo header host sing ditetepake ing konfigurasi proxy.

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

Panjaluk HTTP bakal nyebabake kesalahan 503. Iki amarga sambungan hulu ora bisa digunakake lan ora kasedhiya. Mula, Utusan Proxy ora duwe tujuan sing kasedhiya kanggo panjaluk kasebut. Printah ing ngisor iki bakal miwiti seri layanan HTTP sing cocog karo konfigurasi sing ditetepake kanggo Utusan.

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

Kanthi layanan sing kasedhiya, Utusan bisa sukses proxy lalu lintas menyang tujuane.

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

Sampeyan kudu ndeleng respon sing nuduhake wadah Docker sing ngolah panjaluk kasebut. Ing log Envoy Proxy sampeyan uga kudu ndeleng output string akses.

Header Tanggapan HTTP Tambahan

Sampeyan bakal weruh header HTTP tambahan ing header respon saka panyuwunan nyata. Header nampilake wektu host hulu ngginakaken pangolahan panjalukan. Ditulis ing milliseconds. Iki migunani yen klien pengin nemtokake wektu layanan dibandhingake karo latensi jaringan.

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

Konfigurasi pungkasan

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 }

Informasi tambahan saka penerjemah

Pandhuan kanggo nginstal Envoy Proxy bisa ditemokake ing situs web https://www.getenvoy.io/

Kanthi gawan, rpm ora duwe konfigurasi layanan systemd.

Tambah konfigurasi layanan 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

Sampeyan kudu nggawe direktori / etc / utusan / lan sijine config.yaml config ana.

Ana obrolan telegram nggunakake proxy utusan: https://t.me/envoyproxy_ru

Envoy Proxy ora ndhukung konten statis. Dadi, sapa sing bisa milih fitur kasebut: https://github.com/envoyproxy/envoy/issues/378

Mung pangguna pangguna sing bisa melu survey. mlebunggih.

Apa kiriman iki nyengkuyung sampeyan nginstal lan nguji proxy utusan?

  • ya

  • ora

75 pangguna milih. 18 kedhaftar abstained.

Source: www.habr.com

Add a comment