Canary-distribusjon er en veldig effektiv måte å teste ny kode på en undergruppe av brukere. Det reduserer trafikkbelastningen betraktelig som kan være problematisk under distribusjonsprosessen, siden den bare skjer innenfor en bestemt undergruppe. Dette notatet handler om hvordan du organiserer en slik distribusjon ved hjelp av Kubernetes og distribusjonsautomatisering. Dette forutsetter at du har litt kunnskap om Helm- og Kubernetes-ressurser..
En enkel kanarie-distribusjon til Kubernetes inkluderer to nøkkelressurser: selve tjenesten og distribusjonsverktøyet. Canary-distribusjon fungerer gjennom én enkelt tjeneste som kommuniserer med to forskjellige ressurser som betjener oppdateringstrafikk. En av disse ressursene vil fungere med "kanarifugl"-versjonen, og den andre - med den stabile. I denne situasjonen kan vi justere antall kanarieversjoner for å redusere mengden trafikk som kreves for vedlikehold. Hvis du for eksempel foretrekker å bruke Yaml, vil det se slik ut 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 enda lettere å forestille seg et slikt alternativ på kubectl, og i
Canary Deployment Automation
Først av alt trenger vi et Helm-kart, som allerede inneholder ressursene som er diskutert ovenfor. Det skal se omtrent slik ut:
~/charts/app
├── Chart.yaml
├── README.md
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
Grunnlaget for Helm-konseptet er håndtering av multiversjonsutgivelser. Den stabile versjonen er vår viktigste stabile kodegren for prosjektet. Men ved hjelp av Helm kan vi distribuere kanari-utgivelsen med vår eksperimentelle kode. Det viktigste er å beholde trafikkutvekslingen mellom den stabile versjonen og Canary-utgivelsen. Vi vil administrere alt dette ved å bruke en spesiell velger:
selector:
app.kubernetes.io/name: myapp
Våre både "kanarifugl" og stabile distribusjonsressurser vil indikere denne etiketten på modulene. Hvis alt er riktig konfigurert, vil vi under distribusjonen av kanarieversjonen av vårt Helm-kart se at trafikken vil bli dirigert til de nylig utplasserte modulene. Den stabile versjonen av denne kommandoen vil se slik ut:
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
La oss nå sjekke ut vår kanari-utgivelse. For å distribuere kanarieversjonen må vi huske to ting. Navnet på utgivelsen må være et annet slik at vi ikke oppdaterer den nåværende stabile versjonen. Versjonen og taggen må også være forskjellige slik at vi kan distribuere annen kode og identifisere forskjeller i ressurstagger.
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 faktisk alt! Hvis du pinger tjenesten, kan du se at Canary-oppdateringen bare ruter trafikk deler av tiden.
Hvis du ser etter automatiseringsverktøy for distribusjon som inkluderer den beskrevne logikken, så ta en titt på
Kilde: www.habr.com