salam sejahtera! Ini adalah artikel pendek yang menjawab soalan: "apa itu utusan?", "mengapa ia diperlukan?" dan "di mana untuk bermula?".
Apa ini?
Envoy ialah pengimbang L4-L7 yang ditulis dalam C++, memfokuskan pada prestasi tinggi dan ketersediaan. Di satu pihak, ini dalam beberapa cara adalah analog nginx dan haproxy, setanding dengan prestasinya. Sebaliknya, ia lebih berorientasikan kepada seni bina perkhidmatan mikro dan mempunyai fungsi yang tidak lebih buruk daripada pengimbang java dan go, seperti zuul atau traefik.
Jadual perbandingan haproxy/nginx/utusan, ia tidak mendakwa sebagai kebenaran mutlak, tetapi memberikan gambaran umum.
nginx
haproksi
utusan
traefik
bintang di github
11.2k/cermin
1.1k/cermin
12.4k
27.6k
tertulis dalam
C
C
C + +
go
API
tiada
soket sahaja/tolak
dataplane/tarik
tarik
pemeriksaan kesihatan aktif
tiada
ya
ya
ya
Penjejakan terbuka
pemalam luaran
tiada
ya
ya
J.W.T.
pemalam luaran
tiada
ya
tiada
lanjutan
Lua/C
Lua/C
Lua/C++
tiada
Apa untuk
Ini adalah projek muda, terdapat banyak perkara yang hilang, beberapa dalam alfa awal. Tetapi utusan, juga disebabkan oleh masa mudanya, sedang berkembang pesat dan sudah mempunyai banyak ciri menarik: konfigurasi dinamik, banyak penapis siap sedia, antara muka mudah untuk menulis penapis anda sendiri.
Bidang aplikasi mengikuti dari ini, tetapi pertama-tama terdapat 2 antipattern:
- Gegaran statik.
Hakikatnya pada masa ini dalam utusan tiada sokongan caching. Orang Google sedang mencuba ini
Buat masa ini, gunakan nginx untuk statik.
- Konfigurasi statik.
Anda boleh menggunakannya, tetapi utusan Bukan untuk itu ia dicipta. Ciri dalam konfigurasi statik tidak akan didedahkan. Terdapat banyak detik:
Apabila mengedit konfigurasi dalam yaml, anda akan tersilap, memarahi pembangun kerana verbosity dan berfikir bahawa konfigurasi nginx/haproxy, walaupun kurang berstruktur, adalah lebih ringkas. Itulah maksudnya. Konfigurasi Nginx dan Haproxy dicipta untuk mengedit dengan tangan, dan utusan untuk penjanaan daripada kod. Keseluruhan konfigurasi diterangkan dalam
Canary, senario penggunaan b/g dan banyak lagi biasanya dilaksanakan hanya dalam konfigurasi dinamik. Saya tidak mengatakan bahawa ini tidak boleh dilakukan secara statik, kita semua melakukannya. Tetapi untuk ini anda perlu memakai tongkat, dalam mana-mana pengimbang, dalam utusan termasuk.
Tugas yang penting bagi Utusan:
- Pengimbangan trafik dalam sistem yang kompleks dan dinamik. Ini termasuk jaringan perkhidmatan, tetapi ia tidak semestinya satu-satunya.
- Keperluan untuk fungsi pengesanan teragih, kebenaran kompleks atau fungsi lain yang tersedia dalam utusan di luar kotak atau dilaksanakan dengan mudah, tetapi dalam nginx/haproxy anda perlu dikelilingi oleh lua dan pemalam yang meragukan.
Kedua-duanya, jika perlu, memberikan prestasi tinggi.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Utusan diedarkan dalam binari sahaja sebagai imej docker. Imej itu sudah mengandungi contoh konfigurasi statik. Tetapi kami berminat dengannya hanya untuk memahami strukturnya.
konfigurasi statik utusan.yaml
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.google.com
cluster: service_google
http_filters:
- name: envoy.router
clusters:
- name: service_google
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_google
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: www.google.com
port_value: 443
transport_socket:
name: envoy.transport_sockets.tls
typed_config:
"@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
sni: www.google.com
Konfigurasi dinamik
Apakah masalah yang kita cari penyelesaian? Anda tidak boleh hanya memuatkan semula konfigurasi pengimbang beban di bawah beban; masalah "kecil" akan timbul:
- Pengesahan konfigurasi.
Konfigurasi boleh menjadi besar, ia boleh menjadi sangat besar, jika kita membebankan semuanya sekaligus, kemungkinan ralat di suatu tempat meningkat.
- Sambungan berpanjangan.
Apabila memulakan pendengar baharu, anda perlu menjaga sambungan yang berjalan pada yang lama; jika perubahan berlaku dengan kerap dan terdapat sambungan yang tahan lama, anda perlu mencari kompromi. Hello, kubernetes masuk ke nginx.
- Pemeriksaan kesihatan aktif.
Jika kami mempunyai pemeriksaan kesihatan yang aktif, kami perlu menyemak semula kesemuanya dalam konfigurasi baharu sebelum menghantar trafik. Kalau di hulu banyak, ini mengambil masa. Hello haproxy.
Bagaimana ini diselesaikan dalam utusanDengan memuatkan konfigurasi secara dinamik, mengikut model pool, anda boleh membahagikannya kepada bahagian yang berasingan dan tidak memulakan semula bahagian yang tidak berubah. Contohnya, pendengar, yang mahal untuk dimulakan semula dan jarang berubah.
Konfigurasi utusan (daripada fail di atas) mempunyai entiti berikut:
- pendengar β pendengar tergantung pada ip/port tertentu
- hos maya - hos maya dengan nama domain
- laluan - peraturan pengimbangan
- kelompok β sekumpulan hulu dengan parameter pengimbangan
- titik akhir β alamat contoh huluan
Setiap entiti ini serta beberapa entiti lain boleh diisi secara dinamik; untuk ini, konfigurasi menentukan alamat perkhidmatan dari mana konfigurasi akan diterima. Perkhidmatan ini boleh REST atau gRPC, gRPC adalah lebih baik.
Perkhidmatan tersebut dinamakan masing-masing: LDS, VHDS, RDS, CDS dan EDS. Anda boleh menggabungkan konfigurasi statik dan dinamik, dengan had bahawa sumber dinamik tidak boleh ditentukan dalam satu statik.
Untuk kebanyakan tugas, sudah cukup untuk melaksanakan tiga perkhidmatan terakhir, ia dipanggil ADS (Aggregated Discovery Service), untuk
Konfigurasi mengambil bentuk berikut:
konfigurasi dinamik utusan.yaml
dynamic_resources:
ads_config:
api_type: GRPC
grpc_services:
envoy_grpc:
cluster_name: xds_clr
cds_config:
ads: {}
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
stat_prefix: ingress_http
rds:
route_config_name: local_route
config_source:
ads: {}
http_filters:
- name: envoy.router
clusters:
- name: xds_clr
connect_timeout: 0.25s
type: LOGICAL_DNS
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: xds_clr
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: xds
port_value: 6565
Pada permulaan utusan dengan konfigurasi ini, ia akan menyambung ke satah kawalan dan cuba meminta konfigurasi RDS, CDS dan EDS. Bagaimana proses interaksi berlaku diterangkan
Pendek kata, utusan menghantar permintaan yang menunjukkan jenis sumber yang diminta, versi dan parameter nod. Sebagai tindak balas, ia menerima sumber dan versi; jika versi pada satah kawalan tidak berubah, ia tidak bertindak balas.
Terdapat 4 pilihan interaksi:
- Satu aliran gRPC untuk semua jenis sumber, status penuh sumber dihantar.
- Aliran berasingan, keadaan penuh.
- Satu aliran, keadaan tambahan.
- Aliran berasingan, keadaan tambahan.
xDS tambahan membolehkan anda mengurangkan trafik antara satah kawalan dan utusan, ini berkaitan untuk konfigurasi besar. Tetapi ia merumitkan interaksi; permintaan itu mengandungi senarai sumber untuk berhenti melanggan dan melanggan.
Contoh kami menggunakan ADS - satu aliran untuk RDS, CDS, EDS dan mod bukan tambahan. Untuk mendayakan mod tambahan, anda perlu menentukan api_type: DELTA_GRPC
Memandangkan permintaan mengandungi parameter nod, kami boleh menghantar sumber yang berbeza ke satah kawalan untuk keadaan yang berbeza utusan, ini sesuai untuk membina jaringan perkhidmatan.
Warmup
Pada utusan pada permulaan atau apabila menerima konfigurasi baharu daripada satah kawalan, proses pemanasan sumber dilancarkan. Ia dibahagikan kepada pemanasan pendengar dan pemanasan kelompok. Yang pertama dilancarkan apabila terdapat perubahan dalam RDS/LDS, yang kedua apabila CDS/EDS. Ini bermakna jika hanya hulu berubah, pendengar tidak dicipta semula.
Semasa proses memanaskan badan, sumber bergantung dijangka daripada satah kawalan semasa tamat masa. Jika tamat masa berlaku, permulaan tidak akan berjaya dan pendengar baharu tidak akan mula mendengar pada port.
Perintah permulaan: EDS, CDS, pemeriksaan kesihatan aktif, RDS, LDS. Dengan pemeriksaan kesihatan aktif didayakan, trafik akan naik ke hulu hanya selepas satu pemeriksaan kesihatan yang berjaya.
Jika pendengar dicipta semula, yang lama akan masuk ke dalam keadaan PARIT dan akan dipadamkan selepas semua sambungan ditutup atau tamat masa tamat --drain-time-s
, lalai 10 minit.
Untuk diteruskan.
Sumber: www.habr.com