Implementación de Canary usando Jenkins-X Istio Flagger
Realizaremos o despregamento de Canary manualmente a través de GitOps e creando/modificando os principais recursos de Kubernetes. Este artigo está destinado principalmente á introdución con como funciona a implantación en Kubernetes Canary, xa que existen métodos de automatización máis eficaces, que teremos en conta nos seguintes artigos.
Coa estratexia Canary, as actualizacións aplícanse primeiro só a un subconxunto de usuarios. Mediante o seguimento, os datos de rexistro, as probas manuais ou outras canles de comentarios, a versión probárase antes de que se lance a todos os usuarios.
Implementación de Kubernetes (actualización continua)
A estratexia predeterminada para a implementación de Kubernetes é a actualización continua, onde se lanzan un certo número de pods con novas versións das imaxes. Se se crearon sen problemas, as vainas con versións antigas de imaxes rematan e créanse novas en paralelo.
GitOps
Usamos GitOps neste exemplo porque:
usando Git como fonte única de verdade
usamos Git Operations para a compilación e a implantación (non se necesitan comandos distintos de git tag/merge)
Exemplo
Tomemos unha boa práctica: ter un repositorio para o código da aplicación e outro para a infraestrutura.
Repositorio de aplicacións
Esta é unha API de Python+Flask moi sinxela que devolve unha resposta como JSON. Construiremos o paquete a través de GitlabCI e enviaremos o resultado ao Rexistro de Gitlab. No rexistro temos dúas versións diferentes:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
A única diferenza entre eles é o cambio no ficheiro JSON devolto. Usamos esta aplicación para visualizar o máis facilmente posible con que versión nos estamos comunicando.
Repositorio de infraestruturas
Neste nabo implementaremos a través de GitlabCI en Kubernetes, .gitlab-ci.yml parece así:
Teña en conta que app-deploy aínda non ten ningunha réplica definida.
Realización da implantación inicial
Para iniciar a implantación inicial, pode iniciar manualmente a canalización de GitlabCI na rama mestra. Despois diso kubectl debería producir o seguinte:
Vemos app despregamento con 10 réplicas e app-canary con 0. Tamén hai un LoadBalancer desde o que podemos acceder a través curl vía IP externa:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Vemos que a nosa aplicación de proba só devolve "v1".
Execución do despregamento de Canary
Paso 1: lanzar unha nova versión para algúns usuarios
Establecemos o número de réplicas en 1 no ficheiro deploy-canary.yaml e na imaxe da nova versión:
Impulsamos estes cambios no repositorio desde o que comezará a implementación (a través de GitlabCI) e vemos como resultado:
O noso servizo apuntará a ambas as implementacións, xa que ambas teñen o selector de aplicacións. Debido á aleatorización predeterminada de Kubernetes, deberíamos ver respostas diferentes para ~10 % das solicitudes:
O estado actual da nosa aplicación (GitOps, tomado de Git as a Single Source Of Truth) é a presenza de dúas implementacións con réplicas activas, unha para cada versión.
~10 % dos usuarios familiarízanse cunha nova versión e proban sen querer. Agora é o momento de comprobar se hai erros nos rexistros e os datos de seguimento para atopar problemas.
Paso 2: lanza a nova versión para todos os usuarios
Decidimos que todo saíu ben e agora necesitamos lanzar a nova versión a todos os usuarios. Para iso simplemente actualizamos deploy.yaml instalando unha nova versión da imaxe e o número de réplicas igual a 10. En deploy-canary.yaml volvemos establecer o número de réplicas en 0. Despois da implantación, o resultado será o seguinte:
Resumo
Para min, executar a implementación manualmente deste xeito axuda a comprender a facilidade con que se pode configurar usando k8s. Dado que Kubernetes permíteche actualizar todo mediante unha API, estes pasos pódense automatizar mediante scripts.
Outra cousa que hai que implementar é un punto de entrada do probador (LoadBalancer ou vía Ingress) a través do cal só se pode acceder á nova versión. Pódese usar para a navegación manual.
En artigos futuros, consultaremos outras solucións automatizadas que implementan a maior parte do que fixemos.