Vi håper du leser første del, hvor vi kort forklarte hva Canary-distribusjoner er og viste hvordan de implementeres ved å bruke standard Kubernetes-ressurser.
Samme
Og vi antar at ved å lese denne artikkelen vet du allerede hva Istio er. Hvis ikke, kan du lese om det her.
Søknad om prøver
Hver pod inneholder to beholdere: vår applikasjon og istio-proxy.
Vi vil bruke en enkel testapplikasjon med frontend-nginx og backend python pods. Nginx-poden vil ganske enkelt omdirigere hver forespørsel til backend-poden og fungere som en proxy. Detaljer finner du i følgende yamls:
Hvis du vil følge mitt eksempel og bruke denne testapplikasjonen selv, se prosjekt readme.
Innledende distribusjon
Når vi lanserer den første distribusjonen, ser vi at podene til applikasjonen vår bare har 2 containere, det vil si at Istio-sidevognen akkurat blir implementert:
Og vi ser også Istio Gateway Loadbalancer i navneområdet istio-system:
Trafikkgenerering
Vi vil bruke følgende IP for å generere trafikk som vil bli mottatt av frontend-podene og videresendt til backend-podene:
while true; do curl -s --resolve 'frontend.istio-test:80:35.242.202.152' frontend.istio-test; sleep 0.1; done
Vi vil også legge til frontend.istio-test til vertsfilen vår.
Se Mesh via Kiali
Vi installerte testapplikasjonen og Istio sammen med Tracing, Grafana, Prometheus og Kiali (se nedenfor for detaljer). prosjekt readme). Derfor kan vi bruke Kiali via:
istioctl dashboard kiali # admin:admin
Kiali visualiserer gjeldende trafikk gjennom Mesh
Som vi kan se går 100 % av trafikken til frontend-tjenesten, deretter til frontend-podene med label v1, siden vi bruker en enkel nginx-proxy som omdirigerer forespørsler til backend-tjenesten, som igjen omdirigerer dem til backend-podene med etikett v1.
Kiali fungerer utmerket med Istio og gir en mesh-gjengivelsesløsning. Bare flott.
Kanariøyeutplassering
Backend vår har allerede to k8s-distribusjoner, en for v1 og en for v2. Nå trenger vi bare å fortelle Istio å videresende en viss prosentandel av forespørslene til v2.
Trinn 1: 10 %
Og alt vi trenger å gjøre er å justere vekten på VirtualService istio.yaml:
Ved å bruke curl kan vi tvinge en v2-forespørsel ved å sende overskriften:
Forespørsler uten overskrift vil fortsatt bli drevet av forholdet 1/10:
Canary for to avhengige versjoner
Nå skal vi vurdere alternativet der vi har versjon v2 for både frontend og backend. For begge spesifiserte vi at 10 % av trafikken skulle gå til v2:
Vi ser at frontend v1 og v2 begge forover trafikk i et forhold på 1/10 til backend v1 og v2.
Hva om vi trengte å videresende trafikk fra frontend-v2 bare til backend-v2 fordi den ikke er kompatibel med v1? For å gjøre dette vil vi sette et 1/10-forhold for frontend, som kontrollerer hvilken trafikk som kommer til backend-v2 ved å bruke forhandling sourceLabels :
Forskjeller fra den manuelle kanariske tilnærmingen
В første del Vi utførte Canary-distribusjon manuelt, også ved å bruke to k8s-distribusjoner. Der kontrollerte vi forholdet mellom forespørsler ved å endre antall replikaer. Denne tilnærmingen fungerer, men har alvorlige ulemper.
Istio gjør det mulig å bestemme forholdet mellom forespørsler uavhengig av antall replikaer. Dette betyr for eksempel at vi kan bruke HPA-er (Horizontal Pod Autoscalers) og ikke trenger å konfigureres i henhold til gjeldende tilstand for Canary-distribusjonen.
Total
Istio fungerer utmerket og å bruke den sammen med Kiali gir en veldig kraftig kombinasjon. Neste på min liste over interesser er å kombinere Spinnaker med Istio for automatisering og Canary analytics.