background

Kubernetes Üzerinde Istio Kurulumu ve Trafik Yönetimi

Kubernetes Üzerinde Istio Kurulumu ve Trafik Yönetimi

Istio Kubernetes üzerine Istioctl ile, Helm ile, Operator olarak veya Multicluster kurulumu ile yüklenebiliyor. Kurulum çok detaylı ve konfigüre edilebilir olmakla beraber, yeni başlayanlar için istioctl ve demo profili ile kurulması tavsiye ediliyor. Mevcut profiller aşağıdaki gibi:

Not: Istio’nun dokümanında 1.4 versiyonunun Kubernetes 1.13, 1.14 ve 1.15 versiyonlarıyla denendiği belirtilmiş. Dolayısıyla 1.12 ve önceki Kubernetes sürümlerinde Istio’nun önceki versiyonlarına dönmek gerekebilir.

Istioctl Kurulumu

Istioctl Windows’a kurulabiliyor fakat orijinal doküman Linux scriptleriyle çalıştığı için Linux kurulumunu takip ediyoruz. Istioctl’in son release’ini kurmak için aşağıdaki komutu çalıştırmak yeterli:

curl -L https://istio.io/downloadIstio | sh -

Alternatif olarak, istediğiniz versiyonu aşağıdaki gibi bir komutla kurabilirsiniz:

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.4.0 sh -

Kurulum tamamlandıktan sonra aşağıdaki komutla istioctl’i işletim sisteminin Path’ine ekleyip her yerde çalıştırabilirsiniz:

export PATH=$PWD/bin:$PATH

Istio Kurulumu

Istioctl’i kurduktan sonra, tavsiye edilen demo profiliyle Istio’yu kurmak için aşağıdaki komut çalıştırılır:

istioctl manifest apply --set profile=demo

Bu komut demo profilindeki tüm component’leri Kubernetes cluster’ına (istio-system namespace’ine) kuracaktır. Kurulan component’leri aşağıdaki komutla inceleyebilirsiniz:

kubectl get all -n istio-system

Istio Kullanımı

Istio Kubernetes üzerinde koşan uygulamaların trafiğini yönetmek için Kubernetes’in default network konfigürasyonunu by-pass eder. Uygulamanın pod’larına kendi sidecar proxy container’larını ekler ve tanımlayacağı network, security kurallarını bu proxy’ler üzerinden çalıştırır.

Dolayısıyla eğer bir uygulama trafiğinin Istio ile yönetilmesi gerekiyorsa, o uygulamanın deployment/statefulset tanımları Istio’nın sidecar proxy’lerini içerecek şekilde değiştirilmelidir.

Fakat bu işlemi manuel yapmaya gerek yok. Istio bunu kolayca yönetiyor.

Deployment ve StatefulSet’leri yönetmenin iki yolu var:

  • Uygulamanın kurulacağı namespace’i label’lamak. kubectl label namespace playground istio-injection=enabled komutuyla namespace label’lanır ve bu namespace’e deployedilen tüm pod’ların içine Istio kendi sidecar proxy container’larını otomatik olarak yerleştirir.

  • StatefulSet veya Deployment yaml dosyalarına istioctl ile inject yapmak. kubectl apply -f <(istioctl kube-inject -f dpeloyment.yaml)> yalnızca deploy edilecek olan deployment/statefulset’e sidecar proxy eklenmesi sağlanır.

Ingress Gateway

Ingress Gateway Istio kullanan servislere dışarıdan gelen tüm trafiğin geçtiği uygulamadır.

Dışarıdan gelen request hostname veya nodePort aracılığıyla IngressGateway service’ine ulaşır ve oradan IngressGateway pod’una yönlendirilir.

IngressGateway’in nasıl davranacağını, hangi request’leri nereye yönlendireceğini, tls kullanıp kullanmayacağını, hangi requestlerin geçmesine izin verileceğini belirleyen resource’lar ise VirtualService ve Gateway’lerdir.

Gateway

Gateway’ler Istio servislerinin kapılarıdır. Bu kapıların hangi portlarından hangi requestlerin geçeceğine, hangi kurallarla geçeceğine Gateway kurallarıyla karar verilir. Bu kurallar IngressGateway’den geçen request’lere uygulanır.

Örnek Gateway:

Virtual Service

Gateway kurallarını sağlayıp kapıdan geçen requestler Virtual Service kurallarına göre gerçek servislere yönlendirilir. VitrualService’ler hangi header’a sahip request’in uygulamanın hangi versiyonuna erişeceği, gelen yükün farklı versiyonlar arasında nasıl dağılacağı gibi routing özellikleri barındırır.

Örnek VirtualService:

Destination Rule

DestinationRule VirtualService’den yönlenen subset’in hangi poda denk geleceğini tutan bir kural tanımıdır. VirtualService’lerde belirtilen subset’ler pod’larda belirlenen label’larla eşlenir ve kubernetes servisine yönlendirilen request’lerin hangi pod’lara gideceği bu kurallarla belirlenir. Ayrıca, DestinationRule’dan yönlenecek request’in gideceği serviste hangi LoadBalancing kurallarıyla hareket edeceği de destinationRule’da belirlenir. Bu kurallar subset’ler veya port’lara göre verilebilir.

Örnek DestinationRule:

Kiali

Kiali, Istio demo profiliyle beraber kurulan bir tool. Mikroservis mimarinizi görsel olarak görebildiğiniz, sorunları tespit edebildiğiniz, chartlar oluşturabildiğiniz, faydalı bir dashboard içeriyor.

Jaeger

Jaeger da Istio’nun demo profiliyle kurulan bir tool. Bu tool mikroservislerinizi trace etmenizi sağlıyor. Request’lerin hangi serviste ne kadar zaman kaybettiğini bu tool ile ölçüp performans sorunlarını daha iyi adresleyebilirsiniz:

BookInfo Örneği

Istio kurulumunda default gelen örneklerden BookInfo’yu Kubernetes cluster’ı üzerine kurduktan sonra traffic management testleri yapılabilir.

Örnek setup ProductPage mikroservisine gelen request’in, üç farklı versiyonu kurulmuş olan Reviews mikroservisine farklı kurallarla yönlendirilmesini ve üç farklı versiyonun önyüze üç farklı review getirmesini baz alır.

Kurulum için aşağıdaki komut çalıştırılır:

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n <namespace>

Kurulan pod’lar:

Servisler:

Istio’nun default olarak kurduğu IngressGateway Pod ve Service’i:

Not: Ben kolaylık olsun diye IngressGateway pod’umun servisini NodePort’la dışarıya açtım. Siz dilerseniz DNS tanımıyla veya LoadBalancer’ınız varsa external IP ile de ilerleyebilirsiniz.

BookInfo örneğinin default kurulumunda Reviews mikroservisinin üç farklı versiyonu vardır. Herhangi bir VirtualService, Gateway veya DestinationRule tanımlı değildir.

Bu sebeple, IngressGateway Ip ve NodePort’una gelen herhangi bir request BookInfo pod’larına yönlendirilmez. Uygulamayı dışarıya açabilmek için, uygulamayı kurduğumuz namsepace içinde Gateway ve VirtualService tanımlamamız gerekir.

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n playground

Selector bölümü istio: ingressgateway olan, bookinfo-gateway isminde yeni bir Gateway oluşturduk. Bu gateway doğrudan, default kurulumda gelen IngressGateway pod’uyla konuşup o pod’a gelen request’lerin playground namespace’inde filtre olmadan 80 portundan geçmesini sağlayacak.

Aynı zamanda, bookinfo-gateway ile konuşan bir VirtualService de yarattık. Bu VirtualService IngressGateway’e /productpage, /static/, /login, /logout uri’larıyla gelindiğinde productpage isimli Kubernetes service’ine yönlendirilmesi gerektiğini söylüyor.

Artık uygulamamıza browser üzerinden, Ingress Gateway’e eriştiğimiz NodePort üzerinden erişebiliriz.

Mevcut kurulumumuzda IngressGateway’e gelen requestleri playground namespace’indeki ProductPage mikroservisine yönlendirmeyi başardık. Fakat başka kural tanımlamadığımız için ProductPage’den Reviews service’ine gelen requestler default LoadBalancing kuralıyla (Random) çağrılır ve her request yönlendiği Reviews versiyonuna bağlı olarak Yıldızsız, Siyah Yıldızlı veya Kırmızı Yıldızlı output’u ekrana döner.

Şimdi, Reviews’e yalnızca belirli bir kullanıcı ile gelindiğinde kırmızı yıldız, diğer durumlarda %75 yıldızsız, %25 siyah yıldız gösteren Review versiyonlarına ulaşmak için yeni bir VirtualService yazalım.

reviews servisine gelen requestlerin header’ında end-user: bartu varsa request review v3'e gidecek. yoksa, yani default durumda, requestlerin %75'i v1'e, %25'i v2'ye gidecek.

Uygulamamıza tekrar girelim:

Yukarıdaki hatayla karşılaşacağız. ProductPage mikroservisinden Reviews mikroservisine gitmek istiyoruz. Bunu yaparken, az önce tanımladığımız VirtualService bizi çeşitli subset’lere göndermek istiyor. Fakat bu subset’lerin ne olduğunu Istio bilmiyor. Subset’lerin hangi mikroservis versiyonuyla eşleneceğini belirtmek için DestinationRule yazıyoruz:

Artık uygulamamıza eriştiğimizde %75 ihtimalle yıldızsız ekranla karşılacaşağız. %25 ihtimalle siyah yıldızlı ekranla karşılacaşağız. bartu kullanıcısıyla sign-in yaptığımızda ise her zaman kırmızı yıldızla karşılacağız.

Yukarıda gösterdiğim örnek A/B testing veya Canary release gibi release stratejileri için oldukça faydalı özellikler içeriyor. Fakat Istio’nun yapabildikleri, bu yazının çok ötesinde. LoadBalancing, tracing, circuit breaking, fault injection ve daha birçok özelliği Istio ile yapabilirsiniz.

Kaynaklar

Nasıl yardımcı olabiliriz?