Desplegament de Canary mitjançant Jenkins-X Istio Flagger
Realitzarem el desplegament de Canary manualment a través de GitOps i creant/modificant els principals recursos de Kubernetes. Aquest article està destinat principalment a la introducció amb com funciona el desplegament a Kubernetes Canary, ja que hi ha mètodes d'automatització més efectius, que tindrem en compte en els articles següents.
Amb l'estratègia Canary, les actualitzacions s'apliquen primer només a un subconjunt d'usuaris. Mitjançant la supervisió, les dades de registre, les proves manuals o altres canals de comentaris, la versió es prova abans de ser llançada a tots els usuaris.
Desplegament de Kubernetes (actualització continuada)
L'estratègia predeterminada per a Kubernetes Deployment és l'actualització continua, on es llança un nombre determinat de pods amb noves versions de les imatges. Si es van crear sense problemes, els pods amb versions antigues d'imatges s'acaben i es creen nous pods en paral·lel.
GitOps
Utilitzem GitOps en aquest exemple perquè:
utilitzant Git com a font única de veritat
fem servir les operacions de Git per a la creació i el desplegament (no calen ordres que no siguin git tag/merge)
Exemple
Prenem una bona pràctica: tenir un dipòsit per al codi de l'aplicació i un altre per a la infraestructura.
Repositori d'aplicacions
Aquesta és una API Python+Flask molt senzilla que retorna una resposta com a JSON. Construirem el paquet mitjançant GitlabCI i enviarem el resultat al registre de Gitlab. Al registre tenim dues versions de llançament diferents:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
L'única diferència entre ells és el canvi en el fitxer JSON retornat. Utilitzem aquesta aplicació per visualitzar el més fàcilment possible amb quina versió ens estem comunicant.
Repositori d'infraestructura
En aquest nap desplegarem mitjançant GitlabCI a Kubernetes, .gitlab-ci.yml es veu així:
Tingueu en compte que app-deploy encara no té cap rèplica definida.
Realització del desplegament inicial
Per iniciar el desplegament inicial, podeu iniciar manualment la canalització de GitlabCI a la branca mestra. Després d'això kubectl hauria de sortir el següent:
Nosaltres veiem app desplegament amb 10 rèpliques i app-canary amb 0. També hi ha un LoadBalancer des del qual podem accedir mitjançant curl mitjançant IP externa:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Veiem que la nostra aplicació de prova només retorna "v1".
Execució del desplegament de Canary
Pas 1: llançar una versió nova per a alguns usuaris
Establem el nombre de rèpliques a 1 al fitxer deploy-canary.yaml i a la imatge de la nova versió:
Impulsem aquests canvis al repositori des del qual començarà el desplegament (mitjançant GitlabCI) i veiem com a resultat:
El nostre servei apuntarà a tots dos desplegaments, ja que tots dos tenen el selector d'aplicacions. A causa de l'aleatorització predeterminada de Kubernetes, hauríem de veure respostes diferents per al ~10% de les sol·licituds:
L'estat actual de la nostra aplicació (GitOps, extret de Git com a Single Source Of Truth) és la presència de dos desplegaments amb rèpliques actives, una per a cada versió.
El ~10% dels usuaris es familiaritzen amb una versió nova i la proven sense voler. Ara és el moment de comprovar si hi ha errors als registres i les dades de control per trobar problemes.
Pas 2: llança la nova versió per a tots els usuaris
Vam decidir que tot anava bé i ara hem de llançar la nova versió a tots els usuaris. Per fer-ho simplement actualitzem deploy.yaml instal·lant una nova versió de la imatge i el nombre de rèpliques igual a 10. In deploy-canary.yaml tornem a establir el nombre de rèpliques a 0. Després del desplegament, el resultat serà el següent:
En resum
Per a mi, executar el desplegament manualment d'aquesta manera ajuda a entendre amb quina facilitat es pot configurar amb k8s. Com que Kubernetes us permet actualitzar-ho tot mitjançant una API, aquests passos es poden automatitzar mitjançant scripts.
Una altra cosa que cal implementar és un punt d'entrada del provador (LoadBalancer o via Ingress) a través del qual només es pot accedir a la nova versió. Es pot utilitzar per a la navegació manual.
En articles futurs, veurem altres solucions automatitzades que implementen la major part del que hem fet.