Pozdravy! Toto je krátký článek, který odpovídá na otázky: "co je vyslanec?", "proč je to potřeba?" a "kde začít?".
Co je to
Envoy je L4-L7 balancer napsaný v C++, zaměřený na vysoký výkon a dostupnost. Na jedné straně je to nějakým způsobem analog nginx a haproxy, srovnatelný s nimi ve výkonu. Na druhou stranu je více orientován na architekturu mikroslužeb a má funkčnost o nic horší než balancéry java and go, jako je zuul nebo traefik.
Srovnávací tabulka haproxy/nginx/envoy, netvrdí, že je to absolutní pravda, ale dává obecný obrázek.
Nginx
haproxy
odesláno
traefik
hvězdy na githubu
11.2k/zrcadlo
1.1k/zrcadlo
12.4
27.6
zapsáno v
C
C
C + +
go
API
ne
pouze zásuvka/tlač
dataplane/pull
táhnout
aktivní zdravotní prohlídka
ne
ano
ano
ano
Otevřené trasování
externí plugin
ne
ano
ano
JWT
externí plugin
ne
ano
ne
prodloužení
Lua/C
Lua/C
Lua/C++
ne
Proč
Toto je mladý projekt, spousta věcí chybí, některé jsou v rané alfě. Ale odesláno, i díky svému mládí, se rychle vyvíjí a má již mnoho zajímavých funkcí: dynamickou konfiguraci, mnoho hotových filtrů, jednoduché rozhraní pro psaní vlastních filtrů.
Z toho vyplývají oblasti použití, ale nejprve existují 2 antivzory:
- Statický zpětný ráz.
Faktem je, že v tuto chvíli v odesláno žádná podpora mezipaměti. Kluci z Googlu to zkouší
Pro statiku zatím používejte nginx.
- Statická konfigurace.
Můžete to použít, ale odesláno K tomu to nebylo stvořeno. Prvky ve statické konfiguraci nebudou vystaveny. Momentů je mnoho:
Při úpravě konfigurace v yaml se budete mýlit, nadávat vývojářům za upovídanost a myslet si, že konfigurace nginx/haproxy, i když jsou méně strukturované, jsou stručnější. O to tu jde. Konfigurace Nginx a Haproxy byla vytvořena pro ruční úpravy a odesláno pro generování z kódu. Celá konfigurace je popsána v
Scénáře nasazení Canary, b/g a mnohé další jsou běžně implementovány pouze v dynamické konfiguraci. Neříkám, že to nejde udělat staticky, děláme to všichni. Ale k tomu je třeba nasadit berle, v kterémkoli z balancérů odesláno včetně.
Úkoly, pro které je Envoy nepostradatelný:
- Vyvažování dopravy ve složitých a dynamických systémech. To zahrnuje síť služeb, ale není nutně jediná.
- Potřeba distribuované funkce trasování, komplexní autorizace nebo jiné funkce, která je k dispozici v odesláno po vybalení nebo pohodlně implementované, ale v nginx/haproxy musíte být obklopeni lua a pochybnými pluginy.
Oba v případě potřeby poskytují vysoký výkon.
Jak to funguje
Envoy je distribuován v binárních souborech pouze jako docker image. Obrázek již obsahuje příklad statické konfigurace. Nás to ale zajímá jen pro pochopení struktury.
statická konfigurace envoy.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
Dynamická konfigurace
Na jaký problém hledáme řešení? Nemůžete jen znovu načíst konfiguraci load balanceru pod zatížením, objeví se „malé“ problémy:
- Ověření konfigurace.
Konfigurace může být velká, může být velmi velká, pokud ji přetížíme najednou, zvyšuje se šance, že někde dojde k chybě.
- Dlouhotrvající spojení.
Při inicializaci nového posluchače je třeba se postarat o připojení běžící na starém, pokud ke změnám dochází často a existují dlouhodobá připojení, budete muset hledat kompromis. Dobrý den, kubernetes ingress na nginx.
- Aktivní zdravotní kontroly.
Pokud máme aktivní kontroly stavu, musíme je všechny znovu zkontrolovat v nové konfiguraci před odesláním provozu. Pokud je proti proudu hodně, trvá to. Ahoj haproxy.
Jak je toto řešeno v odeslánoDynamickým načítáním konfigurace podle modelu fondu ji můžete rozdělit na samostatné části a nereinicializovat tu část, která se nezměnila. Například posluchač, jehož reinicializace je nákladná a málokdy se mění.
Konfigurace odesláno (ze souboru výše) má následující entity:
- posluchač — posluchač visící na konkrétní IP/portu
- virtuální hostitel - virtuální hostitel podle názvu domény
- trasa - vyrovnávací pravidlo
- shluk — skupina upstreamů s vyvažovacími parametry
- Koncový bod — upstream adresa instance
Každá z těchto entit a některé další mohou být vyplněny dynamicky, k tomu konfigurace specifikuje adresu služby, odkud bude konfigurace přijata. Služba může být REST nebo gRPC, výhodnější je gRPC.
Služby jsou pojmenovány v tomto pořadí: LDS, VHDS, RDS, CDS a EDS. Můžete kombinovat statickou a dynamickou konfiguraci s omezením, že dynamický prostředek nelze zadat ve statickém.
Pro většinu úloh stačí implementovat poslední tři služby, které se nazývají ADS (Aggregated Discovery Service), např.
Konfigurace má následující podobu:
dynamická konfigurace envoy.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
Při spuštění odesláno s touto konfigurací se připojí k řídicí rovině a pokusí se požádat o konfiguraci RDS, CDS a EDS. Je popsáno, jak probíhá proces interakce
Ve zkratce, odesláno odešle požadavek označující typ požadovaného zdroje, verzi a parametry uzlu. Jako odpověď obdrží zdroj a verzi; pokud se verze v řídicí rovině nezměnila, nereaguje.
Existují 4 možnosti interakce:
- Jeden gRPC stream pro všechny typy zdrojů, je odeslán úplný stav zdroje.
- Samostatné proudy, plný stav.
- Jeden proud, přírůstkový stav.
- Samostatné proudy, inkrementální stav.
Inkrementální xDS umožňuje snížit provoz mezi řídicí rovinou a odesláno, to platí pro velké konfigurace. To ale komplikuje interakci, požadavek obsahuje seznam zdrojů pro odhlášení a přihlášení.
Náš příklad používá ADS - jeden stream pro RDS, CDS, EDS a neinkrementální režim. Chcete-li povolit přírůstkový režim, musíte zadat api_type: DELTA_GRPC
Protože požadavek obsahuje parametry uzlů, můžeme do řídicí roviny poslat různé zdroje pro různé instance odesláno, je to vhodné pro vytvoření servisní sítě.
Zahřát se
Na odesláno při spuštění nebo při přijetí nové konfigurace z řídicí roviny se spustí proces zahřívání prostředků. Dělí se na zahřívání posluchače a zahřívání clusteru. První se spustí, když dojde ke změnám v RDS/LDS, druhý při CDS/EDS. To znamená, že pokud se změní pouze upstream, posluchač nebude znovu vytvořen.
Během procesu zahřívání jsou během časového limitu očekávány závislé zdroje z řídicí roviny. Pokud dojde k vypršení časového limitu, inicializace nebude úspěšná a nový posluchač nezačne na portu naslouchat.
Pořadí inicializace: EDS, CDS, aktivní kontrola stavu, RDS, LDS. Když jsou aktivní kontroly stavu povoleny, provoz půjde proti proudu pouze po jedné úspěšné kontrole stavu.
Pokud byl posluchač znovu vytvořen, starý přejde do stavu DRAIN a bude odstraněn po uzavření všech připojení nebo vypršení časového limitu. --drain-time-s
, výchozí 10 minut.
Je třeba pokračovat.
Zdroj: www.habr.com