ΠΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡ! ΠΡΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ ΡΡΠ°ΡΡΡ, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ°Ρ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ: "ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ envoy?", "Π·Π°ΡΠ΅ΠΌ ΠΎΠ½ Π½ΡΠΆΠ΅Π½?" ΠΈ "Ρ ΡΠ΅Π³ΠΎ Π½Π°ΡΠ°ΡΡ?".
Π§ΡΠΎ ΡΡΠΎ
Envoy β ΡΡΠΎ L4-L7 Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° Π‘++, ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° Π²ΡΡΠΎΠΊΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ. Π‘ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΡΡΠΎ Π² Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΠ΄Π΅ Π°Π½Π°Π»ΠΎΠ³ nginx ΠΈ haproxy, ΡΠΎΠΈΠ·ΠΌΠ΅ΡΠΈΠΌΡΠΉ Ρ Π½ΠΈΠΌΠΈ ΠΏΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ, ΠΎΠ½ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡΠ½ΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ Π½Π΅ Ρ ΡΠΆΠ΅ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΎΠ² Π½Π° java ΠΈ go, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ zuul ΠΈΠ»ΠΈ traefik.
Π’Π°Π±Π»ΠΈΡΠ° ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ haproxy/nginx/envoy, ΠΎΠ½Π° Π½Π΅ ΠΏΡΠ΅ΡΠ΅Π½Π΄ΡΠ΅Ρ Π½Π° Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΡ ΠΈΡΡΠΈΠ½Ρ, Π½ΠΎ Π΄Π°Π΅Ρ ΠΎΠ±ΡΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ.
nginx
haproxy
envoy
traefik
Π·Π²Π΅Π·Π΄ Π½Π° github
11.2k/mirror
1.1k/mirror
12.4k
27.6k
Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π°
C
C
C++
go
API
Π½Π΅Ρ
socket only/push
dataplane/pull
pull
active healthcheck
Π½Π΅Ρ
Π΄Π°
Π΄Π°
Π΄Π°
Open tracing
Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½
Π½Π΅Ρ
Π΄Π°
Π΄Π°
JWT
Π²Π½Π΅ΡΠ½ΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½
Π½Π΅Ρ
Π΄Π°
Π½Π΅Ρ
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅
Lua/C
Lua/C
Lua/C++
Π½Π΅Ρ
ΠΠ°ΡΠ΅ΠΌ
ΠΡΠΎ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠΉ ΠΏΡΠΎΠ΅ΠΊΡ, Π² Π½Π΅ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΎ Π½Π΅Ρ, ΡΡΠΎ-ΡΠΎ Π² ΡΠ°Π½Π½Π΅ΠΉ Π°Π»ΡΡΠ΅. ΠΠΎ envoy, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ Π·Π° ΡΡΠ΅Ρ ΠΌΠΎΠ»ΠΎΠ΄ΠΎΡΡΠΈ, Π±ΡΡΡΡΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ ΠΈ ΡΠΆΠ΅ ΡΠ΅ΠΉΡΠ°Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ: Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΡΠΎΠ²ΡΡ
ΡΠΈΠ»ΡΡΡΠΎΠ², ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ²ΠΎΠΈΡ
ΡΠΈΠ»ΡΡΡΠΎΠ².
ΠΠ· ΡΡΠΎΠ³ΠΎ Π²ΡΡΠ΅ΠΊΠ°ΡΡ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ, Π½ΠΎ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° 2 Π°Π½ΡΠΈΠΏΠ°ΡΡΠ΅ΡΠ½Π°:
- ΠΡΠ΄Π°ΡΠ° ΡΡΠ°ΡΠΈΠΊΠΈ.
ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π² envoy Π½Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ. Π Π΅Π±ΡΡΠ° ΠΈΠ· google ΠΏΡΡΠ°ΡΡΡΡ ΡΡΠΎ
Π ΠΏΠΎΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΄Π»Ρ ΡΡΠ°ΡΠΈΠΊΠΈ nginx.
- Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
ΠΠΎΠΆΠ½ΠΎ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π½ΠΎ envoy Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ Π½Π΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠ°ΡΠΊΡΡΡΡ. ΠΠΎΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ:
Π Π΅Π΄Π°ΠΊΡΠΈΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² yaml, ΠΡ Π±ΡΠ΄Π΅ΡΠ΅ ΠΎΡΠΈΠ±Π°ΡΡΡΡ, ΠΌΠ°ΡΠ΅ΡΠΈΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π·Π° ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΠΎΡΡΡ ΠΈ Π΄ΡΠΌΠ°ΡΡ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ nginx/haproxy, ΠΏΡΡΡΡ ΠΌΠ΅Π½Π΅Π΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Ρ, Π½ΠΎ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½Π΅Π΅. Π ΡΡΠΎΠΌ ΠΈ ΡΡΡΡ. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Nginx ΠΈ Haproxy ΡΠΎΠ·Π΄Π°Π²Π°Π»Π°ΡΡ ΠΏΠΎΠ΄ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΊΠ°ΠΌΠΈ, Π° Ρ envoy ΠΏΠΎΠ΄ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΠ· ΠΊΠΎΠ΄Π°. ΠΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΠΏΠΈΡΠ°Π½Π° Π²
Π‘ΡΠ΅Π½Π°ΡΠΈΠΈ canary, b/g Π΄Π΅ΠΏΠ»ΠΎΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ΅, Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. Π― Π½Π΅ Π³ΠΎΠ²ΠΎΡΡ ΡΡΠΎ ΡΡΠΎ Π½Π΅Π»ΡΠ·Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π² ΡΡΠ°ΡΠΈΠΊΠ΅, ΠΌΡ Π²ΡΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΠΌ. ΠΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π»ΠΎΠΆΠΈΡΡΡΡ ΠΊΠΎΡΡΡΠ»ΡΠΌΠΈ, Π² Π»ΡΠ±ΠΎΠΌ ΠΈΠ· Π±Π°Π»Π°Π½ΡΠ΅ΡΠΎΠ², Π² envoy Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅.
ΠΠ°Π΄Π°ΡΠΈ Π² ΠΊΠΎΡΠΎΡΡΡ Envoy Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌ:
- ΠΠ°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ°ΡΠΈΠΊΠ° Π² ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ . Π‘ΡΠ΄Π° ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ service mesh, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½.
- ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ, ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ, ΠΊΠΎΡΠΎΡΡΠΉ Π΅ΡΡΡ Π² envoy ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°Π΅ΡΡΡ, Π° Π² nginx/haproxy Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π»ΠΎΠΆΠΈΡΡΡΡ lua ΠΈ ΡΠΎΠΌΠ½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ.
Π ΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΎΠ΅ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π²ΡΡΠΎΠΊΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Envoy ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ Π² Π±ΠΈΠ½Π°ΡΠ½ΠΈΠΊΠ°Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊ docker ΠΎΠ±ΡΠ°Π·. Π ΠΎΠ±ΡΠ°Π·Π΅ ΡΠΆΠ΅ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΠΎ Π½Π°ΠΌ ΠΎΠ½ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΡ.
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
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΡ ΠΈΡΠ΅ΠΌ? ΠΠ΅Π»ΡΠ·Ρ ΠΏΡΠΎΡΡΠΎ ΡΠ°ΠΊ Π²Π·ΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΏΠΎΠ΄ Π½Π°Π³ΡΡΠ·ΠΊΠΎΠΉ, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡ "Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅" ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
ΠΠΎΠ½ΡΠΈΠ³ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ°Π΅ΠΌ Π΅Π³ΠΎ Π²Π΅ΡΡ ΡΠ°Π·ΠΎΠΌ, ΡΠ°Π½ΡΡ ΡΡΠΎ Π³Π΄Π΅-ΡΠΎ ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·ΡΠ°ΡΡΠ°ΡΡ.
- ΠΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ.
ΠΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π»ΠΈΡΡΠ΅Π½Π΅ΡΠ°, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Π½Π° ΡΡΠ°ΡΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ ΡΠ°ΡΡΠΎ ΠΈ Π΅ΡΡΡ Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡΡΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΊΠ°ΡΡ ΠΊΠΎΠΌΠΏΡΠΎΠΌΠΈΡΡ. ΠΡΠΈΠ²Π΅Ρ, kubernetes ingress Π½Π° nginx.
- ΠΠΊΡΠΈΠ²Π½ΡΠ΅ Ρ Π΅Π»ΡΡΠ΅ΠΊΠΈ.
ΠΡΠ»ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ Π°ΠΊΡΠΈΠ²Π½ΡΠ΅ Ρ Π΅Π»ΡΡΠ΅ΠΊΠΈ, Π½Π°Π΄ΠΎ Π±Ρ ΠΈΡ Π²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ½ΡΠΈΠ³Π΅ Π΄ΠΎ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡΠ»Π°ΡΡ ΡΡΠ°ΡΠΈΠΊ. ΠΡΠ»ΠΈ Π°ΠΏΡΡΡΠΈΠΌΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΡΠ΅ΠΌΡ. ΠΡΠΈΠ²Π΅Ρ, haproxy.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ΅ΡΠ°Π΅ΡΡΡ Π² envoy, ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ, ΠΏΠΎ ΠΏΡΠ» ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΌΠ΅Π½ΡΠ»Π°ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ Π»ΠΈΡΡΠ΅Π½Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΡΠΎΠ³ΠΎ, Π° ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΎΠ½ ΡΠ΅Π΄ΠΊΠΎ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ envoy (ΠΈΠ· ΡΠ°ΠΉΠ»Π° Π²ΡΡΠ΅) ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ:
- listener β Π»ΠΈΡΡΠ΅Π½Π΅Ρ Π²ΠΈΡΡΡΠΈΠΉ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ip/ΠΏΠΎΡΡΡ
- virtual host β Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΉ Ρ ΠΎΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π΄ΠΎΠΌΠ΅Π½Π°
- route β ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΈ
- cluster β Π³ΡΡΠΏΠΏΠ° Π°ΠΏΡΡΡΠΈΠΌΠΎΠ² Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΠΊΠΈ
- endpoint β Π°Π΄ΡΠ΅Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠ° Π°ΠΏΡΡΡΠΈΠΌΠ°
ΠΠ°ΠΆΠ΄ΡΡ ΠΈΠ· ΡΡΠΈΡ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΠ»ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΎΡ ΠΊΡΠ΄Π° Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΊΠΎΠ½ΡΠΈΠ³. Π‘Π΅ΡΠ²ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ REST Π»ΠΈΠ±ΠΎ gRPC, ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ gRPC.
Π‘Π΅ΡΠ²ΠΈΡΡ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ: LDS, VHDS, RDS, CDS ΠΈ EDS. ΠΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΡΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ΅ΡΡΡΡ Π½Π΅Π»ΡΠ·Ρ ΡΠΊΠ°Π·Π°ΡΡ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ.
ΠΠ»Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° Π·Π°Π΄Π°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΡΡΠΈ ΡΠ΅ΡΠ²ΠΈΡΠ°, ΠΎΠ½ΠΈ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ADS (Aggregated Discovery Service), Π΄Π»Ρ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠΎΠ±ΡΠ΅ΡΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄:
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
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ envoy Ρ ΡΡΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠΌ, ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡ ΠΊ control-plane ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ RDS, CDS ΠΈ EDS. ΠΠ°ΠΊ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΎΠΏΠΈΡΠ°Π½ΠΎ
ΠΡΠ»ΠΈ ΠΊΡΠ°ΡΠΊΠΎ, envoy ΡΠ»Π΅Ρ Π·Π°ΠΏΡΠΎΡ, Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠ° Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ°, Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Π½ΠΎΠ΄Ρ. Π ΠΎΡΠ²Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΡΠ΅ΡΡΡΡ ΠΈ Π²Π΅ΡΡΠΈΡ, Π΅ΡΠ»ΠΈ Π½Π° control-plane Π²Π΅ΡΡΠΈΡ Π½Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΠ»Π°ΡΡ, ΠΎΠ½ Π½Π΅ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ.
ΠΡΡΡ 4 Π²Π°ΡΠΈΠ°Π½ΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ:
- ΠΠ΄ΠΈΠ½ gRPC ΡΡΡΠΈΠΌ Π½Π° Π²ΡΠ΅ ΡΠΈΠΏΡ ΡΠ΅ΡΡΡΡΠΎΠ², ΠΏΡΠΈΡΡΠ»Π°Π΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠ°.
- Π Π°Π·Π΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΡΠΈΠΌΡ, ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
- ΠΠ΄ΠΈΠ½ ΡΡΡΠΈΠΌ, ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
- Π Π°Π·Π΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΡΠΈΠΌΡ, ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
Incremental xDS ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΡΠ°ΡΠΈΠΊ ΠΌΠ΅ΠΆΠ΄Ρ control-plane ΠΈ envoy, ΡΡΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ. ΠΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, Π² Π·Π°ΠΏΡΠΎΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅ΡΡΡΡΠΎΠ² Π΄Π»Ρ ΠΎΡΠΏΠΈΡΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ.
Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ADS β ΠΎΠ΄ΠΈΠ½ ΡΡΡΠΈΠΌ Π΄Π»Ρ RDS, CDS, EDS ΠΈ Π½Π΅ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ. ΠΠ»Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°, Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ api_type: DELTA_GRPC
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π΅ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½ΠΎΠ΄Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π° control-plane ΠΏΡΠΈΡΡΠ»Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΎΠ² envoy, ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ service mesh.
Warmup
ΠΠ° envoy ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΡ control-plane Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ warmup ΡΠ΅ΡΡΡΡΠΎΠ². ΠΠ½ ΡΠ°Π·Π΄Π΅Π»Π΅Π½, Π½Π° listener warmup ΠΈ cluster warmup. ΠΠ΅ΡΠ²ΡΠΉ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ Π² RDS/LDS, Π²ΡΠΎΡΠΎΠΉ ΠΏΡΠΈ CDS/EDS. ΠΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΌΠ΅Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π°ΠΏΡΡΡΠΈΠΌΡ, Π»ΠΈΡΡΠ΅Π½Π΅Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ.
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ΅Π²Π°, ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΡΠ΅ΡΡΡΡΡ ΠΎΡ control-plane Π² ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡΠ°. ΠΡΠ»ΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡ Π²ΡΡΠ΅Π», ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ, Π½ΠΎΠ²ΡΠΉ Π»ΠΈΡΡΠ΅Π½Π΅Ρ Π½Π΅ Π½Π°ΡΠ½Π΅Ρ ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΡΡ.
ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ: EDS, CDS, active health check, RDS, LDS. ΠΡΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Π½ΡΡ
Π°ΠΊΡΠΈΠ²Π½ΡΡ
Ρ
Π΅Π»ΡΡΠ΅ΠΊΠ°Ρ
, ΡΡΠ°ΡΠΈΠΊ ΠΏΠΎΠΉΠ΄Π΅Ρ Π½Π° Π°ΠΏΡΡΡΠΈΠΌ, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Ρ
Π΅Π»ΡΡΠ΅ΠΊΠ°.
ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π²Π°Π»ΡΡ Π»ΠΈΡΡΠ΅Π½Π΅Ρ, ΡΡΠ°ΡΡΠΉ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ DRAIN, ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΊΡΡΡΠΈΡ Π²ΡΠ΅Ρ
ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡΠ° --drain-time-s
, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 10 ΠΌΠΈΠ½ΡΡ.
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com