Envoy Proxy, cloud-native uygulamalar için tasarlanmış, açık kaynaklı ve yüksek performanslı bir edge ve servis proxy'sidir; mikroservis mimarileri için evrensel bir data plane görevi görür. Ağ karmaşıklıklarını soyutlayarak dağıtık sistemler için gerekli olan gelişmiş trafik yönetimi, gözlemlenebilirlik ve güvenlik yeteneklerini sağlar.
Envoy, servisler arasındaki tüm ağ trafiği için şeffaf bir proxy olarak çalışır ve geliştiricilerin ile operatörlerin ağ meseleleri yerine uygulama mantığına odaklanmasına olanak tanır. Mimarisi modern mikroservis dağıtımları için kurgulanmıştır ve geleneksel proxy'lerin çoğu zaman sunmadığı ya da daha verimsiz uyguladığı özellikler sunar.
Temel mimari ilkeler
Envoy'un tasarımı performansı, genişletilebilirliği ve dinamik yapılandırmayı önceliklendirir. Tek süreçli, çok iş parçacıklı bir sunucu olarak çalışır ve yüksek hacimli eşzamanlı bağlantı ile istekleri verimli biçimde karşılamak için olay güdümlü I/O kullanır.
L3/L4 filtre mimarisi
Envoy, hem ağ (L3/L4) hem de uygulama (L7) katmanlarında takılabilir bir filtre zinciri mimarisi kullanır. Bu, ağ trafiğinin son derece özelleştirilebilir şekilde işlenmesini mümkün kılar.
* Ağ filtreleri: Ham bayt akışları üzerinde çalışır. Örnekler arasında TCP proxy, TLS sonlandırma ve bağlantı düzeyinde rate limiting yer alır.
* HTTP filtreleri: HTTP istekleri ve yanıtları üzerinde çalışır. Örnekler arasında Gzip sıkıştırma, request ID enjeksiyonu, JWT kimlik doğrulama ve gelişmiş yönlendirme bulunur.
Bu modülerlik, isteğin yaşam döngüsünün çeşitli aşamalarında gelişmiş politika uygulamasına ve trafik manipülasyonuna imkân verir.
Mikroservisler için öne çıkan özellikler
HTTP/2 ve gRPC desteği
Envoy, modern mikroservislerde temel protokoller olan HTTP/2 ve gRPC için birinci sınıf destek sunar. HTTP/1.1 istemcilerini HTTP/2 servislerine köprüleyebilir, HTTP/2 bağlantılarını sonlandırabilir ve gRPC farkındalıklı yük dengeleme ile yönlendirme gibi gelişmiş özellikler dahil olmak üzere gRPC proxy'lemesini kolaylaştırabilir.
Gelişmiş yük dengeleme
Envoy, basit round-robin'in ötesinde gelişmiş yük dengeleme algoritmalarından oluşan bir set sunar:
* Least Request: En az aktif isteği olan backend'e yönlendirir.
* Ring Hash: Daha iyi önbellek kullanımı ve sticky oturumlar için tutarlı hash'leme.
* Maglev (Power of Two Choices): Rastgele iki host seçer ve aktif isteği daha az olanı tercih eder; basitlik ile neredeyse optimal dağılımı dengeler.
* Random: Basit, yansız dağıtım için.
* Original Destination: Servis keşfi olmadan hedeflenen destinasyon IP'sine yönlendirir.
Ayrıca trafiğin yalnızca sağlıklı örneklere gönderilmesini güvence altına almak ve dayanıklılığı artırmak için otomatik yeniden denemeleri, circuit breaking'i, outlier tespitini ve health checking'i destekler.
Dinamik yapılandırma (xDS API)
Envoy'un cloud-native tasarımının köşe taşlarından biri, xDS (Discovery Service) API üzerinden sunduğu dinamik yapılandırma yetenekleridir. Statik yapılandırma dosyaları yerine Envoy, çeşitli kaynaklara ait güncellemeleri dinamik olarak alabilir:
* Listener Discovery Service (LDS): Listener'lar (Envoy'un bağlandığı portlar).
* Route Discovery Service (RDS): HTTP yönlendirme kuralları.
* Cluster Discovery Service (CDS): Upstream cluster'lar (backend servis grupları).
* Endpoint Discovery Service (EDS): Cluster'lar içindeki endpoint'ler (tekil örnekler).
* Secret Discovery Service (SDS): TLS sertifikaları ve özel anahtarlar.
* Runtime Discovery Service (RTDS): Dinamik runtime yapılandırma değerleri.
Bu, kesintisiz yapılandırma değişikliklerine olanak tanır; sürekli dağıtımı ve bu yapılandırmaları yöneten service mesh control plane'leriyle (örneğin Istio, App Mesh) entegrasyonu mümkün kılar.
Gözlemlenebilirlik
Envoy, gözlemlenebilirliği birinci sınıf bir unsur olarak ele alacak şekilde tasarlanmıştır ve ağ trafiğine dair derin içgörü sağlar:
* Ayrıntılı istatistikler: Bağlantıları, istekleri, hataları, gecikmeyi ve daha fazlasını kapsayan çok sayıda istatistik (upstream cluster başına 100'den fazla) üretir; bunlar Prometheus veya benzeri sistemlerce toplanabilir.
* Dağıtık tracing: Jaeger, Zipkin ve AWS X-Ray gibi yaygın tracing sistemlerini destekler; trace bağlamlarını (örneğin B3, W3C Trace Context) taşır ve her hop için span üretir.
* Erişim günlükleri: Her isteği header'lar, yanıt kodları ve zamanlama bilgileriyle birlikte ayrıntılandıran kapsamlı ve özelleştirilebilir erişim günlükleri.
Bu özellikler hata ayıklama, performans analizi ve dağıtık mikroservislerin izlenmesi için kritiktir.
Güvenlik özellikleri
Envoy, bu sorumlulukları çoğu zaman uygulama kodundan alarak güçlü güvenlik özellikleri sunar:
* TLS sonlandırma ve origination: TLS şifreleme/şifre çözme işlemini üstlenir; servislerin dahili olarak düz metin üzerinden haberleşmesine izin verirken dış iletişimi güvenli tutar.
* Mutual TLS (mTLS): İstemci sertifikalarını doğrulayarak mesh içindeki servisler arasında güvenli ve kimliği doğrulanmış iletişimi mümkün kılar.
* Rate limiting: Servisleri aşırı yük veya kötüye kullanıma karşı korumak için istek hızı limitleri uygular.
* Kimlik doğrulama ve yetkilendirme: External Authorization filtresi aracılığıyla harici yetkilendirme servisleriyle (örneğin OPA) entegre olur ve ayrıntılı erişim kontrolü sağlar.
Envoy'un mikroservis mimarilerindeki rolü
Sidecar proxy
Envoy'un mikroservis ortamındaki en yaygın dağıtım deseni sidecar proxy'dir. Bu modelde her servis örneği, tipik olarak Kubernetes'te aynı pod içinde olmak üzere yanında bir Envoy proxy çalıştırır. Servise ait tüm gelen ve giden ağ trafiği sidecar tarafından şeffaf biçimde yakalanır ve yönetilir.
Bu yaklaşımın çeşitli faydaları vardır:
* Ağ soyutlaması: Uygulama geliştiricileri localhost ile haberleşen servisler yazar; yönlendirme, yeniden deneme ve diğer ağ meselelerini Envoy sidecar üstlenir.
* Çoklu dil desteği: Farklı dillerde ve framework'lerde yazılmış servisler arasında tutarlı ağ politikaları ve özellikleri sağlar.
* İzolasyon: Ağ meseleleri iş mantığından ayrılır; geliştirme ve dağıtım basitleşir.
Service mesh data plane
Envoy, birçok yaygın service mesh uygulamasının (örneğin Istio, Linkerd, AWS App Mesh) fiili data plane'i olarak görev yapar. Bir service mesh'te control plane, Envoy proxy filosunu (data plane) yönetir ve yapılandırır. Control plane, mesh'teki tüm Envoy'ların yapılandırmasını dinamik olarak güncellemek için xDS API'yi kullanır; böylece trafik politikaları, güvenlik ve gözlemlenebilirlik tüm mikroservis ekosisteminde uygulanır.
Edge proxy / API gateway
Envoy, ağın kenarında API gateway veya ters proxy olarak da konumlandırılabilir. Bu rolde ingress trafiğini karşılar; kimlik doğrulama, rate limiting ve TLS sonlandırma işlemlerini gerçekleştirir ve istekleri mikroservis mimarisi içindeki uygun backend servislerine yönlendirir. Gelişmiş L7 yönlendirme yetenekleri, onu karmaşık edge yönlendirme gereksinimleri için uygun kılar.
Yapılandırma örneği
Temel bir Envoy yapılandırması listener'ları, filtre zincirlerini ve cluster'ları tanımlar. Bu örnek, 10000 portundaki bir listener'ın HTTP isteklerini web_service adlı upstream servis cluster'ına proxy'lediğini gösterir.
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: web_service
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: web_service
connect_timeout: 0.25s
type: LOGICAL_DNS
# v6 üzerinde test etmek için aşağıdaki satırı yoruma alın.
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: web_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: webserver.example.com # Kendi servisinizin gerçek hostname/IP değeriyle değiştirin
port_value: 80
Diğer proxy'lerle karşılaştırma
| Özellik | Envoy Proxy | Nginx | HAProxy |
|---|---|---|---|
| Birincil kullanım | Service mesh, sidecar, API gateway, edge | Web sunucusu, ters proxy, yük dengeleyici | Yüksek performanslı L4 yük dengeleyici, L7 |
| Mimari | Olay güdümlü, C++, yüksek modüler filtreler | Olay güdümlü, C, modül tabanlı | Olay güdümlü, C, yoğun optimize edilmiş |
| Dinamik yapılandırma | Tüm kaynaklar için tam xDS API | Config'i yeniden yükler (kesintili) veya ticari API | Sınırlı değişiklikler için runtime API, config reload |
| HTTP/2 ve gRPC | Birinci sınıf destek, gelişmiş özellikler | İyi destek | İyi destek |
| Gözlemlenebilirlik | Kapsamlı metrikler, tracing, erişim günlükleri | Temel metrikler, sınırlı tracing | Ayrıntılı istatistikler, temel günlükleme |
| Yük dengeleme | Gelişmiş L7 (tutarlı hash, Maglev), L4 | Temel L7 (round-robin, least conn), L4 | Gelişmiş L4, kısmen L7 (least conn, source) |
| Servis keşfi | xDS, DNS ve statik ile entegre | DNS, statik, bazı ticari entegrasyonlar | DNS, statik, bazı ticari entegrasyonlar |
| Circuit breaking | Evet | Hayır (harici mantık gerekir) | Evet |
| Outlier tespiti | Evet | Hayır (harici mantık gerekir) | Hayır (harici mantık gerekir) |
| Service mesh rolü | Data plane (birincil tercih) | Bu rol için tasarlanmadı | Bu rol için tasarlanmadı |
| Genişletilebilirlik | C++ filtreleri, WASM uzantıları | Lua betikleme, C modülleri | Lua betikleme, C modülleri |
Pratik değerlendirmeler
Performans ayarı
Envoy kutudan çıktığı haliyle yüksek performanslıdır, ancak belirli dağıtımlar ince ayardan fayda görebilir. Başlıca alanlar:
* İş parçacığı yapılandırması: Worker thread sayısını CPU çekirdek sayısına göre ayarlamak.
* Buffer yönetimi: Okuma/yazma buffer boyutlarını optimize etmek.
* Bağlantı havuzu boyutlandırma: Upstream cluster'lara yönelik maksimum bağlantı ve bağlantı başına istek sayısını yapılandırmak.
Kaynak tüketimi
Verimli olmasına rağmen her servis örneği için bir Envoy sidecar çalıştırmak toplam kaynak tüketimini (CPU, bellek) artırır. Bu ödünleşim, service mesh'in sağladığı operasyonel faydalar karşısında genellikle kabul edilebilirdir. Büyük dağıtımlarda kaynak kullanımının dikkatle izlenmesi kritiktir.
Hata ayıklama
Envoy, değerli hata ayıklama endpoint'leri sunan bir yönetim arayüzü (tipik olarak 15000 portunda) sağlar:
* /stats: Güncel istatistikler.
* /config_dump: Hâlihazırda etkin olan yapılandırmayı döker.
* /clusters: Upstream cluster'ların durumu.
* /hot_restart: Sorunsuz bir hot restart başlatır.
Bu endpoint'ler yapılandırma sorunlarını gidermek, sağlığı izlemek ve trafik akışını anlamak için son derece yararlıdır.
