Migrasi ti Nginx ka Envoy Proxy

Halo, Habr! Kuring mawa ka perhatian anjeun tarjamahan tina pos: Migrasi ti Nginx ka Envoy Proxy.

Utusan nyaéta server proxy disebarkeun-kinerja tinggi (ditulis dina C ++) dirancang pikeun layanan individu jeung aplikasi, eta oge beus komunikasi jeung "pesawat data universal" dirancang pikeun microservice badag "jasa bolong" arsitéktur. Nalika nyiptakeunana, solusi pikeun masalah anu timbul nalika pamekaran server sapertos NGINX, HAProxy, pangimbang beban hardware sareng pangimbang beban awan dipertimbangkeun. Utusan gawé bareng unggal aplikasi tur abstracts jaringan pikeun nyadiakeun fungsionalitas umum paduli platform. Nalika sadaya lalu lintas jasa dina infrastruktur ngalir ngaliwatan bolong Utusan, janten gampang pikeun ngabayangkeun daérah masalah kalayan observasi konsisten, nyaluyukeun kinerja sakabéh, sareng nambihan fungsionalitas inti dina lokasi anu spesifik.

kasempetan

  • Out-of-prosés arsitéktur: utusan mangrupakeun timer ngandung, server-kinerja tinggi nu nyokot jumlah leutik RAM. Gawéna babarengan sareng basa atanapi kerangka aplikasi naon waé.
  • http/2 jeung rojongan grpc: utusan boga kelas munggaran http/2 jeung rojongan grpc pikeun sambungan asup jeung kaluar. Ieu proxy transparan ti http/1.1 ka http/2.
  • Balancing Beban Canggih: utusan ngadukung fitur pangimbangan beban canggih kalebet retries otomatis, pegatna ranté, ngawatesan laju global, nyuhunkeun bayangan, balancing beban zona lokal, jsb.
  • API Manajemén Konfigurasi: utusan nyayogikeun API anu kuat pikeun ngatur konfigurasi anjeun sacara dinamis.
  • Observability: observability jero lalulintas L7, rojongan pituin pikeun tracing disebarkeun sarta observability of mongodb, dynamodb tur loba aplikasi sejenna.

Lengkah 1 - Conto NGINX Config

Skrip ieu nganggo file anu didamel khusus nginx.conf, dumasar kana conto lengkep ti NGINX Wiki. Anjeun tiasa ningali konfigurasi dina éditor ku muka 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 biasana ngagaduhan tilu elemen konci:

  1. Ngonpigurasikeun server NGINX, struktur log sareng fungsionalitas Gzip. Ieu ditetepkeun sacara global dina sagala hal.
  2. Ngonpigurasikeun NGINX pikeun nampi pamundut ka host one.example.com dina port 8080.
  3. Nyetel lokasi target, kumaha carana ngadamel lalulintas keur bagian béda tina URL.

Henteu sadayana konfigurasi bakal dilarapkeun ka Envoy Proxy, sareng anjeun henteu kedah ngonpigurasikeun sababaraha setélan. Utusan Proxy boga opat jenis konci, nu ngarojong infrastruktur inti ditawarkeun ku NGINX. Inti nyaéta:

  • Pamirsa: Aranjeunna nangtukeun kumaha Envoy Proxy narima requests asup. Envoy Proxy ayeuna ngan ukur ngadukung pamiarsa dumasar TCP. Sakali sambungan diadegkeun, éta diteruskeun kana saringan pikeun diolah.
  • saringan: Éta mangrupikeun bagian tina arsitéktur pipa anu tiasa ngolah data anu asup sareng kaluar. Fungsionalitas ieu kalebet saringan sapertos Gzip, anu ngompres data sateuacan dikirim ka klien.
  • Router: Aranjeunna neraskeun lalulintas ka tujuan diperlukeun, diartikeun klaster a.
  • Kluster: Aranjeunna nangtukeun titik tungtung pikeun lalulintas sarta parameter konfigurasi.

Kami bakal ngagunakeun opat komponén ieu pikeun nyiptakeun konfigurasi Envoy Proxy pikeun cocog sareng konfigurasi NGINX khusus. Tujuan utusan nyaéta pikeun damel sareng API sareng konfigurasi dinamis. Dina hal ieu, konfigurasi dasar bakal ngagunakeun statik, setélan hard-disandi ti NGINX.

Lengkah 2 - Konfigurasi NGINX

Bagian munggaran nginx.conf ngahartikeun sababaraha internal NGINX anu kedah dikonpigurasikeun.

Sambungan Pagawe

Konfigurasi di handap nangtukeun jumlah prosés worker sarta sambungan. Ieu nunjukkeun kumaha NGINX bakal skala pikeun nyumponan paménta.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy ngatur alur kerja sareng sambungan ku sababaraha cara.

Utusan nyiptakeun benang pagawé pikeun unggal benang hardware dina sistem. Unggal thread worker executes a loop acara non-blocking nu tanggung jawab

  1. Ngadangukeun unggal pangdéngé
  2. Narima sambungan anyar
  3. Nyiptakeun saringan pikeun sambungan
  4. Ngolah sagala operasi I / O salila hirupna sambungan.

Kabéh processing sambungan salajengna diatur sagemblengna dina thread worker, kaasup sagala kabiasaan diteruskeun.

Pikeun unggal thread pagawe di Utusan, aya kolam renang sambungan. Jadi HTTP / 2 kolam renang sambungan ngan ngadegkeun hiji sambungan per host éksternal dina hiji waktu, lamun aya opat threads worker bakal aya opat HTTP / 2 sambungan per host éksternal dina kaayaan stabil. Ku ngajaga sagalana dina hiji thread worker, ampir kabéh kode bisa ditulis tanpa blocking, saolah-olah éta single threaded. Lamun leuwih threads worker dialokasikeun ti diperlukeun, ieu bisa ngakibatkeun memori wasted, nyieun angka nu gede ngarupakeun sambungan dianggurkeun, sarta ngurangan jumlah kali sambungan balik deui ka kolam renang.

Kanggo inpo nu leuwih lengkep mangga buka Blog utusan Proxy.

Konfigurasi HTTP

Blok konfigurasi NGINX di handap ieu netepkeun setélan HTTP sapertos:

  • Jenis mime naon anu dirojong
  • Waktos Default
  • Konfigurasi Gzip

Anjeun tiasa nyaluyukeun aspék ieu nganggo saringan dina Envoy Proxy, anu bakal urang bahas engké.

Lengkah 3 - Konfigurasi Server

Dina blok konfigurasi HTTP, konfigurasi NGINX netepkeun ngadangukeun dina port 8080 sareng ngabales pamenta anu asup pikeun domain. one.example.com и www.one.example.com.

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

Di jero Utusan, éta dikawasa ku Listeners.

Utusan pangdéngé

Aspék anu paling penting pikeun ngamimitian nganggo Envoy Proxy nyaéta nangtukeun pamirsa anjeun. Anjeun kedah nyiptakeun file konfigurasi anu ngajelaskeun kumaha anjeun badé ngajalankeun conto Utusan.

The snippet handap bakal nyieun hiji pangdéngé anyar jeung meungkeut ka port 8080. Konfigurasi ngabejaan Utusan Proxy mana palabuhan eta kudu meungkeut pikeun requests asup.

Envoy Proxy nganggo notasi YAML pikeun konfigurasina. Pikeun bubuka notasi ieu, tingali di dieu link.

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

Teu kudu ngartikeun server_name, Kusabab saringan Envoy Proxy bakal nanganan ieu.

Lengkah 4 - Konfigurasi Lokasi

Nalika pamundut asup kana NGINX, blok lokasi nangtukeun kumaha ngolah sareng dimana rute lalu lintas. Dina fragmen di handap ieu, sadaya patalimarga ka loka dialihkeun ka hulu (catetan penerjemah: hulu biasana mangrupa server aplikasi) klaster ngaranna targetCluster. Kluster hulu ngahartikeun titik-titik anu kedah ngolah pamundut. Urang bakal ngabahas ieu dina lengkah saterusna.

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

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

Di Envoy, Filters ngalakukeun ieu.

Saringan Utusan

Pikeun konfigurasi statik, saringan nangtukeun cara ngolah requests asup. Dina hal ieu kami nyetél saringan anu cocog server_ngaran dina léngkah saméméhna. Nalika requests asup anjog nu cocog domain tangtu jeung ruteu, lalulintas routed ka klaster. Ieu sarua jeung NGINX konfigurasi handap-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

nami utusan.http_connection_manager nyaéta saringan anu diwangun dina Envoy Proxy. saringan séjén kaasup Redis, mongo, TCP. Anjeun tiasa mendakan daptar lengkep dina dokuméntasi.

Kanggo inpo nu langkung lengkep ihwal kawijakan load balancing séjén, mangga buka Dokuméntasi Utusan.

Lengkah 5 - Konfigurasi Proksi sareng Hulu

Dina NGINX, konfigurasi hulu ngahartikeun sakumpulan target server anu bakal ngolah lalu lintas. Dina hal ieu, dua klaster ditugaskeun.

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

Dina Utusan, ieu dikelola ku klaster.

Kluster Utusan

Sarua hulu diartikeun klaster. Dina hal ieu, host anu bakal ngalayanan lalu lintas parantos diidentifikasi. Cara diaksés host, sapertos waktos béak, dihartikeun salaku konfigurasi klaster. Hal ieu ngamungkinkeun pikeun kontrol leuwih granular leuwih aspék kayaning latency na load balancing.

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 nganggo penemuan jasa STRICT_DNS Utusan bakal terus-terusan sareng asynchronously ngabéréskeun target DNS anu ditangtukeun. Unggal alamat IP anu dipulangkeun tina hasil DNS bakal dianggap host eksplisit dina klaster hulu. Ieu ngandung harti yén lamun pamundut balik dua alamat IP, utusan bakal nganggap yen aya dua host dina klaster, sarta duanana kudu saimbang beban. Mun host a dihapus tina hasilna, bakal utusan nganggap eta euweuh aya na bakal narik lalulintas ti sagala pools sambungan aya.

Kanggo inpormasi lengkep tingali Dokuméntasi proxy utusan.

Lengkah 6 - Log Aksés sareng Kasalahan

Konfigurasi ahir nyaéta pendaptaran. Gantina ngadorong log kasalahan kana disk, Envoy Proxy nyandak pendekatan dumasar-awan. Sadaya log aplikasi kaluaran ka stdout и stderr.

Nalika pangguna ngadamel pamundut, log aksés janten pilihan sareng ditumpurkeun sacara standar. Pikeun ngaktipkeun log aksés pikeun pamundut HTTP, aktipkeun konfigurasi log_aksés pikeun manajer sambungan HTTP. Jalurna tiasa janten alat sapertos stdout, atanapi file dina disk, gumantung kana kabutuhan anjeun.

Konfigurasi di handap ieu bakal alihan sadaya log aksés ka stdout (catetan panarjamah urang - stdout diperlukeun ngagunakeun utusan jero docker. Lamun dipaké tanpa docker, lajeng ngaganti / dev / stdout kalawan jalur ka file log biasa). Salin snippet ka bagian konfigurasi pikeun manajer sambungan:

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

Hasilna kedah sapertos kieu:

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

Sacara standar, Envoy ngagaduhan format string anu kalebet detil pamundut 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

Hasil tina string format ieu nyaéta:

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

Eusi kaluaran tiasa disaluyukeun ku netepkeun widang format. Salaku conto:

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"

Garis log ogé tiasa kaluaran dina format JSON ku netepkeun lapangan json_format. Contona:

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

Kanggo inpo nu langkung lengkep ihwal Métodologi Pendaftaran Utusan, mangga buka

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

Logging sanes hiji-hijina cara pikeun meunangkeun wawasan ngeunaan gawé bareng Envoy Proxy. Éta ngagaduhan kamampuan ngalacak sareng métrik anu diwangun kana éta. Anjeun tiasa mendakan langkung seueur di nyukcruk dokuméntasi atanapi ngalangkungan Aksara ngalacak interaktif.

Lengkah 7 - peluncuran

Anjeun ayeuna tos migrasi konfigurasi anjeun ti NGINX ka Envoy Proxy. Léngkah terakhir nyaéta ngaluncurkeun conto Envoy Proxy pikeun nguji éta.

Jalankeun salaku pamaké

Di luhureun garis konfigurasi NGINX pamaké www www; nangtukeun ngajalankeun NGINX salaku pamaké low-hak husus pikeun ngaronjatkeun kaamanan.

Envoy Proxy nyandak pendekatan dumasar-awan pikeun ngatur anu gaduh prosés. Nalika urang ngajalankeun Envoy Proxy ngaliwatan wadahna, urang tiasa netepkeun pangguna anu ngagaduhan hak istimewa.

Ngaluncurkeun Envoy Proxy

Paréntah di handap bakal ngajalankeun Envoy Proxy ngaliwatan wadah Docker dina host. Paréntah ieu méré Utusan kamampuhan pikeun ngadéngékeun requests asup dina port 80. Sanajan kitu, sakumaha dieusian dina konfigurasi pangdéngé, utusan Proxy listens pikeun lalulintas asup dina port 8080. Hal ieu ngamungkinkeun prosés pikeun ngajalankeun salaku pamaké low-hak husus.

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

Tés

Kalayan proxy jalan, tés ayeuna tiasa dilakukeun sareng diolah. Paréntah cURL di handap ieu ngaluarkeun pamundut sareng header host anu didefinisikeun dina konfigurasi proxy.

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

Paménta HTTP bakal nyababkeun kasalahan 503. Ieu kusabab sambungan hulu teu tiasa dianggo sareng henteu sayogi. Ku alatan éta, Envoy Proxy teu boga tujuan sadia pikeun pamundut. Paréntah di handap ieu bakal ngamimitian runtuyan jasa HTTP anu cocog sareng konfigurasi anu ditetepkeun pikeun Utusan.

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

Kalayan jasa anu sayogi, Utusan tiasa suksés proxy lalu lintas ka tujuanana.

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

Anjeun kedah ningali réspon anu nunjukkeun wadah Docker anu ngolah pamundut éta. Dina log Envoy Proxy anjeun ogé kedah ningali kaluaran string aksés.

Lulugu Tanggapan HTTP tambahan

Anjeun bakal ningali headers HTTP tambahan dina headers respon tina pamundut sabenerna. Lulugu mintonkeun waktos host hulu spent ngolah pamundut teh. Ditémbongkeun dina milliseconds. Ieu mangpaat lamun klien hayang nangtukeun waktu layanan dibandingkeun latency jaringan.

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

Konfigurasi ahir

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 }

Émbaran tambahan ti penerjemah

Parentah pikeun masang Envoy Proxy tiasa dipendakan dina situs wéb https://www.getenvoy.io/

Sacara standar, rpm teu gaduh config service systemd.

Tambahkeun config service 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

Anjeun kudu nyieun diréktori a /etc/utusan/ sarta nempatkeun config.yaml config dinya.

Aya obrolan telegram nganggo proxy utusan: https://t.me/envoyproxy_ru

Envoy Proxy henteu ngadukung ngalayanan eusi statik. Ku kituna, saha nu bisa milih pikeun fitur: https://github.com/envoyproxy/envoy/issues/378

Ngan pamaké nu kadaptar bisa ilubiung dina survey. Daptar, Punten.

Naha tulisan ieu nyorong anjeun masang sareng nguji proxy utusan?

  • nuhun

  • teu

75 pamaké milih. 18 pamaké abstained.

sumber: www.habr.com

Tambahkeun komentar