Istio ile Circuit Breaker

Turgay Özgür
ÇSTech
Published in
2 min readSep 26, 2019

--

Istio proxy arkasında çalışan bir servis için circuit breaker patterninin kullanımını anlatmaya çalışacağım. Tabii ki birçok açıdan istio dokümantasyonu ile paralel fakat birkaç farklı kaynaktan edindiğim bilgileri ve deneyimlerimi bu yazıya aktardım.

Circuit breaker nedir sorusunun cevabı için şu linki inceleyebilirsiniz: https://microservices.io/patterns/reliability/circuit-breaker.html

Hedefimiz, isteklere gereken şekilde veya hiç cevap veremeyen bir servise ısrarla istek atmaktan vazgeçip bir süre boyunca servisin rahatlamasına izin vermek.

İki farklı şekilde uygulanabilir.

1- Black-box: İstek yapılan servise henüz istek ulaşmadan önce bir proxy yardımı ile ki istio’da yöntem bu.

2- White-box: İstek yapılan servisten dönen cevabı kod içinde kontrol edip buna göre karar alan bir sistem ile.

İki yöntem ile ilgili artılar eksiler nelerdir şeklinde detaylı bir yazıya şu linkten ulaşabilirsiniz: https://www.exoscale.com/syslog/istio-vs-hystrix-circuit-breaker/

Istio’da circuit breaker ayarları DestinationRule crd’si üzerinden yapılır.

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: example
spec:
host: service-name
trafficPolicy:
connectionPool:
tcp:
maxConnections: 5
http:
http1MaxPendingRequests: 15
maxRequestsPerConnection: 1
outlierDetection:
consecutiveErrors: 1
interval: 1s
baseEjectionTime: 1m
maxEjectionPercent: 100
EOF

maxConnections: 5 # Aynı anda en fazla 5 connection kabul eder. Aynı anda maksimum 5 request almak gibi. Fazla requestler sırada bekler.

Burada önemli nokta şu; HTTP/1.1 için her request 1 connectiona ihtiyaç duyar. Yani connection sayısını sınırlamakla aslında request sayısını da sınırlamış oluruz. HTTP/2 için ise bir connection birden fazla request tarafından kullanılabilir. İşte bu noktada maxRequestsPerConnection parametresi devreye giriyor.

http1MaxPendingRequests: 15 # Cevap bekleyen request sayısı en fazla 15 olabilir. Fazla requestler reddedilir.

maxRequestsPerConnection: 1 # Bir connection ile servise yapılabilecek maksimum request sayısı. 1 olduğunda keep alive devre dışı oluyor.

consecutiveErrors: 1 # Circuit breaker açılması için gerekli hata sayısı. Burada hatadan kasıt servisin 502,503,504 dönmesi. 500 ve aşağısı sayılmaz.

interval: 1s # Her şeyin yolunda olup olmadığını ne kadar zamanda bir kontrol edeceği.

baseEjectionTime: 1m # Circuit breakerın ne kadar süre açık kalacağı. Süre bitiminde istekler tekrar servise akmaya başlar.

maxEjectionPercent: 100 # Servisin çalıştığı podların en fazla yüzde kaçında circuit breakerın aktif olabileceği.

Istio 1.3 öncesinde circuit breaker outlierDetection çalışmıyor. En az 1.3.0 versiyonunu kurmayı deneyin.

--

--