Hizmet Ağı: Istio ve Linkerd, mTLS ve Trafik Yönetimi
Kubernetes'teki bir mikro hizmet mimarisinde her hizmet, düzinelerce başka hizmetle iletişim kurar. Bu iletişimlerin şifrelendiğini kim garanti ediyor? Otomatik yeniden denemeyi ne zaman kim yönetir? Bir hizmete geçici olarak erişilemiyor mu? Gecikme ve oran ölçümlerini kim sağlıyor? Her kaynak-hedef çifti için hata oranı nedir? Servis ağı olmadan bunları yanıtlayın sorular her hizmette özel kod gerektirir.
Un servis ağı bu sorunları altyapı düzeyinde çözer, uygulamaya şeffaf. Kubernetes ortamındaki iki baskın oyuncu: Istio, en zengin özellikli ve Linkerd, basitlik ve minimum yük için tasarlanmıştır. Bu makalede nasıl kurulacağı gösterilmektedir her ikisi de otomatik mTLS'yi yapılandırır, canary dağıtımıyla trafiği yönetir ve devrenin kesilmesi ve ne zaman birinin veya diğerinin seçileceği.
Ne Öğreneceksiniz
- Hizmet ağı nasıl çalışır: veri düzlemi (sepet) ve kontrol düzlemi
- Otomatik mTLS: ne anlama gelir, nasıl kontrol edilir, istisnalar nasıl ele alınır
- Istio: kurulum, VirtualService, DestinationRule, kanarya ve mavi/yeşil
- Linkerd: hafif kurulum, SMI TrafficSplit, uzantılar
- Istio OutlierDetection ile devre kesme
- Altyapı düzeyinde yeniden deneme ve zaman aşımı
- Gözlemlenebilirlik: hizmet ağından altın sinyal ölçümleri
- Istio ve Linkerd: hangisi ne zaman seçilir
Hizmet Ağı Nasıl Çalışır?
Servis ağı, bir sistemin otomatik enjeksiyonuna dayanmaktadır. sepet vekili (Istio Elçisi, Linkerd için Linkerd2-vekili). Sepet her şeyi engelliyor değişiklik gerektirmeden uygulama konteynerine giren ve çıkan trafik koda.
Il veri düzlemi ve trafiği idare eden tüm proxy sepetleri seti etkili. kontrol düzlemi (Istio için Istiod, Linkerd için linkerd-kontrol düzlemi) Yapılandırmayı proxy'lere dağıtır, mTLS için sertifikaları yönetir ve telemetri toplar.
Istio ve Linkerd karşılaştırması
| karakteristik | Istio | Linkerd |
|---|---|---|
| Sepet proxy'si | Elçi (C++, 50-100 MB) | linkerd2-proxy (Rust, 10-20 MB) |
| Pod için bellek yükü | 100-200MB | 20-30 MB |
| Gecikme yükü P99 | 2-5 ms | 0,5-1ms |
| Otomatik mTLS | Evet (sertifika yöneticisi veya yerleşik) | Evet (24 saat otomatik rotasyon) |
| Trafik yönetimi | Tam (Sanal Hizmet, DR) | Temel (HTTPRoute, TrafficSplit) |
| L7 politikası | HTTP, gRPC, TCP | HTTP, gRPC |
| Giriş | API Ağ Geçidi + Istio Ağ Geçidi | API Ağ Geçidi |
| Öğrenme eğrisi | Dik | Ilıman |
| Üretim olgunluğu | Yüksek (Google, Airbnb) | Yüksek (Shopify, Microsoft) |
Istio: Temel Kurulum ve Yapılandırma
istioctl ile kurulum
# Scarica e installa istioctl
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.22.0 sh -
export PATH=$PWD/istio-1.22.0/bin:$PATH
# Installa Istio con profilo di produzione
istioctl install --set profile=production -y
# Il profilo production abilita:
# - HA con multiple repliche del control plane
# - Affinity rules per distribuire su nodi diversi
# - Risorse CPU/memoria adeguate
# - Solo le feature necessarie (no addon come Kiali, Jaeger)
# Abilita l'iniezione automatica del sidecar nel namespace
kubectl label namespace production istio-injection=enabled
# Verifica lo stato del mesh
istioctl proxy-status
# Analizza la configurazione per possibili problemi
istioctl analyze --namespace production
Istio ile mTLS: PeerAuthentication ve DestinationRule
Istio, enjekte edilen tüm sepet Pod'ları arasında otomatik mTLS uygular. ile Eş Kimlik Doğrulaması mTLS aracılığıyla yapılabilir SIKI (gerekli) bir ad alanı veya tüm ağ düzeyi:
# mtls-strict.yaml
# Abilita mTLS STRICT per tutto il namespace production
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default-mtls
namespace: production
spec:
mtls:
mode: STRICT # DISABLE, PERMISSIVE, STRICT
---
# Eccezione: un servizio legacy che non ha sidecar
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: legacy-service-exception
namespace: production
spec:
selector:
matchLabels:
app: legacy-service
mtls:
mode: PERMISSIVE # accetta anche connessioni plain-text
# Verifica mTLS
kubectl exec -n production frontend-pod -c istio-proxy -- \
pilot-agent request GET /config_dump | grep -A5 "tls_context"
# Visualizza lo stato mTLS con istioctl
istioctl x describe pod frontend-pod.production
VirtualService: Yönlendirme ve Trafik Bölme
VirtualService, bir hizmete giden trafiğin nasıl yönlendirileceğini tanımlar. HTTP başlıklarına, ağırlıklara ve yol eşleşmesine dayalı kurallarla:
# virtual-service-canary.yaml
# Canary deployment: 90% traffico a v1, 10% a v2
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: api-service-vs
namespace: production
spec:
hosts:
- api-service # nome del Kubernetes Service
http:
# Routing per header: dev e QA ricevono sempre v2
- match:
- headers:
x-user-group:
exact: "beta-testers"
route:
- destination:
host: api-service
subset: v2
# Traffico generale: 90/10 split
- route:
- destination:
host: api-service
subset: v1
weight: 90
- destination:
host: api-service
subset: v2
weight: 10
# Timeout e retry a livello di infrastruttura
timeout: 5s
retries:
attempts: 3
perTryTimeout: 2s
retryOn: "5xx,reset,connect-failure,retriable-4xx"
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: api-service-dr
namespace: production
spec:
host: api-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http2MaxRequests: 1000
maxRequestsPerConnection: 10
loadBalancer:
simple: LEAST_CONN # ROUND_ROBIN, RANDOM, LEAST_CONN
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
Aykırı Değer Algılamalı Devre Kesici
Devre kesici, "sağlıksız" ana bilgisayarları geçici olarak yük dengelemeden kaldırır tanımlanmış hata eşiklerini aştıklarında havuz:
# destination-rule-circuit-breaker.yaml
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: payment-service-circuit-breaker
namespace: production
spec:
host: payment-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 50
connectTimeout: 3s
http:
http1MaxPendingRequests: 100
http2MaxRequests: 500
maxRetries: 3
outlierDetection:
# Rimuovi un host se in 10 secondi riceve 5 errori 5xx
consecutiveGatewayErrors: 5
consecutive5xxErrors: 5
interval: 10s
# Tienilo fuori per 30 secondi
baseEjectionTime: 30s
# Massimo 50% degli host puo essere rimosso
maxEjectionPercent: 50
# Analizza solo richieste con 100ms o piu di latenza
minHealthPercent: 50
Giriş Trafiği için Istio Ağ Geçidi
# istio-gateway.yaml
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
name: production-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: wildcard-tls-cert # Secret con cert TLS
hosts:
- "*.federicocalo.dev"
- port:
number: 80
name: http
protocol: HTTP
tls:
httpsRedirect: true # redirect tutto HTTP a HTTPS
hosts:
- "*.federicocalo.dev"
---
# Collega il Gateway al VirtualService
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: api-gateway-vs
namespace: production
spec:
hosts:
- "api.federicocalo.dev"
gateways:
- istio-system/production-gateway
- mesh # anche per traffico interno al mesh
http:
- route:
- destination:
host: api-service
port:
number: 8080
Yetkilendirme Politikası: Erişim Kontrolü
# authorization-policy.yaml
# Solo il frontend puo chiamare il backend
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: backend-access-policy
namespace: production
spec:
selector:
matchLabels:
app: backend
action: ALLOW
rules:
- from:
- source:
principals:
- "cluster.local/ns/production/sa/frontend-service-account"
to:
- operation:
methods: ["GET", "POST"]
paths: ["/api/v1/*"]
---
# Blocca tutto il resto (default deny)
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: deny-all
namespace: production
spec:
action: DENY
# Nessun selector = si applica a tutti i Pod nel namespace
# Nessuna rule = blocca tutto
Linkerd: Kurulum ve Yapılandırma
Linkerd operasyonel basitliği ve performansı tercih ediyor. Rust'ta yazılmış proxy'si ~1ms P99 gecikme süresi ve Pod başına ~20MB bellek ek yüküne sahiptir, bu da onu ideal kılar birçok mikro hizmete veya kaynak kısıtlamasına sahip kümeler için.
Linker kurulumu
# Installa Linkerd CLI
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
export PATH=$HOME/.linkerd2/bin:$PATH
# Prerequisiti: verifica che il cluster sia compatibile
linkerd check --pre
# Installa il control plane
linkerd install --crds | kubectl apply -f -
linkerd install | kubectl apply -f -
# Verifica installazione
linkerd check
# Abilita injection sul namespace
kubectl annotate namespace production linkerd.io/inject=enabled
# Installa l'estensione Viz per osservabilita
linkerd viz install | kubectl apply -f -
linkerd viz check
linkerd viz dashboard &
Linkerd ve HTTPRoute (Ağ Geçidi API'si) ile Canary
# linkerd-canary-httproute.yaml
# Linkerd usa la Gateway API per il traffic splitting
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: api-service-canary
namespace: production
spec:
parentRefs:
- name: api-service
kind: Service
group: core
port: 80
rules:
- backendRefs:
- name: api-service-v1
port: 80
weight: 90
- name: api-service-v2
port: 80
weight: 10
# Monitora il canary con linkerd viz
linkerd viz stat httproute/api-service-canary -n production
linkerd viz routes deploy/api-service-v2 -n production
Linkerd ile gözlemlenebilir
# Visualizza metriche golden signals per tutti i deployment
linkerd viz stat deploy -n production
# Output tipico:
# NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P99 TCP_CONN
# api-service 4/4 99.8% 245 1ms 12ms 42
# backend-service 3/3 98.2% 180 3ms 45ms 28
# payment-service 2/2 100.0% 65 8ms 89ms 12
# Visualizza il traffico per un singolo Pod
linkerd viz tap pod/api-service-xyz -n production
# Genera un report di osservabilita
linkerd viz check --proxy -n production
Istio Telemetri: Metrikler, İzleme ve Günlüğe Kaydetme
Istio otomatik olarak altın sinyaller (gecikme, trafik, hatalar, her kaynak-hedef çifti için doygunluk). Metrikler formatta gösterilir Prometheus ve Grafana'da resmi Istio kontrol panelleriyle görünür.
# telemetry-config.yaml
# Configura il sampling per il distributed tracing
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: mesh-tracing
namespace: istio-system
spec:
tracing:
- providers:
- name: tempo # o jaeger, zipkin
randomSamplingPercentage: 1.0 # campiona 1% del traffico in produzione
---
# Metriche custom per un servizio specifico
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: payment-service-metrics
namespace: production
spec:
selector:
matchLabels:
app: payment-service
metrics:
- providers:
- name: prometheus
overrides:
- match:
metric: REQUEST_COUNT
tagOverrides:
destination_version:
value: "request.headers['x-version'] | 'unknown'"
# Importa le dashboard Grafana ufficiali Istio
# Dashboard ID: 7639 (Mesh Overview), 11829 (Service), 12378 (Workload)
Service Mesh ve Cilium eBPF Karşılaştırması: Ne Zaman Kullanılmalı?
Sepetler olmadan mTLS ve L7 politikaları sunan (çekirdekteki eBPF aracılığıyla) Cilium'un gelişiyle birlikte, seçim karmaşıktır. İşte pratik bir rehber:
| Senaryo | Önerilen Seçim | Sebep |
|---|---|---|
| Gelişmiş trafik yönetimine sahip mikro hizmetler (kanarya, başlık tabanlı yönlendirme) | Istio | VirtualService/DestinationRule yeri doldurulamaz |
| Minimum ek yük ile mTLS güvenliği | Linkerd veya Cilium | Rust proxy veya minimum eBPF |
| Yüzlerce mikro hizmet ve sınırlı kaynak içeren küme | Linkerd veya Cilium mTLS | Sepet yükü her Kapsül ile çarpılır |
| Çoklu küme veya çoklu bulut | Istio | Mesh federasyonu yerleşik |
| Servis ağında yeni olan ekip | Linkerd | Önemli ölçüde daha düşük öğrenme eğrisi |
Hizmet Ağı İçin En İyi Uygulamalar
Üretimde Hizmet Ağı İçin Kontrol Listesi
- İZİNLİ modda başlatın: Henüz sepete sahip olmayan hizmetleri tanımlamak için, STRICT yapmadan önce mTLS'yi PERMISSIVE'de etkinleştirin
- Tüm VirtualServices'te zaman aşımını ayarlayın: zaman aşımı olmadan, yavaş bir bağımlılık tüm çağrı zincirini engeller
- Her harici bağımlılık için devre kesici: veritabanları, harici API'ler, ödeme hizmetleri
- Yalnızca idempotent hatalar için yeniden denemeyi kullanın: idempotency anahtarı olmadan POST'ta otomatik yeniden deneme yapmayın, aksi takdirde yinelenen siparişler oluşturacaksınız
- CPU/bellek sepetini izleyin: Çok sayıda Kapsülün bulunduğu kümelerde toplam sepet yükü önemli olabilir
- Yük devretme testi: bir bölmeyi manuel olarak devre dışı bırakın ve devre kesicinin ve yeniden denemelerin beklendiği gibi çalıştığını doğrulayın
- Ağı güncel tutun: Istio ve Linkerd versiyonlarının yaşam döngüleri kısadır (6-12 ay); düzenli yükseltmeler planlayın
Yaygın Anti-Desenler
- Amplifikasyonla sonsuz yeniden denemeler: A, B'yi 3 yeniden denemeyle geri çağırırsa ve B, C'yi 3 yeniden denemeyle geri çağırırsa, tek bir hata C'ye yönelik 9 denemeye neden olur (yeniden deneme fırtınası)
- Çok cömert zaman aşımları: kritik bir API'de 60 saniyelik zaman aşımı, bir kesinti sırasında tüm uygulama iş parçacıklarının/goroutinlerinin 60 saniye boyunca engellendiği anlamına gelir
- Kontrol düzlemi yükünün göz ardı edilmesi: Istiod, bağlı her proxy için önemli miktarda CPU/bellek tüketir; 1000'den fazla Pod içeren kümelerde özel bir düğüm gereklidir
- Düzlemsiz seçici enjeksiyon: yalnızca bazı Pod'ların sepetleri varsa mTLS STRICT, sepetsiz Pod'larla iletişimde başarısız olur
Sonuçlar ve Sonraki Adımlar
Hizmet ağı "olsa iyi olur" olmaktan çıktı ve bir gereksinim haline geldi. herhangi bir ciddi mikro hizmet mimarisi. Otomatik mTLS, ayrıntılı gözlemlenebilirlik, Devre kesme ve bildirimsel trafik yönetimi, gerçek sorunları, bir hizmet ağı, her hizmette özel kod gerektirir.
Istio ve Linkerd arasındaki seçim ihtiyaçlarınıza bağlıdır: Karmaşık senaryolar için Istio gelişmiş ve çok kümeli trafik yönetimi, operasyonel basitlik ve ek yük için Linkerd minimum. Her iki durumda da öğrenmeye ve kuruluma yapılan ilk yatırım uygulamalarda ve görünürlükte altyapı kodunun azaltılmasıyla karşılığını aldı küme içi trafik üzerinde benzeri görülmemiş bir etki.
Kubernetes at Scale Serisinde Yaklaşan Makaleler
Önceki Makaleler
İlgili Seriler
- Kubernetes Ağı: eBPF ile Cilium — mTLS için servis ağına alternatif
- Gözlemlenebilirlik ve Açık Telemetri — Istio ile entegre dağıtılmış izleme
- Platform Mühendisliği — dahili bir platform olarak servis ağı







