Canary-implementering er en meget effektiv måde at teste ny kode på en undergruppe af brugere. Det reducerer markant den trafikbelastning, der kan være problematisk under implementeringsprocessen, da den kun forekommer inden for en bestemt delmængde. Denne note er viet til, hvordan man organiserer en sådan implementering ved hjælp af Kubernetes og implementeringsautomatisering. Vi antager, at du ved noget om Helm og Kubernetes ressourcer.
En simpel kanarie-implementering til Kubernetes inkluderer to nøgleressourcer: selve tjenesten og implementeringsværktøjet. Canary-implementering fungerer gennem en enkelt tjeneste, der interagerer med to forskellige ressourcer, der betjener opdateringstrafik. En af disse ressourcer vil fungere med "canary" versionen, og den anden vil arbejde med den stabile version. I denne situation kan vi regulere antallet af kanariske versioner for at reducere mængden af trafik, der kræves for at betjene. Hvis du for eksempel foretrækker at bruge Yaml, så ser det sådan ud i Kubernetes:
kind: Deployment
metadata:
name: app-canary
labels:
app: app
spec:
replicas: 1
...
image: myapp:canary
---
kind: Deployment
metadata:
name: app
labels:
app: app
spec:
replicas: 5
...
image: myapp:stable
---
kind: Service
selector:
app: app # Selector will route traffic to both deployments.
Det er endnu nemmere at forestille sig denne mulighed ved at bruge kubectl og i
Automatisering af udrulning af kanariefugle
Først og fremmest har vi brug for et Helm-kortkort, som allerede indeholder de ressourcer, vi diskuterede ovenfor. Det skal se sådan ud:
~/charts/app
├── Chart.yaml
├── README.md
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
Grundlaget for Helm-konceptet er håndteringen af multiversionsudgivelser. Den stabile version er vores vigtigste stabile gren af projektkoden. Men med Helm kan vi implementere en kanarie-udgivelse med vores eksperimentelle kode. Det vigtigste er at opretholde trafikudveksling mellem den stabile version og Canary-udgivelsen. Vi klarer alt dette ved hjælp af en speciel vælger:
selector:
app.kubernetes.io/name: myapp
Vores "kanariefugle" og stabile implementeringsressourcer vil angive denne etiket på modulerne. Hvis alt er konfigureret korrekt, vil vi under implementeringen af den kanariske version af vores Helm-kortkort se, at trafikken vil blive dirigeret til de nyligt installerede moduler. Den stabile version af denne kommando vil se sådan ud:
helm upgrade
--install myapp
--namespace default
--set app.name=myapp # Goes into app.kubernetes.io/name
--set app.version=v1 # Goes into app.kubernetes.io/version
--set image.tag=stable
--set replicaCount=5
Lad os nu tjekke vores kanarie-udgivelse. For at implementere den kanariske version skal vi huske to ting. Udgivelsesnavnet skal være anderledes, så vi ikke udruller en opdatering til den aktuelle stabile version. Versionen og tagget skal også være anderledes, så vi kan implementere anden kode og identificere forskelle ved hjælp af ressourcetags.
helm upgrade
--install myapp-canary
--namespace default
--set app.name=myapp # Goes into app.kubernetes.io/name
--set app.version=v2 # Goes into app.kubernetes.io/version
--set image.tag=canary
--set replicaCount=1
Det er alt! Hvis du pinger tjenesten, kan du se, at canary-opdateringen kun ruter trafik en del af tiden.
Hvis du leder efter implementeringsautomatiseringsværktøjer, der inkluderer den beskrevne logik, så vær opmærksom på
Kilde: www.habr.com