salamlar! Bu, "elçi nədir?", "niyə lazımdır?" suallarına cavab verən kiçik bir məqalədir. və "haradan başlamaq lazımdır?".
Bu nədir?
Elçi, C++ dilində yazılmış, yüksək performansa və əlçatanlığa yönəlmiş L4-L7 balanslaşdırıcısıdır. Bir tərəfdən, bu, hansısa şəkildə nginx və haproksinin analoqudur, performans baxımından onlarla mütənasibdir. Digər tərəfdən, o, daha çox mikroservis arxitekturasına diqqət yetirir və zuul və ya traefik kimi java və go balanslaşdırıcıları ilə eyni funksionallığa malikdir.
Haproxy / nginx / elçi müqayisə cədvəli, mütləq həqiqət olduğunu iddia etmir, lakin ümumi bir şəkil verir.
nginx
haproksi
göndərdi
traefik
github-da ulduzlar
11.2k/güzgü
1.1k/güzgü
12.4k
27.6k
-də yazılmışdır
C
C
C + +
go
API
нет
yalnız rozetka/push
məlumat müstəvisi/çəkin
dartmaq
aktiv sağlamlıq müayinəsi
нет
bəli
bəli
bəli
açıq izləmə
xarici plagin
нет
bəli
bəli
J.W.T.
xarici plagin
нет
bəli
нет
artırma
Lua/C
Lua/C
Lua/C++
нет
Nə üçün
Bu gənc bir layihədir, orada çox şey çatışmır, erkən alfada bir şey var. Amma göndərdi, o cümlədən gəncliyinə görə sürətlə inkişaf edir və artıq bir çox maraqlı xüsusiyyətlərə malikdir: dinamik konfiqurasiya, çoxlu hazır filtrlər, öz filtrlərinizi yazmaq üçün sadə interfeys.
Bu, tətbiq sahələrinə səbəb olur, lakin birincisi, 2 anti-naxış:
- Statikin qaytarılması.
Məsələ ondadır ki, hazırda göndərdi keşləmə dəstəyi yoxdur. Google adamları bunu sınayırlar
Bu arada, statik üçün nginx istifadə edin.
- statik konfiqurasiya.
İstifadə edə bilərsiniz, amma göndərdi bunun üçün yaradılmamışdır. Statik konfiqurasiyada imkanlar açıqlanmayacaq. Çox anlar:
Yaml-da konfiqurasiyanı redaktə edərkən, siz səhvlər edəcəksiniz, tərtibatçıları təfərrüatlara görə lənətləyəcəksiniz və nginx / haproxy konfiqurasiyalarının daha az strukturlaşdırılmış, lakin daha qısa olduğunu düşünəcəksiniz. Məsələ bundadır. Nginx və Haproxy konfiqurasiyası əl ilə redaktə üçün yaradılmışdır və göndərdi koddan nəsil üçün. Bütün konfiqurasiya aşağıda təsvir edilmişdir
Canary, b/g deploy və daha çox skriptlər adətən yalnız dinamik konfiqurasiyada həyata keçirilir. Mən demirəm ki, bunu statik şəkildə etmək olmaz, hamımız bunu edirik. Ancaq bunun üçün balanslaşdırıcılardan hər hansı birində qoltuqağacı taxmaq lazımdır göndərdi o cümlədən
Elçinin əvəzolunmaz olduğu vəzifələr:
- Mürəkkəb və dinamik sistemlərdə trafikin balanslaşdırılması. Xidmət şəbəkəsi buraya gəlir, lakin bu, mütləq tək deyil.
- Paylanmış izləmə funksiyasına, kompleks icazəyə və ya başqa bir şeyə ehtiyac göndərdi qutudan kənarda və ya rahat şəkildə həyata keçirilir, lakin nginx / haproxy-də lua və şübhəli plaginləri örtmək lazımdır.
Hər ikisi, lazım gələrsə, yüksək performans təmin etmək üçün.
Bu necə işləyir
Elçi ikili formatda yalnız docker şəkli kimi paylanır. Şəkildə artıq statik konfiqurasiya nümunəsi var. Ancaq biz yalnız strukturu anlamaqda maraqlıyıq.
envoy.yaml statik konfiqurasiya
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
Dinamik Konfiqurasiya
Hansı problemi həll etmək axtarırıq? Yük altında balanslaşdırıcı konfiqurasiyanı götürüb yenidən yükləyə bilməzsiniz, "kiçik" problemlər olacaq:
- Konfiqurasiyanın yoxlanılması.
Konfiqurasiya böyük ola bilər, çox böyük ola bilər, əgər hamısını birdən çox yükləsək, haradasa xəta olma ehtimalı artır.
- Uzunmüddətli əlaqələr.
Yeni dinləyicini işə salarkən, köhnə ilə işləyən bağlantılara diqqət yetirməlisiniz, əgər dəyişikliklər tez-tez baş verirsə və uzun ömürlü bağlantılar varsa, bir kompromis tapılmalı olacaq. Hey kubernetlər nginx-ə daxil olurlar.
- Aktiv yoxlamalar.
Əgər aktiv sağlamlıq yoxlamalarımız varsa, trafik göndərməzdən əvvəl onların hamısını yeni konfiqurasiyada iki dəfə yoxlamalıyıq. Çoxlu yuxarı axınlar varsa, bu, vaxt tələb edir. Hey haproxy.
Bu necə həll olunur göndərdiKonfiqurasiyanı model hovuzuna uyğun olaraq dinamik şəkildə yükləyərək, onu ayrı-ayrı hissələrə ayıra və dəyişməmiş hissəni yenidən işə salmaya bilərsiniz. Məsələn, yenidən işə salmaq baha başa gələn və nadir hallarda dəyişən dinləyici.
Konfiqurasiya göndərdi (yuxarıdakı fayldan) aşağıdakı obyektlərə malikdir:
- dinləyici - müəyyən bir ip / portda asılan dinləyici
- virtual host - domen adına görə virtual host
- marşrut - balanslaşdırma qaydası
- qrup — balanslaşdırma parametrləri olan yuxarı axınlar qrupu
- son nöqtə — yuxarı instansiya ünvanı
Bu obyektlərin hər biri və digərləri dinamik şəkildə doldurula bilər, bunun üçün konfiqurasiya konfiqurasiyanın alınacağı xidmətin ünvanını müəyyən edir. Xidmət REST və ya gRPC ola bilər, gRPC istifadəsinə üstünlük verilir.
Xidmətlər müvafiq olaraq adlanır: LDS, VHDS, RDS, CDS və EDS. Statik və dinamik konfiqurasiyanı birləşdirmək mümkündür, lakin məhdudiyyətlə dinamik resursun statikdə göstərilə bilməz.
Əksər tapşırıqlar üçün ADS (Aggregated Discovery Service) adlanan son üç xidməti həyata keçirmək kifayətdir.
Konfiqurasiya aşağıdakı formanı alır:
envoy.yaml dinamik konfiqurasiya
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
Başlanğıcda göndərdi bu konfiqurasiya ilə o, idarəetmə müstəvisinə qoşulacaq və RDS, CDS və EDS konfiqurasiyasını sorğulamağa çalışacaq. Qarşılıqlı təsir prosesi necə təsvir olunur
Qısa, göndərdi tələb olunan resursun növünü, qovşağın versiyasını və parametrlərini göstərən sorğu göndərir. Cavab olaraq resurs və versiyanı alır, əgər idarəetmə müstəvisindəki versiya dəyişməyibsə, cavab vermir.
4 qarşılıqlı əlaqə variantı var:
- Bütün növ resurslar üçün bir gRPC axını, resursun tam vəziyyəti göndərilir.
- Ayri-ayri veziyyetdedir.
- Bir axın, artımlı vəziyyət.
- Ayrı axınlar, artımlı vəziyyət.
Artan xDS sizə idarəetmə müstəvisi və arasında trafiki azaltmağa imkan verir göndərdi, bu böyük konfiqurasiyalar üçün doğrudur. Lakin bu, qarşılıqlı əlaqəni çətinləşdirir, sorğu abunəlikdən çıxmaq və abunə olmaq üçün resursların siyahısını ötürür.
Bizim nümunəmizdə ADS istifadə olunur - RDS, CDS, EDS və artımsız rejim üçün bir axın. Artan rejimi aktivləşdirmək üçün müəyyən etməlisiniz api_type: DELTA_GRPC
Sorğuda qovşaq parametrləri olduğundan, biz müxtəlif instansiyalar üçün idarəetmə müstəvisinə müxtəlif resurslar göndərə bilərik göndərdi, bu xidmət şəbəkəsi qurmaq üçün əlverişlidir.
İsti
Haqqında göndərdi işə salındıqda və ya idarəetmə müstəvisindən yeni konfiqurasiya qəbul edildikdə, resursun istiləşməsi prosesi başlayır. O, dinləyicinin istiləşməsinə və klasterin istiləşməsinə bölünür. Birincisi RDS/LDS-dəki dəyişikliklərlə, ikincisi isə CDS/EDS-də baş verən dəyişikliklərlə tetiklenir. Bu o deməkdir ki, yalnız yuxarı axınlar dəyişirsə, dinləyici yenidən yaradılmır.
İstiləşmə zamanı nəzarət müstəvisindən asılı resursların bir müddət gözlənildiyi gözlənilir. Taym-aut müddəti başa çatmışsa, işəsalma uğurlu olmayacaq, yeni dinləyici portda dinləməyə başlamayacaq.
Başlama qaydası: EDS, CDS, aktiv sağlamlıq yoxlaması, RDS, LDS. Aktiv sağlamlıq yoxlamaları aktiv olduqda, trafik yalnız bir uğurlu sağlamlıq yoxlanışından sonra yuxarı axın edəcək.
Dinləyici yenidən yaradılıbsa, köhnəsi DRAIN vəziyyətinə keçir və bütün bağlantılar bağlandıqdan və ya fasilə müddəti bitdikdən sonra silinəcək. --drain-time-s
, standart 10 dəqiqə.
Davam etmək.
Mənbə: www.habr.com