Kubernetes Istio Kurulum
Istio Bileşenleri & BookInfo Örneği
Merhabalar,
Bu yazımda Open source ve service mesh için kullanılan ‘Istio’ inceliycez. ilk olarak kavramlara bakalım.
Service Mesh: Servis sayılarımız arttıkça operasyonel işlerimiz artar ve zorlaşır. Mimarideki fonksiyonel gereksinimlerin yanında fonksiyonel olmayan gereksinimlere de odaklanmanız gerekiyor. Service Mesh aslında bir servisin düşünmesi gereken birçok non-functional problemlerin çözümünü sunan bir mimari katmandır. Mikroservisler birbirleriyle API (Application Programming Interface) aracılığıyla haberleşirler. Microservice mimarisindeki uygulamalarınız için tasarlanmış konfigure edilebilen bir infrastructure(alt yapı) katmanıdır. Bu sayede uygulamalar daha güvenilir daha esnek ve daha hızlı şekilde birbiri ile haberleşirler. Service Mesh aynı zamanda,
- Service Discovery: Microservislerin birbirleriyle iletişim kurabilmesini, healt check ile sadece ayakta olan servislerin kullanılmasını ve load balancing ile servislerin dinamik olarak dağılmasını sağlayan yapıdır.
- Load Balancing
- Encryption: Trafic şifreleme,tls ve istio identity.
- Observability(Gözlenebilirlik): Istio, bir ağ içindeki tüm servisleri iletişimi için telemetri oluşturur. Bu telemetri, servis davranışının gözlemlenebilirliğini sağlayarak operatörlere, hizmet geliştiricilere herhangi bir ek yük getirmeden uygulamalarını sorun giderme, bakımını yapma ve optimize etme yetkisi verir. Üç tip telemetri tipi vardır. Metrics,Distributed Traces ve Access logs.
- Traceability (izlenebilirik) :Jeager
- Authentication and Authorization: Istio kimlik doğrulama policylerini etkinleştirirken, yapılandırırken ve kullanırken gerçekleştirmeniz gerekebilecek birincil aktivitileri kapsar.
- Circuit Breaker sağlar.
Service Mesh iki ana yapıdan oluşur.
1- Control Plane: Service Mesh’in yönetimi için kullanılacak UI ya da API’lar ile kural ve policy’ler bu katmanda değerlendirilir.
2- Data Plane: Sidecar proxy’ler bu kapsamda değerlendiriliyor.
Sidecar Proxy: Sidecar Proxy’ler adından da anlaşılacağı üzere aslında bir proxydir. Kısaca, Her bir microservice için tanımlanan proxy denir. Servislerin yanına konumlanırlar. Servisler hedef servislere erişimlerini o servise ait sidecar proxy üzerinden sağlarlar. Aynı zamanda load balancing, encryption, Authentication and Authorization yapar.
Istio: Kubernetes cluster’larına kurulan ve open source bir service mesh ürünüdür. Kubernetes’i yazan ekip tarafından yazılıp daha sonra Cloud Native Foundation devredilmiştir. Istıo’yu Kubernetes Cluster’ınıza deploy ettiğinizde aslında mevcut pod’umuzun içinde, virtual service olarak bir container daha ayağa kaldırır. Mevcut container’ınıza gelen ve giden trafik ilk önce bu sidecar envoy proxy container’ı üzerinden geçmeye başlıyor.
Envoy Proxy: Bütün servis mesh(ağ) katmanı içindeki servislerin ,gelen ve giden trafiğinde araya giren , C++ ile yazılmış, üstün performanslı bir open source üründür.
Gateway: Ağımız için gelen ve giden trafiği yönetmek için gateway kullanırız. Gateway yapılandırması ağın yanında çalışan bağımsız envoy proxylere uygulanır. Dışarıdan gelen trafik ilk olarak bu envoy proxy karşılar ve ağdaki kurallara göre ilgili virtual servisine yönlendirilmesi sağlar. Istio gataway sayesinde tüm ağ yönlendirme ve esnekliğine olanak sağlar. Istio ağ geçiti proxy (istio-ingressgateway ve istio-egressgateway) sağlar.
- istio-ingressgateway: Istio kullanan servislere dışarıdan gelen tüm trafiğin geçtiği uygulamadır. Dışarıdan gelen istek(request) hostname, nodeport veya loadbalancer ile servise ulaşır.
- istio-egressgateway: Simetrik bir kavramdır. Ağdan çıkış noktalarını tanımlar. Ağdan çıkan trafiği izleme ve rota kuralları belirlememize olanak sağlar.
Virtual Service: Destination rule ile birlikte istio nun trafik yönlendirme işlevlerini yapar. Istio ve platform tarafında sağlanan bağlantıları ve istio keşif sağlayıcılarını inşa ederek istio servis ağının içerde hangi servise yönlendirmesini sağlar. Virtaul Service istio nun trafik yönetimini esnek ve güçlü hale getirmede önemli bir yola sahiptir. Ayrıca Virtual service iş yüklerini trafiğe göndermek için farklı trafik yönlendirme kuralları belirlenmesinde çok çeşitli yollar sağlar. Trafiği round-robin load balacing yöntemi ile dağıtır. Virtual service için bir veya daha fazla host ismi tanımlayabiliriz. Trafiği farklı bir servise yönlendirmek için servisin “subset” belirtilen versiyona trafiği yönlendirebiliriz.
Kısaca: Gatewayden geçen kuralların virtual servisdeki route kurallarına göre gerçek servislere yönlendirme işlemi yapar. Virtual servisler 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. Bu bilgileri de registry alanında tutar ve bu registry alanındaki kurallara göre işlemleri uygular.
Destination Rule: Virtual servisler trafiği belirli bir hedefe yönlendirmek istediğimiz yapı olarak düşünebiliriz. Bu belirtilen hedef trafiğin ne olacağını hangi load balancer tanımına göre yönlendirme yapılacağı, Destination rule belirleriz. Load balacing kuralı “subset” veya “port” lara göre belirlenir
Not_1: “Destinaton Rule” objesinde host kubernetes servis ismidir.
Not_2: Destination Rule , virtual servis yönlendirme işlemi uygulandıktan sonra uygulanır. Böylece trafiğin gerçek servis hedefine uygulanır.
Envoy proxy için load balancer stratejilerini aşağıdaki dökumandan okuyabilirsiniz.
Service Entry: Istio nun dahili olarak sürdürdüğü service registry alanına servis girişi eklemek için kullanılır. Servis eklendikten sonra envoy proxy ağınızda bir servis gibi trafik gönderebiliriz.
Sidecars: Varsayılan olarak Istio, her Envoy proxy’sini ilişkili iş yükünün tüm bağlantı noktalarındaki trafiği kabul edecek ve trafiği iletirken ağdaki her iş yüküne ulaşacak şekilde yapılandırır.
Istio Kurulumu: Sistemimize istio farklı yollardan kurabiliriz. Bunlar,
- istioctl
- Helm
- Operator ile kurulum gerçekleştirebiliriz.
Istio Single Cluster Kubernetes ortamına kurulum gerçekleştircez. Clusterımızın güncel hali.
Istioctl ile kurulum yapıyor olacağız. Bunun için ,
ilgili linkten kurulum aşamalarını takip edelim. Isterseniz aşağıda linkten istediğiniz istio versiyonu ve işletim sistemini seçerek kurulum yapabilirsiniz.
Istio yükleme scriptleri linux olduğu için ve ubuntu 20.04 üzerine istio kurmak için çalıştırcağımız komut.
curl -L https://istio.io/downloadIstio | sh -belirlediğiniz bir versiyon kurmak içincurl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.11.3 TARGET_ARCH=x86_64 sh -
istioctl çalıştırmak için path export etmeliyiz. Sonrasında ‘istioctl’ terminalden ‘istioctl’ komutunu çalıştırdığımızda
Yukarıdaki şekilde gibi bir çıktı elde ediyorsak başarılı şekilde kurulum gerçekleşmiştir.
İndirdiğimiz istio versiyonun içerisine bir bakalım.
- /bin: binary dosyaları.
- /manifest: chart,example ve profile
- /manifest.yaml:
- /samples: addons …
- /tools: Certifika bilgileri
Yeni başlayan için istio demo profile kurulması öneriliyor. Eğer demo profile kurmak isterseniz,
istioctl install — set profile=demo -y
Komutu ile demo profile kurabilirsiniz. Altı tip profile seçeneği vardır. Aşağıdaki linkten profil tiplerini bakabilirsiniz.
İlgili folderda profile yaml görebilirsiniz.
- 1- default: Varsayılandır. Bu profile production deployment ve multicluster mesh(ağ) birincil mesh ağ için önerilir. “istioctl profile dump” komutu ile default ayarlara bakabilirsiniz.
- 2- demo: Istio işlevselliğini(functionality),kaynak gerekesinimleri göstermek için tasarlanmıştır. Istio dökümanındaki bookinfo uygulamızı göstermek için kullanılır.
Not: Performans testleri için uygun değildir.
- 3- minimal: Default profile benzer ancak sadece control plane componenetlarını yükler.
- 4-external: Uzak(Remote) clusterı yapılandırmak için kullanılır.
- 5-empty: Custom profile hiçbir şey deploy etmez. Kendiniz ayarlamız gerekir.
- 6-preview: Istio gelen yeni özellikleri keşfetmek içindir. Experimental features içerir. Risk tamamem size aittir. Çoğu özelliğin garantisini vermez.
Istio sisitemizie kurduğumuzda kendisi istio-system adında bir tane namespace yaratır.
Kurulum default ayarları ile ilerliyecez. Bunun için,
istioctl install
Komutu ile istio yükleyebiliriz.
Görüldüğü gibi istio “istio-system” adından bir namespace oluşturdu ve ilgili manifest dosyasındaki yaml çalıştırdı. “istio-system” namespace inde çalışan objelere bakmak için
kubectl get all -n istio-system
Yüklemeyi doğrulamak için
istioctl verify-install
Not 1: Istio kubernetes üzerinde koşan uygulamaların trafiğini yönetmek için kubernetes kurmuş olduğumuz network devre dışı bırakır. Uygulamada çalıştırdığımız podların yanına sidecar proxy kurar ve gelen isteği bu sidecar proxy podu karşılar. Eğer dışarıdan gelen trafiği istio ile yönetilmesini istiyorsanız manuel olarak Deployment ve Statefulset objelerinize istio ‘nun sidecar proxy belirtmeniz gerekir. Ama biz automatic olarak dışardan gelen trafiği istio devretcez.
Manuel ve automatic inject için aşağıda dökümandan yararlabilirsiniz.
Dışarıdan gelen trafiği automatic olarak istio devretmek için belirlediğimiz veya istediğimiz daha doğrusu ilgili objelerimizi devretmek için namespace label ekleriz. Önce namespace label bakalım.
kubectl get ns — show-labels
İki farklı uygulama örneği uygulayacağım için default ve deniz-istio namespace ‘istio-injection=enabled’ key-value şeklindeki label ekliyorum. Bu namespacelere deploy edilen podları istio trafiğine devretmesini sağlıyoruz. Bunun için,
kubectl create ns deniz-istiokubectl label namespaces default istio-injection=enabledkubectl label namespaces deniz-istio istio-injection=enabledkubectl get ns — show-labels
Örneğimiz istio dökümanında bulunan Bookinfo örneği uyguluycaz. Bookinfo uygulama örneğine bakacak olursak,
Istio nun çeşitli özellikleri göstermek için 4 ayrı microservisten oluşuyor.
- productpage: details ve reviews servislerini içerir.
- reviews: Reviews içerir.Reviws ratings servisleri içerir.
- details: Kitap bilgilerini içerir.
- ratings: Kitap review larına ait ratings içerir.
Reviews;
v1: Rating servisini içermez.
v2: 1 den 5 e kadar siyah yıldızları içerir.
v3: 1 den 5 e kadar kırmızı yıldızları içerir.
Tüm mikroservis, servisler için gelen ve giden trafiği keser ve envoy proxy üzerinden istio kontrol düzlemi(Istio control plane), yönlendirme(routing), telemetri toplama işlemini envoy proxy devreder.
Şimdi de bookinfo uygulamasını deploy edelim. Bunun için,
Deploy edilen service ve podlara bakalım.
kubectl get svc -n defaultkubectl get pods -n default
Görüldüğü gibi trafiği kendi üstüne almak için her pod kendisine ait bir tane sidecar proxy oluşturmuştur. Uygulamanın doğru bir şekilde çalıştığını doğrulamak için uygulamanın title bakalım.
kubectl exec “$(kubectl get pod -l app=ratings -o jsonpath=’{.items[0].metadata.name}’)” -c ratings — curl -sS productpage:9080/productpage | grep -o “<title>.*</title>”
Şimdi de uygulamayı dış trafiğe açalım. Uygulamayı dışarıya açmak için “Istio Ingress Gateway” deki gateway.yaml deploy edelim.
Ingress ip ve portuna bakalım.
Metal-lb aldığı ip ile tarayıcıdan ilgili path gittiğimizde bookinfo uygulamasın çalıştığı görebiliriz. Sayfayı reflesh ettiğimizde reviews servisi v1,v2 ve v3 servisine gittiğini görmekteyiz.
Şimdi de dashboardları deploy edelim ve istio trafiğini gözlemleyelim. Bunun için,
cd istio-1.11.3/samples/addonskubectl apply -f .
kubectl get svc -n istio-systemkubectl get pods-n istio-system
Deploy ettiğimizde dashboardlara bakalım.
Şimdi de “kiali dashboardunu” dışarı açalım. Bunun için 2 farkı yoldan yapabiliriz.
- port-forward
- ClusterIP olan servici LoadBalancer çevirip metallb den ip adresi almasını sağlayabiliriz.
“localhost:2001” gittiğimizde
Trafik gözlemleyebilirsiz. Kiali dashboardunu karıştırmayı sizlere bırakıyorum.
Bu seferde grafana ve promethues service editleyerek metallbden ip ve port almasını sağlayalım. Bunun için,
Grafana service editleyelim.
Promethues service editleyelim.
Tarayıcıdan “192.168.1.202:9090” -> promethues dashboard ulaşabiliriz. Metriclere bakmak için,
Status -> Target
Tarayıcıdan “192.168.1.203:3000” -> grafana dashboard
Istio ait grana dashboardlarına bakmak için,
Dashboard -> Manage -> Istio -> istediğiniz dashboard çift tıklayarak monitör edebilirsiniz.
Istio Control Plane Dashboard
İkinci Istio-Microservis uygulama örneğini diğer yazımdan okuyabilirsiniz.
https://deniz-turkmen.medium.com/kubernetes-istio-traffik-y%C3%B6netimi-1-b6691bd23480
Not: Kubernetes label kaldırmakubectl label “obje_tipi” “obje_ismi” “anahtar-”kubectl label namespace default istio-injection-
Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler.
Referanslar;