Sugeng rawuh, Habr! Aku nggawa menyang manungsa waΓ© terjemahan saka kiriman:
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 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:
- Konfigurasi server NGINX, struktur log lan fungsi Gzip. Iki ditetepake sacara global ing kabeh kasus.
- Konfigurasi NGINX kanggo nampa panjalukan menyang host one.example.com ing port 8080.
- 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
- Ngrungokake saben pamireng
- Nampa sambungan anyar
- Nggawe saringan saringan kanggo sambungan
- 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
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
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
Kanggo informasi luwih lengkap babagan kabijakan imbangan beban liyane, bukak
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
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
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
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
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:
Envoy Proxy ora ndhukung konten statis. Dadi, sapa sing bisa milih fitur kasebut:
Mung pangguna pangguna sing bisa melu survey.
Apa kiriman iki nyengkuyung sampeyan nginstal lan nguji proxy utusan?
-
ya
-
ora
75 pangguna milih. 18 kedhaftar abstained.
Source: www.habr.com