{"id":5131,"date":"2020-05-19T19:56:08","date_gmt":"2020-05-19T18:56:08","guid":{"rendered":"https:\/\/blog.fabianpiau.com\/?p=5131"},"modified":"2021-01-14T14:58:54","modified_gmt":"2021-01-14T14:58:54","slug":"flagger-canary-deployments-on-kubernetes","status":"publish","type":"post","link":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/","title":{"rendered":"Flagger &#8211; D\u00e9ploiements Canary sur Kubernetes"},"content":{"rendered":"<p><a class=\"lang\" href=\"https:\/\/blog.fabianpiau.com\/en\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/\" title=\"Read in english\"><strong class=\"labellang\"><span class=\"en\">&nbsp;<\/span>English version available<\/strong><\/a><\/p>\n<div class=\"info\"><strong class=\"label\">Mise \u00e0 jour<\/strong><br \/>\n<strong>17 Octobre 2020 : <\/strong> Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2).\n<\/div>\n<p class=\"right\" style=\"padding-left:15px;\"><a href=\"https:\/\/flagger.app\/\" target=\"_blank\" title=\"Logo Flagger\" rel=\"noopener noreferrer\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" title=\"Logo Flagger\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/flagger-logo.png?resize=180%2C180&#038;ssl=1\" alt=\"Logo Flagger\" width=\"180\" height=\"180\" \/><\/a><\/p>\n<p>Cet article est le deuxi\u00e8me de la s\u00e9rie consacr\u00e9e \u00e0 <a href=\"https:\/\/flagger.app\/\" target=\"_blank\" title=\"Flagger\" rel=\"noopener noreferrer\">Flagger<\/a>. En bref, Flagger est un outil de livraison progressive qui automatise le processus de livraison des applications s&rsquo;ex\u00e9cutant sur Kubernetes. Il r\u00e9duit le risque d&rsquo;introduire une nouvelle version logicielle en production en augmentant progressivement le trafic vers la nouvelle version tout en mesurant les m\u00e9triques et en ex\u00e9cutant des tests de conformit\u00e9.<\/p>\n<p>Assurez-vous d&rsquo;avoir un cluster Kubernetes avec le service mesh Istio qui tourne sur votre machine en local. Sinon, lisez <a href=\"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/02\/flagger-get-started-with-istio-and-kubernetes\/\" title=\"Flagger \u2013 Premiers pas avec Istio et Kubernetes\">le premier article: Flagger \u2013 Premiers pas avec Istio et Kubernetes<\/a>.<\/p>\n<p>Dans ce deuxi\u00e8me tutoriel, nous nous concentrerons sur l&rsquo;installation de Flagger et lancerons plusieurs d\u00e9ploiements canary de l&rsquo;application <a href=\"https:\/\/github.com\/eexit\/mirror-http-server\" target=\"_blank\" title=\"Mirror HTTP Server\" rel=\"noopener noreferrer\">Mirror HTTP Server<\/a> (MHS). N&rsquo;oubliez pas que cette application tr\u00e8s simple peut simuler des r\u00e9ponses valides ou invalides en fonction de la requ\u00eate en entr\u00e9e. C&rsquo;est exactement ce dont nous avons besoin pour tester les capacit\u00e9s de Flagger. Nous couvrirons \u00e0 la fois les sc\u00e9narios type \u00ab\u00a0happy path\u00a0\u00bb (rollout) et \u00ab\u00a0unhappy path\u00a0\u00bb (rollback).<\/p>\n<div class=\"info\"><strong class=\"label\">Remarque<\/strong><br \/>\nCe guide est un \u00ab\u00a0hands-on\u00a0\u00bb et peut \u00eatre suivi pas \u00e0 pas par les utilisateurs sous MacOS. Il n\u00e9cessitera quelques ajustements si vous utilisez un PC sous Windows ou Linux. Il est important de signaler que cet article ne s&rsquo;attardera pas sur les concepts et technologies en d\u00e9tail donc si vous n&rsquo;\u00eates pas familier avec Docker, Kubernetes, Helm ou Istio, je vous conseille fortement de vous documenter avant de poursuivre votre lecture.\n<\/div>\n<p><br clear=\"none\" \/><\/p>\n<h4>Installation de Flagger<\/h4>\n<p>Installons Flagger en ex\u00e9cutant ces commandes.<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> create ns flagger-system<br \/><\/div>\n\n<p>Nous installons Flagger dans son propre namespace <code>flagger-system<\/code>.<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">helm<\/span> repo add flagger https:\/\/flagger.app<br \/><span class=\"wp-shkshell-prompt\"><\/span> <br \/><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> apply -f https:\/\/raw.githubusercontent.com\/weaveworks\/flagger\/master\/artifacts\/flagger\/crd.yaml<br \/><span class=\"wp-shkshell-prompt\"><\/span> <br \/><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">helm<\/span> upgrade -i flagger flagger\/flagger \\<br \/>--namespace=flagger-system \\<br \/>--set crd.create=false \\<br \/>--set meshProvider=istio \\<br \/>--set metricsServer=http:\/\/prometheus.istio-system:9090<br \/><\/div>\n\n<blockquote><p>\nR\u00e9f\u00e9rence: <a href=\"https:\/\/docs.flagger.app\/install\/flagger-install-on-kubernetes\" target=\"_blank\" title=\"Installation de Flagger sur Kubernetes\" rel=\"noopener noreferrer\">Installation de Flagger sur Kubernetes<\/a><br \/>\nFlagger d\u00e9pend des m\u00e9triques fournies par Istio et de Prometheus (dans notre cas, nous supposons qu&rsquo;Istio est install\u00e9 dans le namespace <code>istio-system<\/code>).<br \/>\nTous les param\u00e8tres d&rsquo;installation sont disponibles dans <a href=\"https:\/\/github.com\/fluxcd\/flagger\/blob\/main\/charts\/flagger\/README.md\" target=\"_blank\" title=\"Fichier readme de Flagger sur GitHub\" rel=\"noopener noreferrer\">le fichier readme de Flagger sur GitHub<\/a>.<br \/>\nNous ne sp\u00e9cifions pas le num\u00e9ro de version, ce qui signifie que l&rsquo;on utilisera la derni\u00e8re version disponible dans le repository (<code>1.2.0<\/code> lorsque j&rsquo;\u00e9cris cet article).\n<\/p><\/blockquote>\n<p>Apr\u00e8s quelques secondes, vous devriez recevoir un message confirmant que Flagger a \u00e9t\u00e9 install\u00e9. Depuis le Kube dashboard, v\u00e9rifiez qu&rsquo;un nouveau namespace <code>flagger-system<\/code> a bien \u00e9t\u00e9 cr\u00e9\u00e9 et que le pod Flagger est en cours d&rsquo;ex\u00e9cution.<\/p>\n<div style=\"max-width: 560px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/flagger-deployed-new.png?ssl=1\" rel=\"shadowbox[sbpost-5131];player=img;\" title=\"Flagger est d\u00e9ploy\u00e9 dans votre cluster\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/flagger-deployed-new-thumbnail.png?resize=550%2C316&#038;ssl=1\" alt=\"Flagger est d\u00e9ploy\u00e9 dans votre cluster\" title=\"Flagger est d\u00e9ploy\u00e9 dans votre cluster\" width=\"550\" height=\"316\" class=\"size-medium wp-image-257\" \/><\/a><p class=\"wp-caption-text\">Flagger est d\u00e9ploy\u00e9 dans votre cluster<\/p><\/div>\n<p><br clear=\"none\" \/><\/p>\n<h4>Exp\u00e9rience 0 &#8211; Initialisation avec le d\u00e9ploiement canary de MHS v1.1.1<\/h4>\n<p>Mirror HTTP Server est <a href=\"https:\/\/hub.docker.com\/r\/eexit\/mirror-http-server\/tags\" target=\"_blank\" title=\"Tags MHS\" rel=\"noopener noreferrer\">disponible en plusieurs versions<\/a>. Pour tester la fonctionnalit\u00e9 de d\u00e9ploiement canary de Flagger, nous basculerons entre la version <code>1.1.1<\/code>, <code>1.1.2<\/code> et <code>1.1.3<\/code> de MHS (la derni\u00e8re version lorsque j&rsquo;\u00e9cris cet article).<\/p>\n<p>Avant de d\u00e9ployer MHS, cr\u00e9ons un nouveau namespace <code>application<\/code>, nous ne voulons pas utiliser celui par d\u00e9faut \u00e0 la racine du cluster (c&rsquo;est une bonne pratique). Le nom est un peu trop g\u00e9n\u00e9rique, mais suffisant pour ce tutoriel, en g\u00e9n\u00e9ral vous utiliserez le nom de l&rsquo;\u00e9quipe ou le nom d&rsquo;un regroupement de fonctionnalit\u00e9s.<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> create ns application<br \/><\/div>\n\n<p>N&rsquo;oublions pas d&rsquo;activer Istio sur ce nouveau namespace:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> label namespace application istio-injection=enabled<br \/><\/div>\n\n<p>Pour d\u00e9ployer MHS via Flagger, j&rsquo;ai cr\u00e9\u00e9 un <a href=\"https:\/\/helm.sh\/docs\/topics\/charts\/\" target=\"_blank\" title=\"Helm Chart\" rel=\"noopener noreferrer\">Helm chart<\/a>.<\/p>\n<p><a href=\"https:\/\/github.com\/fabianpiau\/mhs-canary-chart\" target=\"_blank\" title=\"MHS Canary Helm Chart\" rel=\"noopener noreferrer\">Ce chart de \u00ab\u00a0type canary\u00a0\u00bb<\/a> a \u00e9t\u00e9 cr\u00e9\u00e9 en se basant sur <a href=\"https:\/\/github.com\/fabianpiau\/mhs-chart\" target=\"_blank\" title=\"MHS Helm Chart\" rel=\"noopener noreferrer\">le chart pr\u00e9c\u00e9dent sans Flagger<\/a> qui lui-m\u00eame avait \u00e9t\u00e9 cr\u00e9\u00e9 avec la commande <code>helm create mhs-chart<\/code>, puis adapt\u00e9. Dans ce chart de \u00ab\u00a0type canary\u00a0\u00bb, j&rsquo;ai fait quelques ajustements suppl\u00e9mentaires <a href=\"https:\/\/github.com\/fabianpiau\/mhs-canary-chart\/commit\/8947788253a1b02e91eaca6ed46d5f89d5b6dc5e\" target=\"_blank\" title=\"Premier commit\" rel=\"noopener noreferrer\">pour utiliser 2 r\u00e9pliquas au lieu de 1 pour rendre le d\u00e9ploiement plus r\u00e9aliste et utiliser la version <code>1.1.1<\/code><\/a>, j&rsquo;ai \u00e9galement <a href=\"https:\/\/github.com\/fabianpiau\/mhs-canary-chart\/commit\/e92d8fcc3fa1257bd02370eaae17dcc9fde76378\" target=\"_blank\" title=\"Second commit\" rel=\"noopener noreferrer\">ajout\u00e9 la ressource canary<\/a> o\u00f9 la magie op\u00e8re.<\/p>\n<p>Clonez le repo contenant le chart:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">git<\/span> clone https:\/\/github.com\/fabianpiau\/mhs-canary-chart.git<br \/><\/div>\n\n<p>Et installez MHS:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">cd<\/span> mhs-canary-chart<br \/>helm install --name mhs --namespace application .\/mhs<br \/><\/div>\n\n<p>Apr\u00e8s quelques instants, si vous regardez le tableau de bord, vous devriez voir 2 r\u00e9pliquas de MHS dans le namespace <code>application<\/code>.<\/p>\n<div style=\"max-width: 560px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/mhs-1.1.1-deployed-new.png?ssl=1\" rel=\"shadowbox[sbpost-5131];player=img;\" title=\"MHS 1.1.1 est d\u00e9ploy\u00e9 dans votre cluster\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/mhs-1.1.1-deployed-new-thumbnail.png?resize=550%2C315&#038;ssl=1\" alt=\"MHS 1.1.1 est d\u00e9ploy\u00e9 dans votre cluster\" title=\"MHS 1.1.1 est d\u00e9ploy\u00e9 dans votre cluster\" width=\"550\" height=\"315\" class=\"size-medium wp-image-257\" \/><\/a><p class=\"wp-caption-text\">MHS 1.1.1 est d\u00e9ploy\u00e9 dans votre cluster<\/p><\/div>\n<blockquote><p>\nIl est important de noter qu&rsquo;aucune analyse canary n&rsquo;a \u00e9t\u00e9 effectu\u00e9e et que la version a \u00e9t\u00e9 automatiquement promue. Ce n&rsquo;\u00e9tait pas un \u00ab\u00a0vrai\u00a0\u00bb d\u00e9ploiement canary.<br \/>\nPourquoi? Parce que Flagger a besoin de s&rsquo;initialiser la premi\u00e8re fois que nous faisons un d\u00e9ploiement canary de l&rsquo;application. Assurez-vous donc que la version que vous d\u00e9ployez avec Flagger la premi\u00e8re fois est enti\u00e8rement test\u00e9e et fonctionne bien!<br \/>\nVous pouvez \u00e9galement penser que cette promotion automatique s&rsquo;est produite, car il n&rsquo;y avait pas de version initiale de l&rsquo;application dans le cluster. Bien que ce soit \u00e9videmment une bonne raison, il est important de noter que, m\u00eame si nous avions une version pr\u00e9c\u00e9dente auparavant (par exemple <code>1.1.0<\/code>), la version canary <code>1.1.1<\/code> aurait aussi \u00e9t\u00e9 automatiquement promue sans analyse.\n<\/p><\/blockquote>\n<p>Vous pouvez quand m\u00eame consulter les \u00e9v\u00e9nements canary avec:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> -n application describe canary\/mhs<br \/><\/div>\n\n<p>Vous devriez avoir une sortie similaire sans analyse canary:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">Events<\/span>:<br \/>Type     Reason  Age                  From     Message<br \/>----     ------  ----                 ----     -------<br \/>Warning  Synced  2m29s                flagger  mhs-primary.application not ready: waiting for rollout to finish: observed deployment generation less then desired generation<br \/>Normal   Synced  92s (x2 over 2m30s)  flagger  all the metrics providers are available!<br \/>Normal   Synced  92s                  flagger  Initialization done! mhs.application<br \/><\/div>\n\n<p>Ou vous pouvez \u00e9galement consulter directement les logs de Flagger:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">export<\/span> FLAGGER_POD_NAME=$(<span class=\"wp-shkshell-command\">kubectl<\/span> get pods --namespace flagger-system -l <span class=\"wp-shkshell-string\">\"app.kubernetes.io\/name=flagger,app.kubernetes.io\/instance=flagger\"<\/span> -o jsonpath=\"{.items[<span class=\"wp-shkshell-command\">0<\/span>].metadata.name}\")<br \/><span class=\"wp-shkshell-prompt\"><\/span> <br \/><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> -n flagger-system logs <span class=\"wp-shkshell-variable\">$FLAGGER_POD_NAME<\/span><br \/><\/div>\n\n<p>Si vous regardez de plus pr\u00e8s le tableau de bord Kube, vous devriez voir plusieurs ressources <code>mhs<\/code> et <code>mhs-primary<\/code>:<\/p>\n<ul>\n<li><code>mhs-primary<\/code> sont les instances principales (c.-\u00e0-d. non canary). Flagger ajoute automatiquement le suffixe <code>-primary<\/code> pour les diff\u00e9rencier des instances canary.<\/li>\n<li><code>mhs<\/code> sont les instances canary. Elles n&rsquo;existent que pendant le d\u00e9ploiement et dispara\u00eetront une fois le d\u00e9ploiement canary termin\u00e9. C&rsquo;est pourquoi, dans la capture d&rsquo;\u00e9cran ci-dessus, vous ne voyez pas de pod <code>mhs<\/code> canary (c.-\u00e0-d. 0\/0 pod).<\/li>\n<\/ul>\n<blockquote><p>\nPourquoi cette convention de nommage? J&rsquo;ai demand\u00e9 directement \u00e0 l&rsquo;\u00e9quipe de Flagger et il y a <a href=\"https:\/\/github.com\/fluxcd\/flagger\/issues\/522\" title=\"Use of a -canary suffix for the canary pods instead of a -primary suffix on the normal pods\" target=\"_blank\" rel=\"noopener noreferrer\">une contrainte technique<\/a>.\n<\/p><\/blockquote>\n<p>Flagger est maintenant correctement initialis\u00e9 et MHS est d\u00e9ploy\u00e9 sur votre cluster. Vous pouvez utiliser le terminal pour confirmer que MHS est accessible (gr\u00e2ce \u00e0 la <a href=\"https:\/\/github.com\/fabianpiau\/mhs-canary-chart\/blob\/master\/mhs\/templates\/gateway.yaml\" title=\"Istio Gateway for MHS\" target=\"_blank\" rel=\"noopener noreferrer\">Passerelle Istio<\/a>):<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">curl<\/span> -I -H Host:mhs.example.com <span class=\"wp-shkshell-string\">'http:\/\/localhost'<\/span><br \/><\/div>\n\n<p>Vous devriez recevoir une r\u00e9ponse HTTP 200 OK:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">HTTP<\/span>\/1.1 200 OK<br \/>x-powered-by: Express<br \/>date: Sun, 17 May 2020 16:47:33 GMT<br \/>x-envoy-upstream-service-time: 10<br \/>server: istio-envoy<br \/>transfer-encoding: chunked<br \/><\/div>\n\n<p>Et:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">curl<\/span> -I -H Host:mhs.example.com -H X-Mirror-Code:500 <span class=\"wp-shkshell-string\">'http:\/\/localhost'<\/span><br \/><\/div>\n\n<p>devrait retourner une r\u00e9ponse HTTP 500:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">HTTP<\/span>\/1.1 500 Internal Server Error<br \/>x-powered-by: Express<br \/>date: Sun, 17 May 2020 16:48:09 GMT<br \/>x-envoy-upstream-service-time: 12<br \/>server: istio-envoy<br \/>transfer-encoding: chunked<br \/><\/div>\n\n<p><br clear=\"none\" \/><\/p>\n<h4>Exp\u00e9rience 1 &#8211; D\u00e9ploiement canary de MHS v1.1.2<\/h4>\n<p>Nous allons installer une version plus r\u00e9cente <code>1.1.2<\/code>. Vous devez \u00e9diter manuellement le fichier <code>mhs-canary-chart\/mhs\/values.yaml<\/code> et remplacer <code>tag: 1.1.1<\/code> par <code>tag: 1.1.2<\/code> (<a href=\"https:\/\/github.com\/fabianpiau\/mhs-canary-chart\/blob\/master\/mhs\/values.yaml#L9\" target=\"_blank\" title=\"Ligne \u00e0 mettre \u00e0 jour\" rel=\"noopener noreferrer\">cette ligne<\/a>).<\/p>\n<p>Ensuite:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">cd<\/span> mhs-canary-chart<br \/>helm upgrade mhs --namespace application .\/mhs<br \/><\/div>\n\n<p>Alors que le d\u00e9ploiement canary est en cours, il est tr\u00e8s important de g\u00e9n\u00e9rer du trafic vers MHS. Sans trafic, Flagger consid\u00e9rera que quelque chose s&rsquo;est mal pass\u00e9 avec la nouvelle version et fera un rollback automatique pour retourner \u00e0 la pr\u00e9c\u00e9dente version. Evidemment, vous n&rsquo;aurez pas besoin de cette \u00e9tape suppl\u00e9mentaire dans un environnement de production qui re\u00e7oit en permanence du trafic r\u00e9el.<\/p>\n<p>Ex\u00e9cutez cette commande dans un autre terminal pour g\u00e9n\u00e9rer ce trafic artificiel:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">while<\/span> (true)<span class=\"wp-shkshell-special\">;<\/span> <span class=\"wp-shkshell-command\">do<\/span> curl -I -H Host:mhs.example.com <span class=\"wp-shkshell-string\">'http:\/\/localhost'<\/span> <span class=\"wp-shkshell-special\">;<\/span> <span class=\"wp-shkshell-command\">sleep<\/span> 0.5 <span class=\"wp-shkshell-special\">;<\/span> <span class=\"wp-shkshell-command\">done<\/span><br \/><\/div>\n\n<p>V\u00e9rifiez le Kube dashboard, vous devriez voir le pod canary avec la nouvelle version <code>1.1.2<\/code> \u00e0 un moment donn\u00e9:<\/p>\n<div style=\"max-width: 560px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/mhs-1.1.2-canary-deployment-in-progress-new.png?ssl=1\" rel=\"shadowbox[sbpost-5131];player=img;\" title=\"MHS 1.1.2 en cours de d\u00e9ploiement canary dans votre cluster\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/mhs-1.1.2-canary-deployment-in-progress-new-thumbnail.png?resize=550%2C315&#038;ssl=1\" alt=\"MHS 1.1.2 en cours de d\u00e9ploiement canary dans votre cluster\" title=\"MHS 1.1.2 en cours de d\u00e9ploiement canary dans votre cluster\" width=\"550\" height=\"315\" class=\"size-medium wp-image-257\" \/><\/a><p class=\"wp-caption-text\">MHS 1.1.2 en cours de d\u00e9ploiement canary dans votre cluster<\/p><\/div>\n<p>V\u00e9rifiez les \u00e9v\u00e9nements canary avec la m\u00eame commande que pr\u00e9c\u00e9demment:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> -n application describe canary\/mhs<br \/><\/div>\n\n<p>Apr\u00e8s un certain temps (environ 6 minutes), vous devriez avoir une sortie d&rsquo;\u00e9v\u00e9nements similaire:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">Events<\/span>:<br \/>Type     Reason  Age                From     Message<br \/>----     ------  ----               ----     -------<br \/>Warning  Synced  30m                flagger  mhs-primary.application not ready: waiting for rollout to finish: observed deployment generation less then desired generation<br \/>Normal   Synced  29m (x2 over 30m)  flagger  all the metrics providers are available!<br \/>Normal   Synced  29m                flagger  Initialization done! mhs.application<br \/>Normal   Synced  10m                flagger  New revision detected! Scaling up mhs.application<br \/>Normal   Synced  9m16s              flagger  Starting canary analysis for mhs.application<br \/>Normal   Synced  9m16s              flagger  Advance mhs.application canary weight 10<br \/>Normal   Synced  8m16s              flagger  Advance mhs.application canary weight 20<br \/>Normal   Synced  7m16s              flagger  Advance mhs.application canary weight 30<br \/>Normal   Synced  6m16s              flagger  Advance mhs.application canary weight 40<br \/>Normal   Synced  5m16s              flagger  Advance mhs.application canary weight 50<br \/>Normal   Synced  4m16s              flagger  Copying mhs.application template spec to mhs-primary.application<br \/>Normal   Synced  3m16s              flagger  Routing all traffic to primary<br \/>Normal   Synced  2m16s              flagger  (combined from similar events): Promotion completed! Scaling down mhs.application<br \/><\/div>\n\n<p>La livraison canary s&rsquo;est d\u00e9roul\u00e9e avec succ\u00e8s. Vous avez maintenant la version <code>1.1.2<\/code> install\u00e9e sur tous les pods primary et le pod canary a \u00e9t\u00e9 supprim\u00e9.<\/p>\n<div style=\"max-width: 560px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/mhs-1.1.2-deployed-new.png?ssl=1\" rel=\"shadowbox[sbpost-5131];player=img;\" title=\"MHS 1.1.2 est d\u00e9ploy\u00e9 dans votre cluster\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/post\/00096\/mhs-1.1.2-deployed-new-thumbnail.png?resize=550%2C315&#038;ssl=1\" alt=\"MHS 1.1.2 est d\u00e9ploy\u00e9 dans votre cluster\" title=\"MHS 1.1.2 est d\u00e9ploy\u00e9 dans votre cluster\" width=\"550\" height=\"315\" class=\"size-medium wp-image-257\" \/><\/a><p class=\"wp-caption-text\">MHS 1.1.2 est d\u00e9ploy\u00e9 dans votre cluster<\/p><\/div>\n<blockquote><p>\nPourquoi ce d\u00e9ploiement a-t-il dur\u00e9 environ 6 minutes? Parce qu&rsquo;il inclut une analyse canary de 5 minutes. Au cours de cette analyse, le trafic a \u00e9t\u00e9 augment\u00e9 de mani\u00e8re progressive vers le pod canary. Le trafic canary a augment\u00e9 de 10% toutes les 1 minute jusqu&rsquo;\u00e0 atteindre 50% du trafic global. L&rsquo;analyse est configurable et d\u00e9finie dans le <a href=\"https:\/\/github.com\/fabianpiau\/mhs-canary-chart\/blob\/master\/mhs\/templates\/canary.yaml\" target=\"_blank\" title=\"Ressource canary\" rel=\"noopener noreferrer\">fichier canary.yaml<\/a> qui a \u00e9t\u00e9 ajout\u00e9 au chart.\n<\/p><\/blockquote>\n<p>Voici la configuration de l&rsquo;analyse:<\/p>\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\r\n  analysis:\r\n    # intervalle entre chaque incr\u00e9mentation de trafic et prises des mesures\r\n    interval: 1m\r\n    # pourcentage de trafic max rout\u00e9 vers le canary - pourcentage (0-100)\r\n    maxWeight: 50\r\n    # pas d'incr\u00e9ment canary - pourcentage (0-100)\r\n    stepWeight: 10\r\n    # nombre maximum d'\u00e9checs de v\u00e9rification des m\u00e9triques avant un rollback (global pour toutes les prises de mesures)\r\n    threshold: 5\r\n    metrics:\r\n      - name: request-success-rate\r\n        # pourcentage avant que le taux de r\u00e9ussite soit consid\u00e9r\u00e9 comme ayant \u00e9chou\u00e9 (0-100)\r\n        thresholdRange:\r\n          min: 99\r\n        # intervalle entre chaque prise de mesure de la m\u00e9trique taux de r\u00e9ussite\r\n        interval: 30s\r\n      - name: request-duration\r\n        # dur\u00e9e maximale P99 en millisecondes avant que le temps de r\u00e9ponse soit consid\u00e9r\u00e9 comme ayant \u00e9chou\u00e9\r\n        thresholdRange:\r\n          max: 500\r\n        # intervalle entre chaque prise de mesure de la m\u00e9trique temps de r\u00e9ponse\r\n        interval: 30s\r\n<\/pre>\n<blockquote><p>\nNotre analyse canary utilise les 2 m\u00e9triques de base fournies par Istio \/ Prometheus (taux de r\u00e9ussite + temps de r\u00e9ponse). Il est possible de d\u00e9finir vos propres m\u00e9triques personnalis\u00e9es. Dans ce cas, elles devront \u00eatre fournies par votre application. Votre application devra exposer un endpoint Prometheus qui inclura vos m\u00e9triques personnalis\u00e9es. Et vous pourrez <a href=\"https:\/\/docs.flagger.app\/usage\/metrics#prometheus\" target=\"_blank\" title=\"M\u00e9triques personnalis\u00e9es dans l'analyse canary\" rel=\"noopener noreferrer\">mettre \u00e0 jour la configuration de l&rsquo;analyse de Flagger pour les utiliser avec votre propre requ\u00eate PromQL<\/a>. Notez que cela va au-del\u00e0 de ce guide qui utilise uniquement les m\u00e9triques de base.\n<\/p><\/blockquote>\n<p><br clear=\"none\" \/><\/p>\n<h4>Exp\u00e9rience 2 &#8211; D\u00e9ploiement canary  de MHS version v1.1.3<\/h4>\n<p>Encore une fois, vous devez \u00e9diter manuellement le fichier <code>mhs-canary-chart\/mhs\/values.yaml<\/code> et remplacer la ligne <code>tag: 1.1.2<\/code> par <code>tag: 1.1.3<\/code>.<\/p>\n<p>Ensuite:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">cd<\/span> mhs-canary-chart<br \/>helm upgrade mhs --namespace application .\/mhs<br \/><\/div>\n\n<p>Nous g\u00e9n\u00e9rons du trafic artificiel:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">while<\/span> (true)<span class=\"wp-shkshell-special\">;<\/span> <span class=\"wp-shkshell-command\">do<\/span> curl -I -H Host:mhs.example.com <span class=\"wp-shkshell-string\">'http:\/\/localhost'<\/span> <span class=\"wp-shkshell-special\">;<\/span>  curl -I -H Host:mhs.example.com -H X-Mirror-Code:500 <span class=\"wp-shkshell-string\">'http:\/\/localhost'<\/span> <span class=\"wp-shkshell-special\">;<\/span> <span class=\"wp-shkshell-command\">sleep<\/span> 0.5 <span class=\"wp-shkshell-special\">;<\/span> <span class=\"wp-shkshell-command\">done<\/span><br \/><\/div>\n\n<blockquote><p>\nCette fois, nous g\u00e9n\u00e9rons \u00e9galement du trafic non valide pour nous assurer que le taux de r\u00e9ussite des requ\u00eates diminue!\n<\/p><\/blockquote>\n<p>V\u00e9rifiez les \u00e9v\u00e9nements canary avec la m\u00eame commande que pr\u00e9c\u00e9demment:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> -n application describe canary\/mhs<br \/><\/div>\n\n<p>Apr\u00e8s un certain temps (environ 6 minutes), vous devriez avoir une sortie d&rsquo;\u00e9v\u00e9nements similaire:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">Normal<\/span>   Synced  8m23s (x2 over 20m)  flagger  New revision detected! Scaling up mhs.application<br \/>Normal   Synced  7m23s (x2 over 19m)  flagger  Advance mhs.application canary weight 10<br \/>Normal   Synced  7m23s (x2 over 19m)  flagger  Starting canary analysis for mhs.application<br \/>Warning  Synced  6m23s                flagger  Halt mhs.application advancement success rate 57.14% <span class=\"wp-shkshell-special\"><<\/span> 99%<br \/>Warning  Synced  5m24s                flagger  Halt mhs.application advancement success rate 0.00% <span class=\"wp-shkshell-special\"><<\/span> 99%<br \/>Warning  Synced  3m24s                flagger  Halt mhs.application advancement success rate 71.43% <span class=\"wp-shkshell-special\"><<\/span> 99%<br \/>Warning  Synced  2m24s                flagger  Halt mhs.application advancement success rate 50.00% <span class=\"wp-shkshell-special\"><<\/span> 99%<br \/>Warning  Synced  84s                  flagger  Halt mhs.application advancement success rate 63.64% <span class=\"wp-shkshell-special\"><<\/span> 99%<br \/>Warning  Synced  24s                  flagger  Rolling back mhs.application failed checks threshold reached 5<br \/>Warning  Synced  24s                  flagger  Canary failed! Scaling down mhs.application<br \/><\/div>\n\n<p>Et vous \u00eates toujours sur la version <code>1.1.2<\/code>.<\/p>\n<blockquote><p>\nFlagger a d\u00e9cid\u00e9 de stopper et ne pas propager la version <code>1.1.3<\/code> car il n&rsquo;a pas pu effectuer une analyse canary r\u00e9ussie et le seuil d&rsquo;erreur a \u00e9tait atteint, 5 fois (en effet, \u00e0 chaque fois, environ 50% des requ\u00eates se sont termin\u00e9es par une r\u00e9ponse HTTP 500). Flagger a simplement redirig\u00e9 tout le trafic vers les instances primary et supprim\u00e9 le pod canary.\n<\/p><\/blockquote>\n<p>F\u00e9licitations, vous \u00eates arriv\u00e9 \u00e0 la fin de ce deuxi\u00e8me tutoriel!<\/p>\n<p><br clear=\"none\" \/><\/p>\n<h4>Observations<\/h4>\n<p>Avant de faire du nettoyage dans notre cluster, terminons par une liste d&rsquo;observations:<\/p>\n<ul>\n<li>La suppression d&rsquo;un d\u00e9ploiement supprimera tous les pods (canary \/ primary). Et nous ne nous retrouvons pas avec des ressources orphelines.<\/li>\n<li>Prometheus est un pr\u00e9requis. Sans lui, l&rsquo;analyse canary ne fonctionnera pas.<\/li>\n<li>Il n&rsquo;est pas possible de relancer un d\u00e9ploiement canary sur la m\u00eame version s&rsquo;il vient d&rsquo;\u00e9chouer. Cela vous oblige \u00e0 changer et incr\u00e9menter la version (m\u00eame s&rsquo;il s&rsquo;agissait d&rsquo;un probl\u00e8me de configuration et non d&rsquo;un probl\u00e8me de code).<\/li>\n<li>Le processus de d\u00e9sactivation de Flagger n&rsquo;est pas aussi simple que de supprimer la ressource canary du chart et de d\u00e9ployer une nouvelle version. Si vous supprimez la ressource canary, Flagger ne d\u00e9clenchera pas le processus canary, il changera la version dans <code>mhs<\/code> et supprimera <code>mhs-primary<\/code> mais, <code>mhs<\/code> a 0 pod, ce qui rendra votre service indisponible! Vous devez \u00eatre prudent et adopter un processus de d\u00e9sactivation manuelle appropri\u00e9. R\u00e9cement, l&rsquo;\u00e9quipe Flagger a ajout\u00e9 une propri\u00e9t\u00e9 <code>revertOnDeletion<\/code> que vous pouvez activer pour pallier \u00e0 ce probl\u00e8me. Vous pouvez vous r\u00e9f\u00e9rer \u00e0 la doc pour <a href=\"https:\/\/docs.flagger.app\/usage\/how-it-works#canary-finalizers\" target=\"_blank\" title=\"Flagger canary finalizer\" rel=\"noopener noreferrer\">plus de d\u00e9tail sur ce canary finalizer<\/a>.<\/li>\n<li>Apr\u00e8s plusieurs d\u00e9ploiements, il semble que certains \u00e9v\u00e9nements peuvent manquer, la commande Kubernetes <code>describe<\/code> les accumule (<code>x&lt;int&gt; over &lt;int&gt;m<\/code>) et parfois, l&rsquo;ordre n&rsquo;est pas conserv\u00e9 et\/ou certains \u00e9v\u00e9nements ne s&rsquo;affichent pas. Vous pouvez consulter le statut Flagger concernant la phase du canary (les \u00e9tats finis sont <code>Initialized<\/code>, <code>Succeeded<\/code> ou <code>Failed<\/code>). Le mieux est de regarder directement les logs sur le pod Flagger, car elles sont toujours plus pr\u00e9cises et compl\u00e8tes.<\/li>\n<li>L&rsquo;analyse canary doit \u00eatre configur\u00e9e pour s&rsquo;ex\u00e9cuter sur une courte p\u00e9riode (c.-\u00e0-d. pas plus de 30 minutes) pour tirer profit d&rsquo;un v\u00e9ritable d\u00e9ploiement continu et \u00e9viter de publier une nouvelle version alors qu&rsquo;un d\u00e9ploiement canary pour la pr\u00e9c\u00e9dente est toujours en cours. Dans le cas o\u00f9 vous souhaitez tester une version canary sur plusieurs heures ou m\u00eame jours, vous devriez peut-\u00eatre repenser votre cas d&rsquo;utilisation et Flagger pourrait ne pas \u00eatre le meilleur choix.<\/li>\n<li>Nous l&rsquo;avons d\u00e9j\u00e0 mentionn\u00e9, mais c&rsquo;est important: la premi\u00e8re fois que vous d\u00e9ployez avec Flagger (comme avec l&rsquo;exp\u00e9rience 0), l&rsquo;outil doit s&rsquo;initialiser (statut <code>Initialized<\/code>) et n&rsquo;effectuera aucune analyse.<\/li>\n<\/ul>\n<p><br clear=\"none\" \/><\/p>\n<h4>Nettoyage des ressources<\/h4>\n<p>Vous pouvez supprimer l&rsquo;application MHS et son namespace.<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">helm<\/span> delete mhs --namespace application<br \/><span class=\"wp-shkshell-prompt\"><\/span> <br \/><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> delete namespaces application<br \/><\/div>\n\n<p>Nous vous recommandons de laisser Flagger et Istio en place pour gagner du temps dans le prochain tutoriel. Si toutefois vous souhaitez tout supprimer maintenant, vous pouvez ex\u00e9cuter les commandes suivantes.<\/p>\n<p>Supprimer Flagger:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">helm<\/span> delete flagger --namespace flagger-system<br \/><span class=\"wp-shkshell-prompt\"><\/span> <br \/><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> delete namespaces flagger-system<br \/><\/div>\n\n<p>Supprimer Istio et Prometheus:<\/p>\n\n<div class=\"wp-shkshell\"><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> delete -f https:\/\/raw.githubusercontent.com\/istio\/istio\/release-1.7\/samples\/addons\/prometheus.yaml<br \/><span class=\"wp-shkshell-prompt\"><\/span> <br \/><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">istioctl<\/span> manifest generate --set profile=demo <span class=\"wp-shkshell-special\">|<\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> delete -f -<br \/><span class=\"wp-shkshell-prompt\"><\/span> <br \/><span class=\"wp-shkshell-prompt\"><\/span> <span class=\"wp-shkshell-command\">kubectl<\/span> delete namespaces istio-system<br \/><\/div>\n\n<p><br clear=\"none\" \/><\/p>\n<h4>Et apr\u00e8s?<\/h4>\n<p>Le <a href=\"https:\/\/blog.fabianpiau.com\/fr\/2020\/06\/28\/flagger-monitor-your-canary-deployments-with-grafana\/\" title=\"Flagger \u2013 Monitorer vos d\u00e9ploiements Canary avec Grafana\">prochain article<\/a> se concentrera sur le <a href=\"https:\/\/grafana.com\/\" target=\"_blank\" title=\"Site de Grafana\" rel=\"noopener noreferrer\">Tableau de bord Grafana<\/a> fourni pr\u00eat \u00e0 l&#8217;emploi par Flagger qui est un ajout int\u00e9ressant. Il vous fera gagner du temps, car vous n&rsquo;aurez pas besoin d&rsquo;ex\u00e9cuter manuellement des commandes <code>kuberctl<\/code> pour v\u00e9rifier le r\u00e9sultat de vos d\u00e9ploiements canary. Stay tuned! En attendant, vous pouvez arr\u00eater le cluster Kubernetes en d\u00e9cochant la case et red\u00e9marrant Docker Desktop. Votre ordinateur peut prendre une pause bien m\u00e9rit\u00e9e.<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp;English version available Mise \u00e0 jour 17 Octobre 2020 : Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article est le deuxi\u00e8me de la s\u00e9rie consacr\u00e9e \u00e0 Flagger. En bref, Flagger est un outil de livraison progressive qui automatise le processus de livraison des applications s&rsquo;ex\u00e9cutant sur Kubernetes. Il [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5126,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[110,292,289,291,290,288],"class_list":["post-5131","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-agile-programming","tag-cloud","tag-docker","tag-flagger","tag-helm","tag-istio","tag-kubernetes"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flagger - D\u00e9ploiements Canary sur Kubernetes | CarmaBlog<\/title>\n<meta name=\"description\" content=\"&nbsp;English version available Mise \u00e0 jour 17 Octobre 2020 : Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flagger - D\u00e9ploiements Canary sur Kubernetes | CarmaBlog\" \/>\n<meta property=\"og:description\" content=\"&nbsp;English version available Mise \u00e0 jour 17 Octobre 2020 : Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/\" \/>\n<meta property=\"og:site_name\" content=\"CarmaBlog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/fabian.piau\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/fabian.piau\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-19T18:56:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-14T14:58:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i2.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2020\/05\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Fabian Piau\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@fabianpiau\" \/>\n<meta name=\"twitter:site\" content=\"@fabianpiau\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fabian Piau\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/\"},\"author\":{\"name\":\"Fabian Piau\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\"},\"headline\":\"Flagger &#8211; D\u00e9ploiements Canary sur Kubernetes\",\"datePublished\":\"2020-05-19T18:56:08+00:00\",\"dateModified\":\"2021-01-14T14:58:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/\"},\"wordCount\":4099,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1\",\"keywords\":[\"cloud\",\"docker\",\"flagger\",\"helm\",\"istio\",\"kubernetes\"],\"articleSection\":[\"Programmation agile\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/\",\"url\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/\",\"name\":\"Flagger - D\u00e9ploiements Canary sur Kubernetes | CarmaBlog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1\",\"datePublished\":\"2020-05-19T18:56:08+00:00\",\"dateModified\":\"2021-01-14T14:58:54+00:00\",\"description\":\"&nbsp;English version available Mise \u00e0 jour 17 Octobre 2020 : Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[[\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/\"]]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2020\\\/05\\\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1\",\"width\":300,\"height\":300,\"caption\":\"kubernetes\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/2020\\\/05\\\/19\\\/flagger-canary-deployments-on-kubernetes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Homepage\",\"item\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programmation agile\",\"item\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/category\\\/agile-programming\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Flagger &#8211; D\u00e9ploiements Canary sur Kubernetes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/\",\"name\":\"CarmaBlog\",\"description\":\"Agilit\u00e9, D\u00e9veloppement Java, Nouvelles technologies et plus...\",\"publisher\":{\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/blog.fabianpiau.com\\\/fr\\\/#\\\/schema\\\/person\\\/c5cbffd7cf0b10117877f5dfd1b35f14\",\"name\":\"Fabian Piau\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\",\"width\":567,\"height\":667,\"caption\":\"Fabian Piau\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/blog.fabianpiau.com\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/fabian-pro-small.jpg?fit=567%2C667&ssl=1\"},\"description\":\"D\u00e9veloppeur Java, Fabian s'int\u00e9resse aux nouvelles technologies et plus particuli\u00e8rement \u00e0 leur utilisation dans un contexte agile.\",\"sameAs\":[\"https:\\\/\\\/blog.fabianpiau.com\",\"https:\\\/\\\/www.facebook.com\\\/fabian.piau\",\"https:\\\/\\\/www.instagram.com\\\/fabianpiau\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/fabianpiau\\\/\",\"https:\\\/\\\/x.com\\\/fabianpiau\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flagger - D\u00e9ploiements Canary sur Kubernetes | CarmaBlog","description":"&nbsp;English version available Mise \u00e0 jour 17 Octobre 2020 : Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/","og_locale":"fr_FR","og_type":"article","og_title":"Flagger - D\u00e9ploiements Canary sur Kubernetes | CarmaBlog","og_description":"&nbsp;English version available Mise \u00e0 jour 17 Octobre 2020 : Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article","og_url":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/","og_site_name":"CarmaBlog","article_publisher":"https:\/\/www.facebook.com\/fabian.piau","article_author":"https:\/\/www.facebook.com\/fabian.piau","article_published_time":"2020-05-19T18:56:08+00:00","article_modified_time":"2021-01-14T14:58:54+00:00","og_image":[{"width":300,"height":300,"url":"https:\/\/i2.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2020\/05\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1","type":"image\/png"}],"author":"Fabian Piau","twitter_card":"summary_large_image","twitter_creator":"@fabianpiau","twitter_site":"@fabianpiau","twitter_misc":{"\u00c9crit par":"Fabian Piau","Dur\u00e9e de lecture estim\u00e9e":"26 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#article","isPartOf":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/"},"author":{"name":"Fabian Piau","@id":"https:\/\/blog.fabianpiau.com\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14"},"headline":"Flagger &#8211; D\u00e9ploiements Canary sur Kubernetes","datePublished":"2020-05-19T18:56:08+00:00","dateModified":"2021-01-14T14:58:54+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/"},"wordCount":4099,"commentCount":0,"publisher":{"@id":"https:\/\/blog.fabianpiau.com\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14"},"image":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2020\/05\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1","keywords":["cloud","docker","flagger","helm","istio","kubernetes"],"articleSection":["Programmation agile"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/","url":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/","name":"Flagger - D\u00e9ploiements Canary sur Kubernetes | CarmaBlog","isPartOf":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#primaryimage"},"image":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2020\/05\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1","datePublished":"2020-05-19T18:56:08+00:00","dateModified":"2021-01-14T14:58:54+00:00","description":"&nbsp;English version available Mise \u00e0 jour 17 Octobre 2020 : Utilisation de versions plus r\u00e9centes (Helm 3, Kube 18, Istio 1.7, Flagger 1.2). Cet article","breadcrumb":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":[["https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/"]]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#primaryimage","url":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2020\/05\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2020\/05\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1","width":300,"height":300,"caption":"kubernetes"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.fabianpiau.com\/fr\/2020\/05\/19\/flagger-canary-deployments-on-kubernetes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Homepage","item":"https:\/\/blog.fabianpiau.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Programmation agile","item":"https:\/\/blog.fabianpiau.com\/fr\/category\/agile-programming\/"},{"@type":"ListItem","position":3,"name":"Flagger &#8211; D\u00e9ploiements Canary sur Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/blog.fabianpiau.com\/fr\/#website","url":"https:\/\/blog.fabianpiau.com\/fr\/","name":"CarmaBlog","description":"Agilit\u00e9, D\u00e9veloppement Java, Nouvelles technologies et plus...","publisher":{"@id":"https:\/\/blog.fabianpiau.com\/fr\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.fabianpiau.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/blog.fabianpiau.com\/fr\/#\/schema\/person\/c5cbffd7cf0b10117877f5dfd1b35f14","name":"Fabian Piau","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1","url":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1","width":567,"height":667,"caption":"Fabian Piau"},"logo":{"@id":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2022\/08\/fabian-pro-small.jpg?fit=567%2C667&ssl=1"},"description":"D\u00e9veloppeur Java, Fabian s'int\u00e9resse aux nouvelles technologies et plus particuli\u00e8rement \u00e0 leur utilisation dans un contexte agile.","sameAs":["https:\/\/blog.fabianpiau.com","https:\/\/www.facebook.com\/fabian.piau","https:\/\/www.instagram.com\/fabianpiau\/","https:\/\/www.linkedin.com\/in\/fabianpiau\/","https:\/\/x.com\/fabianpiau"]}]}},"views":1895,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blog.fabianpiau.com\/wp-content\/uploads\/2020\/05\/kubernetes-thumbnail.png?fit=300%2C300&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pbSHyl-1kL","_links":{"self":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/posts\/5131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/comments?post=5131"}],"version-history":[{"count":0,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/posts\/5131\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/media\/5126"}],"wp:attachment":[{"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/media?parent=5131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/categories?post=5131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.fabianpiau.com\/fr\/wp-json\/wp\/v2\/tags?post=5131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}