Migrasi dari Nginx ke Envoy Proxy

Halo, Habr! Saya sampaikan kepada Anda terjemahan dari postingan tersebut: Migrasi dari Nginx ke Envoy Proxy.

Envoy adalah server proxy terdistribusi berkinerja tinggi (ditulis dalam C++) yang dirancang untuk layanan dan aplikasi individual, juga merupakan bus komunikasi dan “bidang data universal” yang dirancang untuk arsitektur “jaringan layanan” layanan mikro yang besar. Saat membuatnya, solusi untuk masalah yang muncul selama pengembangan server seperti NGINX, HAProxy, penyeimbang beban perangkat keras, dan penyeimbang beban cloud diperhitungkan. Envoy bekerja bersama setiap aplikasi dan mengabstraksi jaringan untuk menyediakan fungsionalitas umum apa pun platformnya. Ketika semua lalu lintas layanan dalam infrastruktur mengalir melalui mesh Envoy, memvisualisasikan area masalah menjadi mudah dengan kemampuan pengamatan yang konsisten, menyesuaikan kinerja secara keseluruhan, dan menambahkan fungsionalitas inti di lokasi tertentu.

Kemampuan

  • Arsitektur di luar proses: utusan adalah server mandiri berkinerja tinggi yang menggunakan sejumlah kecil RAM. Ia bekerja bersama dengan bahasa atau kerangka aplikasi apa pun.
  • Dukungan http/2 dan grpc: utusan memiliki dukungan http/2 dan grpc kelas satu untuk koneksi masuk dan keluar. Ini adalah proxy transparan dari http/1.1 hingga http/2.
  • Penyeimbangan Beban Tingkat Lanjut: utusan mendukung fitur penyeimbangan beban tingkat lanjut termasuk percobaan ulang otomatis, pemutusan rantai, pembatasan laju global, bayangan permintaan, penyeimbangan beban zona lokal, dll.
  • API Manajemen Konfigurasi: utusan menyediakan API yang kuat untuk mengelola konfigurasi Anda secara dinamis.
  • Observabilitas: Observabilitas mendalam terhadap lalu lintas L7, dukungan asli untuk penelusuran terdistribusi dan observabilitas mongodb, dynamodb, dan banyak aplikasi lainnya.

Langkah 1 — Contoh Konfigurasi NGINX

Skrip ini menggunakan file yang dibuat khusus nginx.conf, berdasarkan contoh lengkap dari NGINX Wiki. Anda dapat melihat konfigurasi di editor dengan membuka nginx.conf

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

Konfigurasi NGINX biasanya memiliki tiga elemen utama:

  1. Mengonfigurasi server NGINX, struktur log, dan fungsionalitas Gzip. Hal ini didefinisikan secara global dalam semua kasus.
  2. Mengonfigurasi NGINX untuk menerima permintaan ke host one.example.com pada port 8080.
  3. Menyiapkan lokasi target, cara menangani lalu lintas untuk berbagai bagian URL.

Tidak semua konfigurasi akan berlaku untuk Envoy Proxy, dan Anda tidak perlu mengonfigurasi beberapa pengaturan. Utusan Proxy punya empat tipe kunci, yang mendukung infrastruktur inti yang ditawarkan oleh NGINX. Intinya adalah:

  • Pendengar: Mereka menentukan bagaimana Envoy Proxy menerima permintaan masuk. Envoy Proxy saat ini hanya mendukung pendengar berbasis TCP. Setelah koneksi dibuat, koneksi diteruskan ke serangkaian filter untuk diproses.
  • Filter: Mereka adalah bagian dari arsitektur saluran pipa yang dapat memproses data masuk dan keluar. Fungsionalitas ini mencakup filter seperti Gzip, yang mengompresi data sebelum mengirimkannya ke klien.
  • Router: Mereka meneruskan lalu lintas ke tujuan yang diperlukan, yang didefinisikan sebagai sebuah cluster.
  • Cluster: Mereka menentukan titik akhir untuk parameter lalu lintas dan konfigurasi.

Kami akan menggunakan keempat komponen ini untuk membuat konfigurasi Envoy Proxy agar sesuai dengan konfigurasi NGINX tertentu. Tujuan Envoy adalah bekerja dengan API dan konfigurasi dinamis. Dalam hal ini, konfigurasi dasar akan menggunakan pengaturan statis dan hard-code dari NGINX.

Langkah 2 - Konfigurasi NGINX

Bagian pertama nginx.conf mendefinisikan beberapa internal NGINX yang perlu dikonfigurasi.

Koneksi Pekerja

Konfigurasi di bawah ini menentukan jumlah proses pekerja dan koneksi. Hal ini menunjukkan bagaimana NGINX akan berkembang untuk memenuhi permintaan.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy Proxy mengelola alur kerja dan koneksi dengan cara yang berbeda.

Utusan membuat thread pekerja untuk setiap thread perangkat keras dalam sistem. Setiap thread pekerja mengeksekusi loop peristiwa non-pemblokiran yang menjadi tanggung jawabnya

  1. Mendengarkan setiap pendengar
  2. Menerima koneksi baru
  3. Membuat satu set filter untuk koneksi
  4. Memproses semua operasi I/O selama masa koneksi.

Semua pemrosesan koneksi lebih lanjut ditangani sepenuhnya di thread pekerja, termasuk perilaku penerusan apa pun.

Untuk setiap thread pekerja di Envoy, ada kumpulan koneksi. Jadi kumpulan koneksi HTTP/2 hanya membuat satu koneksi per host eksternal pada satu waktu, jika ada empat thread pekerja maka akan ada empat koneksi HTTP/2 per host eksternal dalam keadaan stabil. Dengan menyimpan semuanya dalam satu thread pekerja, hampir semua kode dapat ditulis tanpa pemblokiran, seolah-olah itu adalah thread tunggal. Jika lebih banyak thread pekerja yang dialokasikan daripada yang diperlukan, hal ini dapat menyebabkan terbuangnya memori, menciptakan sejumlah besar koneksi menganggur, dan mengurangi berapa kali koneksi dikembalikan ke kumpulan.

Untuk informasi lebih lanjut kunjungi Blog Proksi Utusan.

Konfigurasi HTTP

Blok konfigurasi NGINX berikut mendefinisikan pengaturan HTTP seperti:

  • Jenis pantomim apa yang didukung
  • Batas Waktu Default
  • Konfigurasi Gzip

Anda dapat menyesuaikan aspek-aspek ini menggunakan filter di Envoy Proxy, yang akan kita bahas nanti.

Langkah 3 - Konfigurasi Server

Di blok konfigurasi HTTP, konfigurasi NGINX menentukan untuk mendengarkan pada port 8080 dan merespons permintaan domain yang masuk one.example.com и www.one.example.com.

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

Di dalam Utusan, itu dikendalikan oleh Pendengar.

Pendengar utusan

Aspek terpenting dalam memulai Envoy Proxy adalah mendefinisikan pendengar Anda. Anda perlu membuat file konfigurasi yang menjelaskan bagaimana Anda ingin menjalankan instance Envoy.

Cuplikan di bawah ini akan membuat pendengar baru dan mengikatnya ke port 8080. Konfigurasi tersebut memberi tahu Envoy Proxy port mana yang harus diikat untuk permintaan masuk.

Envoy Proxy menggunakan notasi YAML untuk konfigurasinya. Untuk pengenalan notasi ini, lihat di sini link.

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

Tidak perlu didefinisikan nama server, karena filter Envoy Proxy akan menangani ini.

Langkah 4 - Konfigurasi Lokasi

Saat permintaan masuk ke NGINX, blok lokasi menentukan cara memproses dan ke mana merutekan lalu lintas. Dalam fragmen berikut, semua lalu lintas ke situs ditransfer ke cluster upstream (catatan penerjemah: upstream biasanya merupakan server aplikasi) bernama targetCluster. Cluster upstream mendefinisikan node yang harus memproses permintaan. Kami akan membahas ini pada langkah berikutnya.

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

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

Di Envoy, Filter melakukan ini.

Filter Utusan

Untuk konfigurasi statis, filter menentukan cara memproses permintaan masuk. Dalam hal ini kami menetapkan filter yang cocok nama_server pada langkah sebelumnya. Ketika permintaan masuk yang cocok dengan domain dan rute tertentu tiba, lalu lintas dialihkan ke cluster. Ini setara dengan konfigurasi bottom-up 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

nama utusan.http_connection_manager adalah filter bawaan di Envoy Proxy. Filter lainnya termasuk Redis, Mongo, TCP. Anda dapat menemukan daftar lengkapnya di dokumentasi.

Untuk informasi selengkapnya tentang kebijakan penyeimbangan beban lainnya, kunjungi Dokumentasi Utusan.

Langkah 5 - Konfigurasi Proxy dan Upstream

Di NGINX, konfigurasi upstream menentukan sekumpulan server target yang akan memproses lalu lintas. Dalam hal ini, dua cluster ditugaskan.

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

Di Envoy, ini dikelola oleh cluster.

Cluster Utusan

Setara upstream didefinisikan sebagai cluster. Dalam hal ini, host yang akan melayani lalu lintas telah diidentifikasi. Cara host diakses, seperti waktu habis, didefinisikan sebagai konfigurasi cluster. Hal ini memungkinkan kontrol yang lebih terperinci atas aspek-aspek seperti latensi dan penyeimbangan beban.

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

Saat menggunakan penemuan layanan STRICT_DNS Utusan akan terus menerus dan secara asinkron menyelesaikan target DNS yang ditentukan. Setiap alamat IP yang dikembalikan dari hasil DNS akan dianggap sebagai host eksplisit di klaster upstream. Artinya jika permintaan mengembalikan dua alamat IP, Envoy akan berasumsi bahwa ada dua host di cluster, dan keduanya harus seimbang bebannya. Jika sebuah host dihapus dari hasil, Envoy akan menganggapnya tidak ada lagi dan akan menarik lalu lintas dari kumpulan koneksi yang ada.

Untuk informasi lebih lanjut lihat Dokumentasi proxy utusan.

Langkah 6 — Akses Log dan Kesalahan

Konfigurasi terakhir adalah registrasi. Daripada memasukkan log kesalahan ke disk, Envoy Proxy mengambil pendekatan berbasis cloud. Semua log aplikasi dikeluarkan stdout и stderr.

Saat pengguna membuat permintaan, log akses bersifat opsional dan dinonaktifkan secara default. Untuk mengaktifkan log akses untuk permintaan HTTP, aktifkan konfigurasi akses_log untuk manajer koneksi HTTP. Jalurnya dapat berupa perangkat seperti stdout, atau file di disk, tergantung kebutuhan Anda.

Konfigurasi berikut akan mengalihkan semua log akses ke stdout (catatan penerjemah - stdout diperlukan untuk menggunakan utusan di dalam buruh pelabuhan. Jika digunakan tanpa buruh pelabuhan, ganti /dev/stdout dengan jalur ke file log biasa). Salin cuplikan ke bagian konfigurasi untuk pengelola koneksi:

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

Hasilnya akan terlihat seperti ini:

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

Secara default, Envoy memiliki string format yang menyertakan detail permintaan 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 dari format string ini adalah:

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

Konten keluaran dapat dikustomisasi dengan mengatur bidang format. Misalnya:

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 juga dapat dihasilkan dalam format JSON dengan mengatur kolom json_format. Sebagai contoh:

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

Untuk informasi lebih lanjut tentang Metodologi Pendaftaran Utusan, kunjungi

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

Logging bukan satu-satunya cara untuk mendapatkan wawasan dalam bekerja dengan Envoy Proxy. Ini memiliki kemampuan penelusuran dan metrik tingkat lanjut yang terpasang di dalamnya. Anda dapat mengetahui lebih lanjut di dokumentasi penelusuran atau melalui Skrip penelusuran interaktif.

Langkah 7 - Luncurkan

Anda sekarang telah memigrasikan konfigurasi Anda dari NGINX ke Envoy Proxy. Langkah terakhir adalah meluncurkan instance Envoy Proxy untuk mengujinya.

Jalankan sebagai pengguna

Di bagian atas baris konfigurasi NGINX pengguna www www; menetapkan untuk menjalankan NGINX sebagai pengguna dengan hak istimewa rendah untuk meningkatkan keamanan.

Envoy Proxy mengambil pendekatan berbasis cloud untuk mengelola siapa yang memiliki suatu proses. Saat kita menjalankan Envoy Proxy melalui sebuah container, kita dapat menentukan pengguna dengan hak istimewa rendah.

Meluncurkan Proksi Utusan

Perintah di bawah ini akan menjalankan Envoy Proxy melalui container Docker di host. Perintah ini memberikan Envoy kemampuan untuk mendengarkan permintaan masuk pada port 80. Namun, sebagaimana ditentukan dalam konfigurasi pendengar, Envoy Proxy mendengarkan lalu lintas masuk pada port 8080. Hal ini memungkinkan proses dijalankan sebagai pengguna dengan hak istimewa rendah.

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

Pengujian

Dengan proksi yang berjalan, pengujian kini dapat dilakukan dan diproses. Perintah cURL berikut mengeluarkan permintaan dengan header host yang ditentukan dalam konfigurasi proksi.

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

Permintaan HTTP akan menghasilkan kesalahan 503. Hal ini karena koneksi upstream tidak berfungsi dan tidak tersedia. Oleh karena itu, Proksi Utusan tidak memiliki tujuan yang tersedia untuk permintaan tersebut. Perintah berikut akan memulai serangkaian layanan HTTP yang cocok dengan konfigurasi yang ditentukan untuk Envoy.

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

Dengan layanan yang tersedia, Envoy berhasil mem-proxy lalu lintas ke tujuannya.

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

Anda akan melihat respons yang menunjukkan kontainer Docker mana yang memproses permintaan tersebut. Di log Proksi Utusan Anda juga akan melihat keluaran string akses.

Header Respons HTTP Tambahan

Anda akan melihat header HTTP tambahan di header respons permintaan sebenarnya. Header menampilkan waktu yang dihabiskan host upstream untuk memproses permintaan. Dinyatakan dalam milidetik. Hal ini berguna jika klien ingin menentukan waktu layanan dibandingkan dengan latensi jaringan.

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

Konfigurasi terakhir

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 dari penerjemah

Petunjuk untuk menginstal Envoy Proxy dapat ditemukan di situs web https://www.getenvoy.io/

Secara default, rpm tidak memiliki konfigurasi layanan systemd.

Tambahkan 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

Anda perlu membuat direktori /etc/envoy/ dan meletakkan konfigurasi config.yaml di sana.

Ada obrolan telegram menggunakan proxy utusan: https://t.me/envoyproxy_ru

Envoy Proxy tidak mendukung penyajian konten statis. Oleh karena itu, siapa yang dapat memilih fitur tersebut: https://github.com/envoyproxy/envoy/issues/378

Hanya pengguna terdaftar yang dapat berpartisipasi dalam survei. Masuk, silakan.

Apakah postingan ini mendorong Anda untuk menginstal dan menguji proxy utusan?

  • ya

  • tidak

75 pengguna memilih. 18 pengguna abstain.

Sumber: www.habr.com

Tambah komentar