Chaos Engineering: Mikroservislerde Dayanıklılık Testleri
Mikroservis mimarisinde, "her şey yolunda" olduğu bir anda bile bir servis çökebilir, ağ gecikebilir veya bir düğüm arızalanabilir. Geleneksel test yöntemleri (unit, integration, load test) bu tür senaryoları simüle etmekte yetersizdir; çünkü test ortamı, üretim ortamının kaosunu yansıtmaz. İşte Chaos Engineering (Kaos Mühendisliği), sistemin zayıf noktalarını kasıtlı olarak arıza enjekte ederek keşfetmeyi amaçlayan bir disiplindir.
1. Chaos Engineering Nedir?
Chaos Engineering, dağıtık sistemlerde güveni artırmak için kontrollü deneyler yapma disiplinidir. Amaç, sistemin gerçek dünyada karşılaşabileceği arızalara karşı ne kadar dayanıklı olduğunu ölçmek ve zayıf noktaları üretim ortamına zarar vermeden keşfetmektir.
Temel Prensipler (Principles of Chaos):
-
Bir hipotez kurun: "Bu servis çökerse, sistem çalışmaya devam eder."
-
Gerçek dünya olaylarını simüle edin: Ağ gecikmesi, sunucu çökmesi, disk dolması.
-
Üretim ortamında test edin: Test ortamı değil, gerçek trafik.
-
Sürekli çalıştırın: Otomatik ve sürekli deneyler.
-
En az etkiyle başlayın: Küçük deneylerle başlayıp kapsamı genişletin.
2. Neden Chaos Engineering?
Mikroservislerde arızalar kaçınılmazdır. Chaos Engineering'in sağladığı faydalar:
| Fayda | Açıklama |
|---|---|
| Zayıf Noktaları Keşfetme | Sistemin nerede çökeceğini önceden öğrenin. |
| Dayanıklılık Doğrulama | Retry, circuit breaker, bulkhead gibi desenlerin çalıştığını doğrulayın. |
| MTTR Azaltma | Arıza anında müdahale süresini kısaltın. |
| Kültür Değişimi | Arızayı bir hata değil, öğrenme fırsatı olarak görün. |
| Müşteri Güveni | Üretimde çökmeden önce sorunları çözün. |
3. Kaos Deneyi Türleri
Chaos Engineering'de en yaygın kaos türleri:
A. Ağ Kaosu (Network Chaos)
-
Latency (Gecikme): Servisler arası çağrılara yapay gecikme ekleme.
-
Packet Loss (Paket Kaybı): Ağ paketlerinin bir kısmını düşürme.
-
Bandwidth Limiting: Bant genişliğini sınırlama.
-
DNS Failure: DNS çözümlemesini bozma.
B. Servis Kaosu (Service Chaos)
-
Pod Kill: Rastgele pod'ları öldürme.
-
Container Kill: Container'ları sonlandırma.
-
Service Unavailable: Bir servisi geçici olarak devre dışı bırakma.
C. Kaynak Kaosu (Resource Chaos)
-
CPU Stress: CPU'yu aşırı yükleme.
-
Memory Stress: Belleği tüketme.
-
Disk Fill: Diski doldurma.
-
I/O Stress: Disk G/Ç'yi yavaşlatma.
D. Uygulama Kaosu (Application Chaos)
-
Exception Injection: Belirli metotlarda exception fırlatma.
-
Response Delay: Belirli endpoint'lerde gecikme.
-
HTTP Error Injection: 5xx hataları döndürme.
E. Durum Kaosu (State Chaos)
-
Time Skew: Saat kayması simülasyonu.
-
Clock Drift: Zamanı ileri/geri alma.
4. Popüler Chaos Engineering Araçları
| Araç | Platform | Özellikler |
|---|---|---|
| Chaos Monkey | Netflix (AWS) | Rastgele instance'ları sonlandırır. |
| Litmus | Kubernetes (CNCF) | Kubernetes-native, zengin kaos kütüphanesi. |
| Chaos Mesh | Kubernetes (CNCF) | Pod, network, I/O, stress kaosları. |
| Gremlin | Ticari | Kullanıcı dostu arayüz, geniş kaos kütüphanesi. |
| AWS Fault Injection Simulator | AWS | AWS servislerine özel kaos deneyleri. |
| Azure Chaos Studio | Azure | Azure kaynaklarına yönelik kaos deneyleri. |
| Steadybit | Ticari | Güvenlik odaklı, otomatik kaos. |
5. Kubernetes'te Chaos Mesh ile Deney
Chaos Mesh, Kubernetes ortamında en yaygın kullanılan açık kaynak kaos aracıdır.
A. Pod Kill Deneyi
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-kill-example
namespace: default
spec:
action: pod-kill
mode: one
selector:
labelSelectors:
app: order-service
scheduler:
cron: '@every 5m' # Her 5 dakikada bir
B. Network Latency Deneyi
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: network-delay-example
spec:
action: delay
mode: all
selector:
labelSelectors:
app: payment-service
delay:
latency: '500ms'
correlation: '100'
jitter: '0ms'
duration: '5m'
C. CPU Stress Deneyi
yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
name: cpu-stress-example
spec:
mode: one
selector:
labelSelectors:
app: inventory-service
stressors:
cpu:
workers: 2
load: 80 # %80 CPU yükü
duration: '10m'
6. .NET'te Chaos Engineering: Polly ile Simülasyon
Chaos Engineering'i uygulama seviyesinde test etmek için Polly'nin Simmy (Chaos Monkey for Polly) uzantısı kullanılabilir.
Kurulum:
bash
dotnet add package Polly.Contrib.Simmy
A. Exception Injection (Hata Enjeksiyonu)
csharp
using Polly.Contrib.Simmy;
using Polly.Contrib.Simmy.Behavior;
// %10 olasılıkla exception fırlat
var chaosPolicy = MonkeyPolicy.InjectExceptionAsync(
with =>
{
with.Fault(new InvalidOperationException("Simüle edilmiş hata!"));
with.InjectionRate(0.1); // %10
with.Enabled(true);
});
var pipeline = Policy.WrapAsync(chaosPolicy, retryPolicy, circuitBreakerPolicy);
B. Latency Injection (Gecikme Enjeksiyonu)
csharp
var latencyPolicy = MonkeyPolicy.InjectLatencyAsync(
with =>
{
with.Latency(TimeSpan.FromSeconds(2)); // 2 saniye gecikme
with.InjectionRate(0.05); // %5 olasılıkla
with.Enabled(true);
});
C. Result Injection (Hatalı Sonuç Enjeksiyonu)
csharp
var resultPolicy = MonkeyPolicy.InjectResultAsync<HttpResponseMessage>(
with =>
{
with.Result(new HttpResponseMessage(HttpStatusCode.InternalServerError));
with.InjectionRate(0.1);
with.Enabled(true);
});
Kullanım:
csharp
var policy = Policy.WrapAsync(
latencyPolicy,
exceptionPolicy,
retryPolicy,
circuitBreakerPolicy
);
var response = await policy.ExecuteAsync(async () =>
await _httpClient.GetAsync("https://api.example.com/data"));
7. Chaos Engineering Deney Akışı
Adım 1: Hipotez Kurun
"Ödeme servisi 5 saniye gecikirse, sipariş servisi yine de 10 saniye içinde yanıt döner."
Adım 2: Küçük Başlayın
Test ortamında veya üretimde düşük trafikli saatlerde başlayın.
Adım 3: Deneyi Çalıştırın
Chaos Mesh veya Simmy ile arızayı enjekte edin.
Adım 4: Gözlemleyin
Metrikleri izleyin: hata oranı, yanıt süresi, kaynak tüketimi.
Adım 5: Sonuçları Analiz Edin
-
Hipotez doğrulandı mı?
-
Beklenmedik bir davranış var mı?
-
Hangi servis çöktü?
Adım 6: İyileştirin
-
Retry, circuit breaker, bulkhead ekleyin.
-
Timeout sürelerini optimize edin.
-
Servisleri izole edin.
Adım 7: Tekrarlayın
Chaos Engineering süreklilik gerektirir.
8. Kaos Deneyleri için En İyi Pratikler
| Pratik | Açıklama |
|---|---|
| Blast Radius'u Sınırlayın | Tüm sistemi değil, önce bir servisi test edin. |
| Gözlemlenebilirlik Şart | Deney öncesi metrik ve log altyapınızın hazır olduğundan emin olun. |
| Rollback Planı | Deney ters giderse anında geri dönebilin. |
| İş Saatlerinde Test Edin | Sabah 3'te değil, ekip hazırken test edin. |
| Production'da Test Edin | En iyi test ortamı, üretimdir (düşük trafikli saatlerde başlayın). |
| Otomatikleştirin | CI/CD pipeline'ına chaos deneylerini ekleyin. |
| Kültürü Benimseyin | Arızayı bir hata değil, öğrenme fırsatı olarak görün. |
| Gerçekçi Senaryolar Kullanın | Gerçek dünyada karşılaşılan arızaları simüle edin. |
| Ekip Eğitimi | Tüm ekip chaos deneylerine katılmalı. |
| Güvenlik Sınırları | Deneylerin veri kaybına yol açmadığından emin olun. |
9. Chaos Engineering vs. Diğer Test Türleri
| Test Türü | Amaç | Ne Zaman Kullanılır? |
|---|---|---|
| Unit Test | Tek bir metot doğru mu? | Geliştirme sırasında |
| Integration Test | Servisler birlikte çalışıyor mu? | CI/CD pipeline'ında |
| Load Test | Sistem yüksek trafik altında dayanıklı mı? | Release öncesi |
| Chaos Engineering | Sistem arıza altında dayanıklı mı? | Sürekli, üretimde |
Chaos Engineering, diğer test türlerini tamamlar, onların yerini almaz.
10. Gerçek Dünya Senaryosu: E-Ticaret Uygulaması
Senaryo: Bir e-ticaret uygulamasında, ödeme servisi zaman zaman yavaşlıyor. Sistemin bu duruma dayanıklı olup olmadığını test etmek istiyorsunuz.
Deney Tasarımı:
yaml
# Chaos Mesh ile ödeme servisine 2 saniye gecikme enjekte et
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: payment-latency-test
spec:
action: delay
mode: all
selector:
labelSelectors:
app: payment-service
delay:
latency: '2000ms'
duration: '10m'
Beklenen Davranış:
-
Order Service, Payment Service'e istek gönderir.
-
2 saniyelik gecikme nedeniyle Payment Service yavaş yanıt verir.
-
Order Service'deki timeout (ör. 3 saniye) devreye girer.
-
Retry politikası ile tekrar denenir.
-
Circuit Breaker devreye girer ve Payment Service'e yapılan çağrılar geçici olarak durdurulur.
-
Kullanıcıya anlamlı bir hata mesajı döner.
Sonuç: Sistem, ödeme servisi yavaşladığında bile çökmüyor; kullanıcıya hata mesajı dönüyor.
Sonuç
Chaos Engineering, dağıtık sistemlerin dayanıklılığını gerçek dünya arızalarını simüle ederek test etmenin en etkili yoludur. Kontrollü deneyler, küçük başlangıç, sürekli test ve gözlemlenebilirlik ile sisteminizin zayıf noktalarını üretim ortamına zarar vermeden keşfedebilirsiniz. Kubernetes'te Chaos Mesh ve Litmus, uygulama seviyesinde Polly Simmy ile kaos deneylerini kolayca uygulayabilirsiniz. Unutmayın: Chaos Engineering bir "saldırı" değil, bir "öğrenme" aracıdır. Amaç, sisteminiz çökmeden önce nerede ve nasıl çökeceğini bilmektir. Güvenilir sistemler, arıza olmadığında değil, arıza olduğunda bile çalışmaya devam eden sistemlerdir.