AnvÀnda Istio+Kiali för att initiera och visualisera Canary-deployments

Artiklar i denna cykel
- (denna artikel)
- Canary-deployment med Jenkins-X Istio Flagger
Canary-deployment
Vi hoppas att du har lÀst , dÀr vi kort förklarade vad Canary-deployments Àr och visade hur man genomför dem med standardresurser i Kubernetes.
Istio
Och vi förutsÀtter att nÀr du lÀser denna artikel vet du redan vad Istio Àr. Om inte, kan du lÀsa om det .
App för tester

Varje pod innehÄller tvÄ containrar: vÄr applikation och istio-proxy.
Vi kommer att anvÀnda en enkel testapplikation med pods frontend-nginx och backend i Python. Podden med nginx kommer bara att omdirigera varje begÀran till podden med backend och fungera som en proxy. Detaljer kan ses mer i de följande yaml-filerna:
Köra testapplikationen sjÀlv
Om du vill följa mitt exempel och anvÀnda denna testapplikation sjÀlv, se .
Initial Deployment
Vid starten av den första deploymenten ser vi att pods i vÄr applikation har endast tvÄ containrar, vilket innebÀr att Istio-sidecar för nÀrvarande bara implementeras:

Och vi ser ocksÄ Istio Gateway Loadbalancer i namnomrÄdet istio-system:

Skapa trafik
Vi kommer att anvÀnda följande IP för att generera trafik som kommer att tas emot av frontend-pods och omdirigeras till backend-pods:
while true; do curl -s --resolve 'frontend.istio-test:80:35.242.202.152' frontend.istio-test; sleep 0.1; done
Vi kommer ocksÄ att lÀgga till frontend.istio-test i vÄr hosts-fil.
Visa Mesh via Kiali
Vi har installerat testapplikationen och Istio tillsammans med Tracing, Grafana, Prometheus och Kiali (se mer pÄ ). Följaktligen kan vi anvÀnda Kiali via:
istioctl dashboard kiali # admin:admin

Kiali visualiserar den aktuella trafiken genom Mesh
Som vi kan se, gÄr 100% av trafiken till frontend-tjÀnsten, sedan till frontend-poden med etikett v1, eftersom vi anvÀnder en enkel nginx-proxy som omdirigerar begÀrningar till backend-tjÀnsten, som i sin tur omdirigerar dem till backend-pods med etikett v1.
Kiali fungerar utmÀrkt tillsammans med Istio och erbjuder en fÀrdig lösning för att visualisera Mesh. Bara fantastiskt.
Canary-deployment
VÄr backend har redan tvÄ k8s-deployments, en för v1 och en för v2. Nu behöver vi bara sÀga till Istio att omdirigera en viss procentandel av begÀrningarna till v2.
Steg 1: 10%
Och allt vi behöver göra Àr att justera vikten pÄ VirtualService i :
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: backend
namespace: default
spec:
gateways: []
hosts:
- "backend.default.svc.cluster.local"
http:
- match:
- {}
route:
- destination:
host: backend.default.svc.cluster.local
subset: v1
port:
number: 80
weight: 90
- destination:
host: backend.default.svc.cluster.local
subset: v2
port:
number: 80
weight: 10 
Vi ser att 10 % av förfrÄgningarna omdirigeras till v2.
Steg 2: 50 %
Och nu Àr det tillrÀckligt enkelt att öka den till 50 %:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: backend
namespace: default
spec:
...
- destination:
host: backend.default.svc.cluster.local
subset: v1
port:
number: 80
weight: 50
- destination:
host: backend.default.svc.cluster.local
subset: v2
port:
number: 80
weight: 50 
Steg 3: 100 %
Nu kan Canary-distributionen anses vara slutförd och all trafik omdirigeras till v2:

Manuell testning av Canary
Anta att vi nu skickar 10 % av alla förfrÄgningar till backend v2. Vad hÀnder om vi vill testa v2 manuellt för att se till att allt fungerar som vi förvÀntar oss?
Vi kan lÀgga till en speciell matchningsregel baserad pÄ HTTP-huvuden:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: backend
namespace: default
spec:
gateways: []
hosts:
- "backend.default.svc.cluster.local"
http:
- match:
- headers:
canary:
exact: "canary-tester"
route:
- destination:
host: backend.default.svc.cluster.local
subset: v2
port:
number: 80
weight: 100
- match:
- {}
route:
- destination:
host: backend.default.svc.cluster.local
subset: v1
port:
number: 80
weight: 90
- destination:
host: backend.default.svc.cluster.local
subset: v2
port:
number: 80
weight: 10Nu anvÀnder vi curl för att tvinga en begÀran till v2 genom att skicka huvudet:
![]()
BegÀrningar utan huvudet kommer fortfarande att hanteras enligt förhÄllandet 1/10:

Canary för tvÄ beroende versioner
Nu ska vi se ett scenario dÀr vi har version v2 för bÄde frontend och backend. För bÄda har vi angett att 10 % av trafiken ska gÄ till v2:

Vi ser att bÄde frontend v1 och v2 skickar trafik i förhÄllandet 1/10 till backend v1 och v2.
Vad hÀnder om vi behöver skicka trafik frÄn frontend-v2 endast till backend-v2, eftersom det inte Àr kompatibelt med v1? För detta kommer vi att stÀlla in ett förhÄllande 1/10 för frontend, som kontrollerar vilken trafik som gÄr till backend-v2 med hjÀlp av matchning baserat pÄ sourceLabels :
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: backend
namespace: default
spec:
gateways: []
hosts:
- "backend.default.svc.cluster.local"
http:
...
- match:
- sourceLabels:
app: frontend
version: v2
route:
- destination:
host: backend.default.svc.cluster.local
subset: v2
port:
number: 80
weight: 100Som vi fÄr det vi behöver:

Skillnaderna frÄn den manuella Canary-metoden
I första delen Vi utförde Canary-distribution manuellt, ocksÄ med hjÀlp av tvÄ k8s-distributioner. DÀr hanterade vi förhÄllandet mellan förfrÄgningar genom att Àndra antalet repliker. Denna metod fungerar, men har allvarliga nackdelar.
Istio ger möjlighet att definiera förhĂ„llandet mellan förfrĂ„gningar oavsett antalet repliker. Det betyder till exempel att vi kan anvĂ€nda HPAs (Horizontal Pod Autoscalers â horisontell skalning av pods) och det behöver inte stĂ€llas in utifrĂ„n det aktuella tillstĂ„ndet av Canary-distributionen.
Resultat
Istio fungerar utmÀrkt och genom att anvÀnda det tillsammans med Kiali fÄr vi en mycket kraftfull kombination. NÀsta pÄ min lista över intressen Àr kombinationen av Spinnaker med Istio för automatisering och Canary-analys.
KĂ€lla: habr.com
