Canary implementacija pomoću Jenkins-X Istio Flaggera
Implementaciju Canarya izvršit ćemo ručno putem GitOpsa i kreiranja/modificiranja glavnih resursa Kubernetesa. Ovaj je članak prvenstveno namijenjen uvodu s načinom na koji implementacija funkcionira u Kubernetes Canary, budući da postoje učinkovitije metode automatizacije, koje ćemo razmotriti u sljedećim člancima.
Sa strategijom Canary, ažuriranja se prvo primjenjuju samo na podskup korisnika. Putem praćenja, podataka dnevnika, ručnog testiranja ili drugih kanala povratnih informacija, izdanje se testira prije nego što se objavi svim korisnicima.
Kubernetes implementacija (tekuće ažuriranje)
Zadana strategija za Kubernetes Deployment je rolling-update, gdje se određeni broj podova pokreće s novim verzijama slika. Ako su kreirani bez problema, podovi sa starim verzijama slika se prekidaju, a paralelno se stvaraju novi podovi.
GitOps
Koristimo GitOps u ovom primjeru jer:
koristeći Git kao jedini izvor istine
koristimo Git Operations za izgradnju i implementaciju (nisu potrebne nikakve naredbe osim git tag/merge)
Primjer
Uzmimo dobru praksu - imati jedno spremište za kod aplikacije i jedno za infrastrukturu.
Repozitorij aplikacija
Ovo je vrlo jednostavan Python+Flask API koji vraća odgovor kao JSON. Izgradit ćemo paket putem GitlabCI-ja i poslati rezultat u Gitlab registar. U registru imamo dvije različite verzije izdanja:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Jedina razlika između njih je promjena u vraćenoj JSON datoteci. Ovu aplikaciju koristimo kako bismo što lakše vizualizirali s kojom verzijom komuniciramo.
Spremište infrastrukture
U ovoj ćemo fazi implementirati putem GitlabCI-ja u Kubernetes, .gitlab-ci.yml je kako slijedi:
Guramo te promjene u repozitorij iz kojeg će započeti implementacija (putem GitlabCI-ja) i kao rezultat vidimo:
Naša će usluga ukazivati na obje implementacije, budući da obje imaju birač aplikacija. Zbog Kubernetesove zadane randomizacije, trebali bismo vidjeti različite odgovore za ~10% zahtjeva:
Trenutačno stanje naše aplikacije (GitOps, preuzeto iz Gita kao jedinstvenog izvora istine) je prisutnost dvije implementacije s aktivnim replikama, po jedna za svaku verziju.
~10% korisnika se upozna s novom verzijom i nenamjerno je testira. Sada je vrijeme da provjerite postoje li pogreške u zapisnicima i podacima praćenja kako biste pronašli probleme.
2. korak: objavite novu verziju za sve korisnike
Odlučili smo da je sve prošlo u redu i sada moramo uvesti novu verziju za sve korisnike. Da bismo to učinili, jednostavno ažuriramo deploy.yaml instaliranje nove verzije slike i broj replika jednak 10. In deploy-canary.yaml vraćamo broj replika na 0. Nakon implementacije, rezultat će biti sljedeći:
Sažimanje
Za mene, ručno pokretanje implementacije na ovaj način pomaže razumjeti koliko se lako može konfigurirati pomoću k8s. Budući da vam Kubernetes omogućuje ažuriranje svega putem API-ja, ti se koraci mogu automatizirati pomoću skripti.
Još jedna stvar koju treba implementirati je ulazna točka testera (LoadBalancer ili preko Ingressa) preko koje se može pristupiti samo novoj verziji. Može se koristiti za ručno pregledavanje.
U budućim člancima provjerit ćemo druga automatizirana rješenja koja implementiraju većinu onoga što smo napravili.