Vom efectua manual implementarea Canary prin GitOps și crearea/modificarea principalelor resurse Kubernetes. Acest articol este destinat în primul rând pentru introducere cu modul în care funcționează implementarea în Kubernetes Canary, deoarece există metode mai eficiente de automatizare, pe care le vom lua în considerare în articolele următoare.
Cu strategia Canary, actualizările sunt aplicate mai întâi doar unui subset de utilizatori. Prin monitorizare, date de jurnal, testare manuală sau alte canale de feedback, versiunea este testată înainte de a fi lansată tuturor utilizatorilor.
Implementarea Kubernetes (actualizare continuă)
Strategia implicită pentru Kubernetes Deployment este actualizarea continuă, în care un anumit număr de pod-uri sunt lansate cu noi versiuni ale imaginilor. Dacă au fost create fără probleme, podurile cu versiuni vechi de imagini sunt terminate, iar podurile noi sunt create în paralel.
GitOps
Folosim GitOps în acest exemplu deoarece:
folosind Git ca sursă unică de adevăr
folosim operațiuni Git pentru construirea și implementarea (nu sunt necesare alte comenzi decât git tag/merge)
Exemplu
Să luăm o practică bună - să avem un depozit pentru codul aplicației și unul pentru infrastructură.
Depozitul de aplicații
Acesta este un API Python+Flask foarte simplu, care returnează un răspuns ca JSON. Vom construi pachetul prin GitlabCI și vom împinge rezultatul în Registrul Gitlab. În registru avem două versiuni de lansare diferite:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Singura diferență dintre ele este modificarea fișierului JSON returnat. Folosim această aplicație pentru a vizualiza cât mai ușor cu ce versiune comunicăm.
Depozitul de infrastructură
În acest nap vom implementa prin GitlabCI în Kubernetes, .gitlab-ci.yml este după cum urmează:
Împingem aceste modificări în depozitul de la care va începe implementarea (prin GitlabCI) și vedem ca rezultat:
Serviciul nostru va indica ambele implementări, deoarece ambele au selectorul de aplicații. Datorită randomizării prestabilite Kubernetes, ar trebui să vedem răspunsuri diferite pentru ~10% din solicitări:
Starea actuală a aplicației noastre (GitOps, preluată din Git ca sursă unică de adevăr) este prezența a două implementări cu replici active, câte una pentru fiecare versiune.
~10% dintre utilizatori se familiarizează cu o nouă versiune și o testează neintenționat. Acum este momentul să verificați erorile în jurnalele și datele de monitorizare pentru a găsi probleme.
Pasul 2: Lansați noua versiune pentru toți utilizatorii
Am decis că totul a mers bine și acum trebuie să lansăm noua versiune pentru toți utilizatorii. Pentru a face acest lucru, pur și simplu actualizăm deploy.yaml instalarea unei noi versiuni a imaginii și a numărului de replici egal cu 10. În deploy-canary.yaml setăm numărul de replici înapoi la 0. După implementare, rezultatul va fi următorul:
Rezumând
Pentru mine, rularea manuală a implementării în acest fel ajută la înțelegerea cât de ușor poate fi configurată folosind k8s. Deoarece Kubernetes vă permite să actualizați totul printr-un API, acești pași pot fi automatizați prin scripturi.
Un alt lucru care trebuie implementat este un punct de intrare al testerului (LoadBalancer sau prin Ingress) prin care poate fi accesată doar noua versiune. Poate fi folosit pentru navigarea manuală.
În articolele viitoare, vom verifica și alte soluții automate care implementează majoritatea a ceea ce am făcut.