Implementación de Canary utilizando Jenkins-X Istio Flagger
Implementación canaria
Esperamos que leas primera parte, donde explicamos brevemente qué son los Canary Deployments. También mostramos cómo implementarlo utilizando recursos estándar de Kubernetes.
Lanzamientos de Argo
Argo Rollouts es un controlador de implementación nativo de Kubernetes. Proporciona una CRD (definición de recursos personalizados) para Kubernetes. Gracias a ello, podemos utilizar una nueva entidad: Rollout, que gestiona implementaciones azul-verde y canary con varias opciones de configuración.
Controlador Argo Rollouts utilizado por un recurso personalizado Rollout, Permite estrategias de implementación adicionales, como azul-verde y canario para Kubernetes. Recurso Rollout proporciona una funcionalidad equivalente Deployment, solo con estrategias de implementación adicionales.
recurso Deployments tiene dos estrategias de implementación: RollingUpdate и Recreate. Aunque estas estrategias son adecuadas para la mayoría de los casos, para la implementación en servidores a muy gran escala se utilizan estrategias adicionales, como azul-verde o canary, que no están disponibles en el controlador de implementación. Para utilizar estas estrategias en Kubernetes, los usuarios tenían que escribir scripts además de sus implementaciones. El controlador Argo Rollouts expone estas estrategias como parámetros simples, declarativos y configurables. https://argoproj.github.io/argo-rollouts
También está Argo CI, que proporciona una interfaz web conveniente para usar con Rollouts, lo veremos en el próximo artículo.
En nuestra infraestructura de nabo (ver más abajo) ya hemos agregado install.yaml como i/k8s/argo-rollouts/install.yaml. De esta forma, GitlabCI lo instalará en el clúster.
Esta es una API Python+Flask muy simple que devuelve una respuesta como JSON. Construiremos el paquete usando GitlabCI y enviaremos el resultado al Registro de Gitlab. En el registro tenemos dos versiones de lanzamiento diferentes:
La única diferencia entre ellos es el archivo JSON devuelto. Utilizamos esta aplicación para visualizar lo más fácilmente posible con qué versión nos estamos comunicando.
Repositorio de infraestructura
En este repositorio usaremos GitlabCI para la implementación en Kubernetes, .gitlab-ci.yml tiene este aspecto:
Rollout Funciona igual que la implementación. Si no configuramos una estrategia de actualización (como canary aquí), se comportará como la implementación de actualización continua predeterminada.
Definimos dos pasos en yaml para la implementación canary:
10% del tráfico a Canary (espera a que se apruebe el manual)
50% de tráfico a Canary (espera 2 minutos y luego continúa hasta el 100%)
Realizar la implementación inicial
Después de la implementación inicial, nuestros recursos tendrán este aspecto:
Y obtenemos respuesta solo de la primera versión de la aplicación:
Realizar la implementación Canary
Paso 1: 10% de tráfico
Para iniciar una implementación canary, solo necesitamos cambiar la versión de la imagen como hacemos habitualmente con las implementaciones:
Vídeo sobre las implementaciones de Argo y Argo CI
Realmente recomiendo este video, muestra cómo Argo Rollouts y Argo CI trabajan juntos:
Total
Realmente me gusta la idea de utilizar CRD que gestionen la creación de tipos adicionales de implementaciones o conjuntos de réplicas, redireccionen el tráfico, etc. Trabajar con ellos se desarrolla sin problemas. A continuación me gustaría probar la integración con Argo CI.
Sin embargo, parece que se avecina una gran fusión de Argo CI y Flux CI, por lo que podría esperar hasta que salga la nueva versión: Flujo Argo.
¿Ha tenido alguna experiencia con Argo Rollouts o Argo CI?