{"id":90272,"date":"2020-07-30T13:42:02","date_gmt":"2020-07-30T11:42:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci"},"modified":"2020-07-30T13:42:02","modified_gmt":"2020-07-30T11:42:02","slug":"canary-deployment-v-kubernetes-1-gitlab-ci","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","title":{"rendered":"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h4 id=\"my-budem-ispolzovat-gitlab-ci-i-ruchnoy-gitops-dlya-vnedreniya-i-ispolzovaniya-canary-deploya-v-kubernetes\">Nous allons utiliser Gitlab CI et GitOps manuel pour impl\u00e9menter et utiliser le d\u00e9ploiement canari dans Kubernetes.<\/h4>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/03a53dec150529deb3438efaeaa8a1bd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4 id=\"stati-iz-etogo-cikla\">Articles de ce cycle :<\/h4>\n<p><\/p>\n<ul>\n<li>(cet article)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/513118\/\">D\u00e9ploiement Canari avec ArgoCI<\/a><\/noindex><\/li>\n<li>D\u00e9ploiement Canari avec Istio<\/li>\n<li>D\u00e9ploiement Canari avec Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><\/p>\n<p>Nous effectuerons le d\u00e9ploiement canari manuellement via GitOps et la cr\u00e9ation\/modification des ressources principales de Kubernetes. <strong>Cet article est principalement destin\u00e9 \u00e0 introduire<\/strong> comment fonctionne le d\u00e9ploiement canari dans Kubernetes, car il existe des m\u00e9thodes d'automatisation plus efficaces que nous examinerons dans les articles suivants.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d5127cf7dcec695bd8872b1704eb7e90.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.norberteder.com\/canary-deployment\/\">https:\/\/www.norberteder.com\/canary-deployment\/<\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"canary-deployment\">D\u00e9ploiement Canary<\/h3>\n<p><\/p>\n<p>Avec la strat\u00e9gie canari de mise \u00e0 jour, les mises \u00e0 jour ne sont d'abord appliqu\u00e9es qu'\u00e0 une partie des utilisateurs. Gr\u00e2ce \u00e0 la surveillance, aux donn\u00e9es des journaux, aux tests manuels ou \u00e0 d'autres canaux de retour d'information, la version est test\u00e9e avant son d\u00e9ploiement pour tous les utilisateurs.<\/p>\n<p><\/p>\n<h3 id=\"kubernetes-deployment-rolling-update\">Kubernetes Deployment (mise \u00e0 jour progressive)<\/h3>\n<p><\/p>\n<p>La strat\u00e9gie par d\u00e9faut pour Kubernetes Deployment est la mise \u00e0 jour progressive, o\u00f9 un certain nombre de pods avec de nouvelles versions d'images sont lanc\u00e9s. S'ils se cr\u00e9ent sans probl\u00e8me, les pods avec les anciennes versions d'images sont arr\u00eat\u00e9s et de nouveaux pods sont cr\u00e9\u00e9s en parall\u00e8le.<\/p>\n<p><\/p>\n<h3 id=\"gitops\">GitOps<\/h3>\n<p><\/p>\n<p>Nous utilisons GitOps dans cet exemple, car nous :<\/p>\n<p><\/p>\n<ul>\n<li>utilisons Git comme source unique de v\u00e9rit\u00e9<\/li>\n<li>utilisons les op\u00e9rations Git pour la construction et le d\u00e9ploiement (aucune commande, sauf git tag\/merge, n'est n\u00e9cessaire)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"primer\">Exemple<\/h3>\n<p><\/p>\n<p>Adoptons une bonne pratique : avoir un seul d\u00e9p\u00f4t pour le code des applications et un pour l'infrastructure.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniy\">D\u00e9p\u00f4t pour les applications<\/h4>\n<p><\/p>\n<p>C'est une API tr\u00e8s simple en Python+Flask, qui renvoie une r\u00e9ponse au format JSON. Nous construirons le paquet via GitlabCI et publierons le r\u00e9sultat dans le registre Gitlab. Dans le registre, nous avons deux versions diff\u00e9rentes des releases :<\/p>\n<p><\/p>\n<ul>\n<li><code>wuestkamp\/k8s-deployment-example-app:v1<\/code><\/li>\n<li><code>wuestkamp\/k8s-deployment-example-app:v2<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>La seule diff\u00e9rence entre elles est le changement du fichier JSON renvoy\u00e9. Nous utilisons cette application pour visualiser de mani\u00e8re tr\u00e8s simple avec quelle version nous interagissons.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">D\u00e9p\u00f4t d'infrastructure<\/h4>\n<p><\/p>\n<p>Dans ce d\u00e9p\u00f4t, nous allons d\u00e9ployer via GitlabCI dans Kubernetes, <code>.gitlab-ci.yml<\/code> se pr\u00e9sente comme suit :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">image: traherom\/kustomize-docker\n\nbefore_script:\n   - printenv\n   - kubectl version\n\nstages:\n - deploy\n\ndeploy test:\n   stage: deploy\n   before_script:\n     - echo $KUBECONFIG\n   script:\n     - kubectl get all\n     - kubectl apply -f i\/k8s\n\n   only:\n     - master\n<\/code><\/pre>\n<p><\/p>\n<p>Pour le lancer par vous-m\u00eame, vous aurez besoin d'un cluster, vous pouvez utiliser Gcloud :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b\n\ngcloud compute firewall-rules create incoming-80 --allow tcp:80<\/code><\/pre>\n<p><\/p>\n<p>Vous devez faire un fork <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-canary-infrastructure\">https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-canary-infrastructure<\/a><\/noindex> et cr\u00e9er une variable <code>KUBECONFIG<\/code> dans GitlabCI, qui contiendra la configuration d'acc\u00e8s <code>kubectl<\/code> \u00e0 votre cluster.<\/p>\n<p><\/p>\n<p>Pour savoir comment obtenir les informations d'identification du cluster (Gcloud), vous pouvez consulter <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">ici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Yaml d'infrastructure<\/h4>\n<p><\/p>\n<p>Dans le d\u00e9p\u00f4t d'infrastructure, nous avons un service :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\nkind: Service\nmetadata:\n labels:\n   id: app\n name: app\nspec:\n ports:\n - port: 80\n   protocol: TCP\n   targetPort: 5000\n selector:\n   id: app\n type: LoadBalancer<\/code><\/pre>\n<p><\/p>\n<p>Et d\u00e9ploiement dans <code>deploy.yaml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n name: app\nspec:\n replicas: 10\n selector:\n   matchLabels:\n     id: app\n     type: main\n template:\n   metadata:\n     labels:\n       id: app\n       type: main\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v1\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>Et un autre d\u00e9ploiement dans <code>deploy-canary.yaml<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app-canary\nspec:\n replicas: 0\n selector:\n   matchLabels:\n     id: app\n     type: canary\n template:\n   metadata:\n     labels:\n       id: app\n       type: canary\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>Remarquez que l'app-deploy n'a pas encore de r\u00e9plicas d\u00e9finis.<\/p>\n<p><\/p>\n<h4 id=\"vypolnenie-nachalnogo-deploya\">Ex\u00e9cution du d\u00e9ploiement initial<\/h4>\n<p><\/p>\n<p>Pour lancer le d\u00e9ploiement initial, vous pouvez ex\u00e9cuter le pipeline GitlabCI manuellement dans la branche master. Ensuite, <code>kubectl<\/code> il doit afficher ce qui suit :<\/p>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/e8ea95fe6c3925f46f6430ce2293063c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Nous voyons <code>app<\/code> un d\u00e9ploiement avec 10 r\u00e9plicas et app-canary avec 0. Il y a aussi un LoadBalancer auquel nous pouvons acc\u00e9der via <code>curl<\/code> par l'IP externe :<\/p>\n<p><\/p>\n<p><code>while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/06e6928002532dbe03b65356964110c7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Nous voyons que notre application de test renvoie uniquement \u201cv1\u201d.<\/p>\n<p><\/p>\n<h3 id=\"vypolnenie-canary-deploya\">Ex\u00e9cution du d\u00e9ploiement Canary<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-vypustit-novuyu-versiyu-dlya-chasti-polzovateley\">\u00c9tape 1 : d\u00e9ployer la nouvelle version pour une partie des utilisateurs<\/h4>\n<p><\/p>\n<p>Nous avons d\u00e9fini le nombre de r\u00e9plicas \u00e0 1 dans le fichier deploy-canary.yaml et l'image de la nouvelle version :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app-canary\nspec:\n replicas: 1\n selector:\n   matchLabels:\n     id: app\n     type: canary\n template:\n   metadata:\n     labels:\n       id: app\n       type: canary\n   spec:\n     containers:\n     - image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n       name: app\n       resources:\n         limits:\n           cpu: 100m\n           memory: 100Mi<\/code><\/pre>\n<p><\/p>\n<p>Dans le fichier <code>deploy.yaml<\/code> nous avons chang\u00e9 le nombre de r\u00e9plicas \u00e0 9 :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Deployment\nmetadata:\n name: app\nspec:\n replicas: 9\n selector:\n   matchLabels:\n     id: app\n...<\/code><\/pre>\n<p><\/p>\n<p>Nous poussons ces modifications dans le d\u00e9p\u00f4t, \u00e0 partir duquel le d\u00e9ploiement sera lanc\u00e9 (via GitlabCI) et voyons au final :<\/p>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/b639716b31e41e8eac573fd365ad6780.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Notre Service pointera vers les deux d\u00e9ploiements, car les deux ont le s\u00e9lecteur app. En raison de la distribution al\u00e9atoire par d\u00e9faut dans Kubernetes, nous devons voir des r\u00e9ponses diff\u00e9rentes sur environ 10% des requ\u00eates :<\/p>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d1177207ebd8952fd1994ed0ebdda6a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>L'\u00e9tat actuel de notre application (GitOps, pris de Git comme Single Source Of Truth) est la pr\u00e9sence de deux d\u00e9ploiements avec des r\u00e9plicas actifs, un pour chaque version.<\/p>\n<p><\/p>\n<p>~10% des utilisateurs d\u00e9couvrent la nouvelle version et la testent involontairement. Il est maintenant temps de v\u00e9rifier s'il y a des erreurs dans les journaux et les donn\u00e9es de surveillance pour identifier des probl\u00e8mes.<\/p>\n<p><\/p>\n<h4 id=\"shag-2-vypustit-novuyu-versiyu-dlya-vseh-polzovateley\">\u00c9tape 2 : d\u00e9ployer la nouvelle version pour tous les utilisateurs<\/h4>\n<p><\/p>\n<p>Nous avons d\u00e9cid\u00e9 que tout s'\u00e9tait bien pass\u00e9 et maintenant nous devons d\u00e9ployer la nouvelle version pour tous les utilisateurs. Pour cela, nous mettons simplement \u00e0 jour <code>deploy.yaml<\/code> en installant la nouvelle version de l'image et le nombre de r\u00e9plicas, \u00e9gal \u00e0 10. Dans <code>deploy-canary.yaml<\/code> Nous d\u00e9finissons le nombre de r\u00e9plicas sur z\u00e9ro. Apr\u00e8s le d\u00e9ploiement, le r\u00e9sultat sera le suivant :<\/p>\n<p>\n<img decoding=\"async\" alt=\"D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/a31aafe96a09c6d2651b2bf7add4dd29.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3 id=\"podvodya-itog\">En r\u00e9sum\u00e9<\/h3>\n<p><\/p>\n<p>Pour moi, lancer le d\u00e9ploiement manuellement de cette mani\u00e8re aide \u00e0 comprendre \u00e0 quel point il peut \u00eatre facilement configur\u00e9 avec k8s. \u00c9tant donn\u00e9 que Kubernetes permet de mettre \u00e0 jour tout via l'API, ces \u00e9tapes peuvent \u00eatre automatis\u00e9es \u00e0 l'aide de scripts.<\/p>\n<p><\/p>\n<p>Une autre chose \u00e0 mettre en \u0153uvre est le point d'entr\u00e9e du testeur (LoadBalancer ou via Ingress), par lequel on peut acc\u00e9der uniquement \u00e0 la nouvelle version. Il peut \u00eatre utilis\u00e9 pour une visualisation manuelle.<\/p>\n<p><\/p>\n<p>Dans les prochains articles, nous examinerons d'autres solutions automatis\u00e9es qui mettent en \u0153uvre la plupart de ce que nous avons fait.<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">Lisez aussi d'autres articles sur notre blog :<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/468779\/\">Ce que la migration de ClickHouse sans autorisation \u00e0 ClickHouse avec autorisation a entra\u00een\u00e9<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473578\/\">Assemblage de modules dynamiques pour Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/news\/t\/502658\/\">Mise \u00e0 jour de nxs-build-tools \u2014 un assistant pour la cr\u00e9ation de paquets deb et rpm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Introduction \u00e0 l'autorisation Kubernetes de Hashicorp Consul<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/504762\/\">\u00c0 quoi nous avons d\u00fb faire face lors de l'utilisation de l'outil Csync2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Bot Telegram pour Redmine. Comment simplifier la vie pour soi et pour les autres<\/a><\/noindex><\/li>\n<\/ul>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/512766\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes \u0421\u0442\u0430\u0442\u044c\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430: (\u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f) Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 ArgoCI Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Istio Canary Deployment \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Jenkins-X Istio Flagger \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c Canary-\u0434\u0435\u043f\u043b\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 GitOps \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\/\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 Kubernetes. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90273,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90272","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Canary Deployment \u0432 Kubernetes #1: Gitlab CI | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-30T11:42:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-30T11:42:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47D\u00e9ploiement Canary dans Kubernetes #1 : Gitlab CI | ProHoster","description":"Nous allons utiliser Gitlab CI et GitOps manuel pour d\u00e9ployer et utiliser le d\u00e9ploiement Canary.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Canary Deployment \u0432 Kubernetes #1: Gitlab CI | ProHoster","og:description":"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Gitlab CI \u0438 \u0440\u0443\u0447\u043d\u043e\u0439 GitOps \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Canary-\u0434\u0435\u043f\u043b\u043e\u044f \u0432.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-30T11:42:02+00:00","article:modified_time":"2020-07-30T11:42:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90272","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:55:28","updated":"2022-09-27 23:09:11","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/90272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=90272"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/90272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/90273"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=90272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=90272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=90272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}