Kubernetes Istio Traffik Yönetimi Örnek_1
Uygulama Örneği 1
Merhabalar,
Bu yazımda Kubernetes istio, frontend uygulamamızı istio ile traffik yönetmini inceliycez.
Eğer sisteminizde istio kurulu değil ise diğer yazımdan istio kurulumunu gerçekleştirebilirsiniz.
Örneğimizi biraz açıklarsak,
- v1 ve v2 versiyonu olan bir frontend uygulaması.
- Dışarıdan bu uygulamanın versiyonları eriştiğimizde istio arka tarafda load balancing kullanarak v1 ile v2 arasında trafiğin geçmesini amaçlıyoruz.
- Istio ile istersek trafiği sadece bir versiyona yönlendirme işlemini yapabilcez.
- Denemek isteyenler için image docker hub yükledim. İndirmek isteyenler “docker pull denizturkmen/frontend-web:v1 ve docker pull denizturkmen/frontend-web:v2” ile localinize image indirip uygulamayı deneyebilirsiniz.
Örneğimizi istio trafiğine devretmeye başlayalım . Bunun için ilk olarak bir tane namespace yaratıyorum ve yaratılan bu namespace deploy edilen tün objeleri isito üzerinden geçmesini sağlıyoruz.
kubectl create ns deniz-istio
Yukarıdaki şekilde görüldüğü gibi namespace oluştu. Şimdi de namespace label ekleyerek “istio trafiğinin yönetilmesini” sağlayalım. Bunu yapmanın bir kaç yolu vardır, fakat otomatik olarak yapmak için en iyi yol uygulamanızı deploy edeceğiniz namespace alanına label eklemektir. Label eklemek için,
kubectl label ns namespace_ismi key=value
ve
kubectl get ns --show-labels
Evet artık “deniz-istio” namespace deploy edilen tüm objeleri istio trafiği üzerinden otomatik olarak geçmesini sağladık. Şimdide version: 1 ile çalışan uygulamamızı deploy edelim.
kubectl apply -f v1kubectl get pods -n deniz-istiokubectl get sa -n deniz-istiokubectl get svc -n deniz-istio
Komutlarını terminalden uygulayalım.
Yukarıdaki şekilde görüldüğü gibi deployment objemizin “replicas=1” olmasına rağmen deployment objemizi ait iki tane pod oluşmuş. Istio trafiği ilk olarak sidecar proxy üzerine alıyor ve bu sidecar proxy ilgili service ,serviste ilgili pod yönlendirme yapıyor.
Şimdi de versiyon_2 deploy edelim.
kubectl apply -f v2.yamlkubectl get pods -n deniz-istio
versiyon 2 deploy ettik ve statusü çalışıyor durumda. Şimdide trafiği bu versiyonlara dağıtacak olan nginx uygulamızı deploy edelim.
kubectl apply -f h1.yamlkubectl get configmaps -n deniz-istiokubectl get sa -n deniz-istiokubectl get svc -n deniz-istiokubectl get pods -n deniz-istio
Şimdi istio dışardan traffic için “gateway” ve “virtual service” oluşturalım.
kubectl apply -f gv.yamlkubectl get gateways.networking.istio.io -n deniz-istiokubectl get virtualservices.networking.istio.io -n deniz-istiokubectl get svc -n istio-system istio-ingressgatewaysudo vim /etc/hosts
Tarayıcından “web.denizturkmen.com” adresine gittiğimizde.
ilk olarak “version:1” olan uygulamız geldi. Sayfayı reflesh ettiğimizde
version_2 uygulamın geldiği görmekteyiz. Sayfayı her reflesh‘lediğimzde version 1 ile version 2 arasında trafic değişicektir. İsterseniz virtual service ait bir tane “destination rule” yazarak trafiği istediğiniz version a yönlendirme yapabilirsiniz.
Şimdi de “kiali” ile monitor edelim. bunun için ilk olarak indirdiğimiz istio folderından ilgili yaml deploy edelim. Bunun için, istio indirdiğimiz path giderek kiali.yaml deploy ediyoruz.
Kiali dashbord açmak için,
kubectl get svc-n istio-systemkubectl get pods -n istio-systemkubectl -n istio-system port-forward pod_name port_numarası
Tarayıcıdan “localhost:20001” gittiğimizde
burdan deniz-istio geçelim. Workload graph
version graph
versiyonlar arası trafik yüzdesi
Burdan service bakalım.
“frontend” servisine tıklayalım.
Sağ üsteki “actions” sekmesinden trafiği sadece frontend-v2 olan servise yönlendirelim.
Version graphtan tekrar baktığımızda trafiğin sadece frontend-v2 den aktığını görebilirsiniz.
Eğer trafiği kiali dashboard’dan yönlendirmek yerine virtual service kapsayan bir tane “Destination Rule” yazarak istediğiniz servise trafiğinizi yönlendirebilirsiniz.
Not: Gift görüntüsü kötü oldu farkındayım bununla ilgili daha iyi çözünürlüklü yapmak için yardımlarınıza açığım.
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;