Canary implementacija pomoću Jenkins-X Istio Flaggera
Canary raspoređivanje
Nadamo se da čitate prvi dio, gdje smo ukratko objasnili što su Canary implementacije i pokazali kako ih implementirati koristeći standardne Kubernetes resurse.
Istio
A pretpostavljamo da čitajući ovaj članak već znate što je Istio. Ako ne, onda možete čitati o tome здесь.
Prijava za testove
Svaki pod sadrži dva spremnika: našu aplikaciju i istio-proxy.
Koristit ćemo jednostavnu testnu aplikaciju s frontend-nginx i backend python podovima. Nginx pod će jednostavno preusmjeriti svaki zahtjev na backend pod i raditi kao proxy. Detalji se mogu pronaći u sljedećim yamlovima:
Ako želite slijediti moj primjer i sami koristiti ovu testnu aplikaciju, pogledajte projekt readme.
Početno postavljanje
Kada pokrenemo prvu implementaciju, vidimo da podovi naše aplikacije imaju samo 2 spremnika, odnosno Istio sidecar se upravo implementira:
I također vidimo Istio Gateway Loadbalancer u prostoru imena istio-system:
Generiranje prometa
Koristit ćemo sljedeću IP adresu za generiranje prometa koji će primati prednji moduli i proslijeđivati pozadinskim modulima:
while true; do curl -s --resolve 'frontend.istio-test:80:35.242.202.152' frontend.istio-test; sleep 0.1; done
Također ćemo dodati frontend.istio-test u našu host datoteku.
Pogledajte Mesh putem Kialija
Instalirali smo testnu aplikaciju i Istio zajedno s Tracingom, Grafanom, Prometheusom i Kialijem (pogledajte detalje u nastavku). projekt readme). Stoga Kiali možemo koristiti putem:
istioctl dashboard kiali # admin:admin
Kiali vizualizira trenutni promet kroz Mesh
Kao što vidimo, 100% prometa ide na frontend uslugu, zatim na frontend podove s oznakom v1, budući da koristimo jednostavan nginx proxy koji preusmjerava zahtjeve na pozadinsku uslugu, koja ih zauzvrat preusmjerava na pozadinske podove. s oznakom v1.
Kiali odlično funkcionira s Istiom i pruža rješenje za iscrtavanje Mesh mreže u kutiji. Baš odlično.
Canary raspoređivanje
Naš backend već ima dvije implementacije k8s, jednu za v1 i jednu za v2. Sada samo trebamo reći Istiou da proslijedi određeni postotak zahtjeva na v2.
1. korak: 10%
Sve što trebamo učiniti je prilagoditi težinu VirtualServicea istio.yaml:
Sada koristeći curl možemo forsirati v2 zahtjev slanjem zaglavlja:
Zahtjevi bez zaglavlja i dalje će biti vođeni omjerom 1/10:
Canary za dvije ovisne verzije
Sada ćemo razmotriti opciju gdje imamo verziju v2 i za frontend i za backend. Za oba smo odredili da 10% prometa treba ići na v2:
Vidimo da frontend v1 i v2 prosljeđuju promet u omjeru 1/10 prema backendu v1 i v2.
Što ako trebamo proslijediti promet s frontend-v2 samo na backend-v2 jer nije kompatibilan s v1? Da bismo to učinili, postavit ćemo omjer 1/10 za sučelje, koje kontrolira koji promet dolazi do backend-v2 koristeći pregovaranje sourceLabels :
Kao rezultat toga, dobivamo ono što nam je potrebno:
Razlike od ručnog Canary pristupa
В prvi dio Ručno smo izvršili implementaciju Canarya, također koristeći dva k8s rasporeda. Tamo smo promjenom broja replika kontrolirali omjer zahtjeva. Ovaj pristup funkcionira, ali ima ozbiljne nedostatke.
Istio omogućuje određivanje omjera zahtjeva neovisno o broju replika. To znači, na primjer, da možemo koristiti HPA (Horizontal Pod Autoscalers) i da ne moramo biti konfigurirani prema trenutnom stanju implementacije Canarya.
Ukupan
Istio radi odlično i korištenje zajedno s Kialijem čini vrlo moćnu kombinaciju. Sljedeće na popisu mojih interesa je kombinacija Spinnakera s Istiom za automatizaciju i Canary analitiku.