ÇSTech
Published in

ÇSTech

Istio ile Circuit Breaker

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.

--

--

--

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Turgay Özgür

Turgay Özgür

More from Medium

Azure DevOps Server Architectures

Secure Microservices Configuration Properties via HashiCorp Vault

Injecting Fault in Azure Cache for Redis using Azure Chaos Studio through Rest API (Part 2)

Kubernetes Dapr on OKE-Distributed Application Runtime on OCI Kubernetes Engine