Déploiement Canary à l'aide de Jenkins-X Istio Flagger
Déploiement canari
Nous espérons que vous lirez la première partie, où nous avons brièvement expliqué ce que sont les déploiements Canary. Nous avons également montré comment l'implémenter à l'aide des ressources Kubernetes standard.
Déploiements Argo
Argo Rollouts est un contrôleur de déploiement natif Kubernetes. Il fournit un CRD (Custom Resource Definition) pour Kubernetes. Grâce à lui, nous pouvons utiliser une nouvelle entité : Rollout, qui gère les déploiements bleu-vert et canari avec diverses options de configuration.
Contrôleur Argo Rollouts utilisé par une ressource personnalisée Rollout, Permet des stratégies de déploiement supplémentaires telles que bleu-vert et Canary pour Kubernetes. Ressource Rollout offre une fonctionnalité équivalente Deployment, uniquement avec des stratégies de déploiement supplémentaires.
ressource Deployments dispose de deux stratégies de déploiement : RollingUpdate и Recreate. Bien que ces stratégies conviennent dans la plupart des cas, pour un déploiement sur des serveurs à très grande échelle, des stratégies supplémentaires sont utilisées, telles que bleu-vert ou canari, qui ne sont pas disponibles dans le contrôleur de déploiement. Pour utiliser ces stratégies dans Kubernetes, les utilisateurs devaient écrire des scripts en plus de leurs déploiements. Le contrôleur Argo Rollouts expose ces stratégies sous forme de paramètres simples, déclaratifs et configurables. https://argoproj.github.io/argo-rollouts
Il existe également Argo CI, qui fournit une interface Web pratique à utiliser avec les déploiements, nous y reviendrons dans le prochain article.
Dans notre navet d'infrastructure (voir ci-dessous), nous avons déjà ajouté install.yaml sous le nom i/k8s/argo-rollouts/install.yaml. De cette façon, GitlabCI l'installera dans le cluster.
Il s'agit d'une API Python+Flask très simple qui renvoie une réponse au format JSON. Nous allons construire le package à l'aide de GitlabCI et transférer le résultat vers le registre Gitlab. Dans le registre, nous avons deux versions différentes :
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
La seule différence entre eux est le fichier JSON renvoyé. Nous utilisons cette application pour visualiser le plus facilement possible avec quelle version nous communiquons.
Référentiel d'infrastructure
Dans ce référentiel, nous utiliserons GitlabCI pour le déploiement sur Kubernetes, .gitlab-ci.yml ressemble à ceci :
Rollout fonctionne de la même manière que le déploiement. Si nous ne définissons pas de stratégie de mise à jour (comme Canary ici), elle se comportera comme le déploiement de mise à jour continue par défaut.
Nous définissons deux étapes dans yaml pour le déploiement de Canary :
10 % du trafic vers Canary (attendre l'accord manuel)
50 % de trafic vers Canary (attendez 2 minutes puis continuez jusqu'à 100 %)
Effectuer le déploiement initial
Après le déploiement initial, nos ressources ressembleront à ceci :
Et nous obtenons une réponse uniquement à partir de la première version de l'application :
Effectuer un déploiement Canary
Étape 1 : 10 % de trafic
Pour démarrer un déploiement Canary, il suffit de changer la version de l'image comme nous le faisons habituellement avec les déploiements :
Je recommande vraiment cette vidéo, elle montre comment Argo Rollouts et Argo CI fonctionnent ensemble :
Total
J'aime beaucoup l'idée d'utiliser des CRD qui gèrent la création de types supplémentaires de déploiements ou de jeux de réplicas, redirigent le trafic, etc. Travailler avec eux se passe bien. Ensuite, j'aimerais tester l'intégration avec Argo CI.
Cependant, il semble y avoir une grande fusion entre Argo CI et Flux CI, donc je pourrais attendre la sortie de la nouvelle version : Flux d'Argo.
Avez-vous eu une expérience avec Argo Rollouts ou Argo CI ?