Üdvözlet! Ez egy rövid cikk, amely választ ad a kérdésekre: „mi az a küldött?”, „miért van rá szükség?” és "hol kezdjem?".
Mi ez
Az Envoy egy C++ nyelven írt L4-L7 balansz, amely a nagy teljesítményre és rendelkezésre állásra összpontosít. Egyrészt ez valamilyen módon az nginx és a haproxy analógja, teljesítményükben összehasonlítható velük. Másrészt inkább a mikroszolgáltatási architektúra felé orientálódik, és a funkcionalitása nem rosszabb, mint a java and go egyensúlyozók, mint például a zuul vagy a traefik.
Haproxy/nginx/envoy összehasonlító táblázata, nem állítja az abszolút igazságot, de általános képet ad.
nginx
haproxi
követ
traefik
csillagok a githubon
11.2k/tükör
1.1k/tükör
12.4k
27.6k
beírva
C
C
C + +
go
API
nincs
csak aljzat/tolható
adatsík/húzás
húzza
aktív egészségügyi vizsgálat
nincs
igen
igen
igen
Nyissa meg a nyomkövetést
külső plugin
nincs
igen
igen
J.W.T.
külső plugin
nincs
igen
nincs
kiterjesztés
Lua/C
Lua/C
Lua/C++
nincs
Miért
Ez egy fiatal projekt, sok minden hiányzik, néhány az alfa elején. De követ, szintén fiatalságának köszönhetően, gyorsan fejlődik, és máris számos érdekességgel rendelkezik: dinamikus konfiguráció, sok kész szűrő, egyszerű felület a saját szűrők írásához.
Ebből az alkalmazási területek következnek, de először is van 2 antiminta:
- Statikus visszarúgás.
A tény az, hogy jelenleg in követ nincs gyorsítótár támogatás. A Google srácok ezt próbálják
Egyelőre az nginx-et használd a statikához.
- Statikus konfiguráció.
Használhatod, de követ Nem erre hozták létre. A statikus konfigurációban lévő funkciók nem jelennek meg. Sok pillanat van:
Amikor yaml-ben szerkeszted a konfigurációt, tévedsz, szidni fogod a fejlesztőket a bőbeszédűségért, és úgy gondolod, hogy az nginx/haproxy konfigurációk, bár kevésbé strukturáltak, tömörebbek. Ez a lényeg. Az Nginx és a Haproxy konfigurációja kézzel szerkeszthető, és követ kódból való generáláshoz. A teljes konfiguráció leírása a
A Canary, a b/g telepítési forgatókönyvek és még sok más általában csak dinamikus konfigurációban valósul meg. Nem azt mondom, hogy ezt nem lehet statikusan megtenni, mindannyian ezt tesszük. De ehhez mankókat kell feltenni bármelyik kiegyensúlyozóba követ beleértve.
Feladatok, amelyekhez a Küldött nélkülözhetetlen:
- Forgalom kiegyenlítés összetett és dinamikus rendszerekben. Ez magában foglalja a szervizhálót is, de nem feltétlenül az egyetlen.
- Elosztott nyomkövetési funkciók, összetett engedélyezési vagy egyéb olyan funkciók iránti igény, amelyek elérhetők követ dobozból vagy kényelmesen megvalósítva, de az nginx/haproxy-ban lua-val és kétes bővítményekkel kell körülvenni.
Ha szükséges, mindkettő nagy teljesítményt biztosít.
Ez hogy működik
Az Envoy bináris fájlokban csak docker képként kerül terjesztésre. A kép már tartalmaz egy példát statikus konfigurációra. De minket csak a szerkezet megértése érdekel.
envoy.yaml statikus konfiguráció
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
Dinamikus konfiguráció
Milyen problémára keresünk megoldást? A terheléselosztó konfigurációját nem lehet csak úgy újratölteni terhelés alatt; „kis” problémák merülnek fel:
- Konfiguráció érvényesítése.
A konfig lehet nagy, lehet nagyon nagy, ha egyszerre túlterheljük, megnő az esélye, hogy valahol hiba lesz.
- Hosszú életű kapcsolatok.
Egy új hallgató inicializálása során ügyelni kell a régin futó kapcsolatokra, ha gyakran fordulnak elő változások és hosszú életű kapcsolatok vannak, akkor kompromisszumot kell keresni. Helló, kubernetes ingress az nginx-en.
- Aktív egészségügyi ellenőrzések.
Ha aktív állapotellenőrzéseink vannak, akkor az új konfigurációban mindegyiket duplán ellenőriznünk kell a forgalom elküldése előtt. Ha sok az upstream, ez időbe telik. Szia haproxy.
Hogyan van ez megoldva ben követA konfig dinamikus betöltésével, a pool modellnek megfelelően, külön részekre osztható, és nem inicializálható újra a nem változott rész. Például egy hallgató, amelynek újrainicializálása költséges és ritkán változik.
Configuration követ (a fenti fájlból) a következő entitásokkal rendelkezik:
- hallgató — egy adott ip/porton lógó hallgató
- virtuális gazdagép - virtuális gazdagép domain név szerint
- útvonal - egyensúlyozási szabály
- fürt — felfelé irányuló ágak csoportja kiegyenlítő paraméterekkel
- végpont — upstream példány címe
Ezen entitások mindegyike, valamint néhány másik dinamikusan kitölthető, ehhez a konfiguráció megadja annak a szolgáltatásnak a címét, ahonnan a konfiguráció érkezik. A szolgáltatás lehet REST vagy gRPC, a gRPC előnyösebb.
A szolgáltatások neve LDS, VHDS, RDS, CDS és EDS. Kombinálhatja a statikus és a dinamikus konfigurációt, azzal a korlátozással, hogy dinamikus erőforrás nem adható meg statikusban.
A legtöbb feladathoz elegendő az utolsó három szolgáltatás megvalósítása, ezek az úgynevezett ADS (Aggregated Discovery Service).
A konfiguráció a következő formában történik:
envoy.yaml dinamikus konfiguráció
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
Indításkor követ ezzel a konfigurációval csatlakozik a vezérlősíkhoz, és megpróbálja kérni az RDS, CDS és EDS konfigurációt. Le van írva, hogyan megy végbe az interakciós folyamat
Röviden, követ kérést küld, amely jelzi a kért erőforrás típusát, a csomópont verzióját és paramétereit. Válaszul egy erőforrást és egy verziót kap, ha a vezérlősíkon lévő verzió nem változott, nem válaszol.
4 interakciós lehetőség van:
- Egy gRPC adatfolyam minden típusú erőforráshoz, az erőforrás teljes állapota elküldésre kerül.
- Külön patakok, teljes állapotban.
- Egy folyam, növekményes állapot.
- Külön folyamok, növekményes állapot.
Az inkrementális xDS lehetővé teszi a forgalom csökkentését a vezérlősík és a követ, ez a nagy konfigurációkra vonatkozik. De ez bonyolítja az interakciót: a kérelem tartalmazza a leiratkozáshoz és előfizetéshez szükséges erőforrások listáját.
Példánk az ADS-t használja – egy adatfolyam az RDS, CDS, EDS és nem növekményes módhoz. A növekményes mód engedélyezéséhez meg kell adnia api_type: DELTA_GRPC
Mivel a kérés csomóponti paramétereket tartalmaz, a különböző példányokhoz különböző erőforrásokat küldhetünk a vezérlősíkra követ, ez kényelmes egy szervizháló felépítéséhez.
Bemelegít
tovább követ indításkor vagy új konfiguráció fogadásakor a vezérlősíktól elindul az erőforrás-bemelegítési folyamat. Fel van osztva hallgató bemelegítésre és fürt bemelegítésre. Az első az RDS/LDS változása esetén indul el, a második a CDS/EDS esetén. Ez azt jelenti, hogy ha csak az upstreamek változnak, a hallgató nem jön létre újra.
A bemelegítési folyamat során függő erőforrások várhatók a vezérlősíktól az időtúllépés alatt. Ha az időtúllépés bekövetkezik, az inicializálás nem lesz sikeres, és az új figyelő nem kezdi el a figyelést a porton.
Inicializálási sorrend: EDS, CDS, aktív állapotfelmérés, RDS, LDS. Ha az aktív állapotellenőrzések engedélyezve vannak, a forgalom csak egy sikeres állapotellenőrzés után fog felfelé haladni.
Ha a figyelőt újra létrehozták, a régi DRAIN állapotba kerül, és az összes kapcsolat bezárása vagy az időkorlát lejárta után törlődik. --drain-time-s
, alapértelmezett 10 perc.
Продолжение следует.
Forrás: will.com