{"id":90373,"date":"2020-07-31T13:42:12","date_gmt":"2020-07-31T11:42:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts"},"modified":"2020-07-31T13:42:12","modified_gmt":"2020-07-31T11:42:12","slug":"canary-deployment-v-kubernetes-2-argo-rollouts","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","title":{"rendered":"Canary Deployment in Kubernetes #2: Argo Rollouts","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h4 id=\"my-budem-ispolzovat-k8s-nativnyy-kontroller-razvertyvaniya-argo-rollouts-i-gitlabci-dlya-zapuska-canary-deploya-v-kubernetes\">We zullen de k8s-native Argo Rollouts deployment controller en GitlabCI gebruiken om een Canary deployment in Kubernetes te starten.<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/0748c0dc9a71e59b8a42f39481d365da.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em><noindex><a rel=\"nofollow\" href=\"https:\/\/unsplash.com\/photos\/V41PulGL1z0\">https:\/\/unsplash.com\/photos\/V41PulGL1z0<\/a><\/noindex><\/em><\/p>\n<p><\/p>\n<h3 id=\"stati-etogo-cikla\">Artikelen in deze cyclus<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/512766\/\">Canary Deployment in Kubernetes #1: Gitlab CI<\/a><\/noindex><\/li>\n<li>(Dit artikel)<\/li>\n<li>Canary Deployment met Istio<\/li>\n<li>Canary Deployment met Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"canary-deployment\">Canary Deployment<\/h3>\n<p><\/p>\n<p>We hopen dat u heeft gelezen <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/512766\/\">eerste deel<\/a><\/noindex>, waar we kort uitlegden wat Canary Deployments zijn. We toonden ook hoe het te implementeren met standaard Kubernetes-resources.<\/p>\n<p><\/p>\n<h3 id=\"argo-rollouts\">Argo Rollouts<\/h3>\n<p><\/p>\n<p>Argo Rollouts is een Kubernetes-native deployment controller. Het biedt CRD (Custom Resource Definition) voor Kubernetes. Hierdoor kunnen we een nieuwe entiteit gebruiken: <code>Rollout<\/code>, die blue-green en canary deployments beheert met verschillende configuratie-opties.<\/p>\n<p><\/p>\n<blockquote><p>De Argo Rollouts controller, die wordt gebruikt door de aangepaste resource <code>Rollout,<\/code> maakt het mogelijk om extra deploymentstrategie\u00ebn te gebruiken, zoals blue-green en canary voor Kubernetes. De resource <code>Rollout<\/code> biedt functionaliteit die gelijkwaardig is aan <code>Deployment<\/code>, maar met extra deploymentstrategie\u00ebn.<br \/>\nHulpbron <code>Deployments<\/code> heeft twee strategie\u00ebn voor deployment: <code>RollingUpdate<\/code> en <code>Recreate<\/code>. Hoewel deze strategie\u00ebn geschikt zijn voor de meeste gevallen, worden voor deployments naar servers op een zeer grote schaal extra strategie\u00ebn, zoals blue-green of canary, gebruikt die niet in de Deployment controller aanwezig zijn. Om deze strategie\u00ebn in Kubernetes te gebruiken, moesten gebruikers scripts bovenop hun Deployments schrijven. De Argo Rollouts controller biedt deze strategie\u00ebn als simples declaratieve configureerbare parameters.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/argoproj.github.io\/argo-rollouts\">https:\/\/argoproj.github.io\/argo-rollouts<\/a><\/noindex><\/p><\/blockquote>\n<p>Er is ook Argo CI, dat een gebruiksvriendelijke webinterface biedt voor gebruik met Rollouts; we zullen erop ingaan in het volgende artikel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-argo-rollouts\">Installatie van Argo Rollouts<\/h3>\n<p><\/p>\n<h4 id=\"na-storone-servera\">Aan de serverzijde<\/h4>\n<p><\/p>\n<p><code>kubectl create namespace argo-rollouts; kubectl apply -n argo-rollouts -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-rollouts\/stable\/manifests\/install.yaml<\/code><\/p>\n<p><\/p>\n<p>In onze infrastructuur repository (zie hieronder) hebben we al install.yaml toegevoegd als i\/k8s\/argo-rollouts\/install.yaml. Hierdoor zal GitlabCI het in de cluster installeren.<\/p>\n<p><\/p>\n<h4 id=\"na-storone-klienta-kubectl-plugin\">Aan de klantzijde (kubectl-plugin)<\/h4>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/argoproj.github.io\/argo-rollouts\/features\/kubectl-plugin\">https:\/\/argoproj.github.io\/argo-rollouts\/features\/kubectl-plugin<br \/>\n<\/a><\/noindex><\/p>\n<p><\/p>\n<h3 id=\"prilozhenie-dlya-primera\">Voorbeeldapplicatie<\/h3>\n<p><\/p>\n<p>Een goede praktijk is om aparte repositories te hebben voor de applicatiecode en voor de infrastructuur.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniya\">Repository voor de applicatie<\/h4>\n<p><\/p>\n<h4 id=\"kim-wuestkamp--k8s-deployment-example-apphttpsgitlabcomwuestkampk8s-deployment-example-app\"><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/wuestkamp\/k8s-deployment-example-app\">Kim Wuestkamp \/ k8s-deployment-example-app<\/a><\/noindex><\/h4>\n<p><\/p>\n<p>Dit is een zeer eenvoudige API in Python+Flask, die een JSON-respons retourneert. We zullen een pakket samenstellen met behulp van GitlabCI en het resultaat naar de Gitlab Registry pushen. In de registry hebben we twee verschillende versies van de releases:<\/p>\n<p><\/p>\n<ul>\n<li>wuestkamp\/k8s-deployment-example-app:v1<\/li>\n<li>wuestkamp\/k8s-deployment-example-app:v2<\/li>\n<\/ul>\n<p><\/p>\n<p>Het enige verschil tussen hen is het geretourneerde JSON-bestand. We gebruiken deze applicatie voor een maximaal eenvoudige visualisatie van welke versie we communiceren.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Infrastructuurrepository<\/h4>\n<p><\/p>\n<p>In deze repository gaan we GitlabCI gebruiken voor de deployment naar Kubernetes, .gitlab-ci.yml ziet er als volgt uit:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">image: traherom\/kustomize-dockerbefore_script:\n   - printenv\n   - kubectl versionstages:\n - deploydeploy test:\n   stage: deploy\n   before_script:\n     - echo $KUBECONFIG\n   script:\n     - kubectl get all\n     - kubectl apply -f i\/k8s    only:\n     - master<\/code><\/pre>\n<p><\/p>\n<p>Om het zelf te starten heeft u een cluster nodig, u kunt Gcloud gebruiken:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b\ngcloud compute firewall-rules create incoming-80 --allow tcp:80<\/code><\/pre>\n<p><\/p>\n<p>U moet een fork maken <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> en een variabele aanmaken <code>KUBECONFIG<\/code> in GitlabCI, die de configuratie voor toegang bevat <code>kubectl<\/code> tot uw cluster.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">Hier<\/a><\/noindex> je kunt lezen hoe je de inloggegevens voor de cluster (Gcloud) krijgt.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Infrastructuur Yaml<\/h4>\n<p><\/p>\n<p>Binnen de infrastructuurrepository hebben we service:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\nkind: Service\nmetadata:\n labels:\n   id: rollout-canary\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>en rollout.yaml:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: argoproj.io\/v1alpha1\nkind: Rollout\nmetadata:\n name: rollout-canary\nspec:\n replicas: 10\n revisionHistoryLimit: 2\n selector:\n   matchLabels:\n     id: rollout-canary\n template:\n   metadata:\n     labels:\n       id: rollout-canary\n   spec:\n     containers:\n     - name: rollouts-demo\n       image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v1\n       imagePullPolicy: Always\n strategy:\n   canary:\n     steps:\n     - setWeight: 10\n     # Rollouts kunnen handmatig worden hervat door `kubectl argo rollouts promote ROLLOUT` te draaien\n     - pause: {}\n     - setWeight: 50\n     - pause: { duration: 120 } # twee minuten<\/code><\/pre>\n<p><\/p>\n<p><code>Rollout<\/code> werkt op dezelfde manier als de Deployment. Als we geen update-strategie opgeven (zoals canary hier), zal het zich gedragen als de standaard rolling-update Deployment.<\/p>\n<p><\/p>\n<p>We defini\u00ebren twee stappen in yaml voor canary deployment:<\/p>\n<p><\/p>\n<ol>\n<li>10% verkeer naar canary (wacht op handmatige OK)<\/li>\n<li>50% verkeer naar canary (wacht 2 minuten en ga dan door naar 100%)<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"vypolnenie-nachalnogo-deploya\">Uitvoeren van de initi\u00eble deployment<\/h3>\n<p><\/p>\n<p>Na de initi\u00eble deployment zullen onze middelen er als volgt uitzien:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/2f161eb3c80382bbe4f14a1fd199f1d6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>En we krijgen alleen een reactie van de eerste versie van de applicatie:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/117526d90b2fb5c765bb13f18230e9d5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3 id=\"vypolnyaem-canary-deployment\">We voeren de Canary Deployment uit<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-10-trafika\">Stap 1: 10% verkeer<\/h4>\n<p><\/p>\n<p>Om de canary deployment te starten, hoeven we alleen de versie van de afbeelding te wijzigen zoals we normaal doen met deployments:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: argoproj.io\/v1alpha1\nkind: Rollout\nmetadata:\n name: rollout-canary\nspec:\n...\n template:\n   metadata:\n     labels:\n       id: rollout-canary\n   spec:\n     containers:\n     - name: rollouts-demo\n       image: registry.gitlab.com\/wuestkamp\/k8s-deployment-example-app:v2\n...<\/code><\/pre>\n<p><\/p>\n<p>En we pushen de wijzigingen, zodat Gitlab CI de deployment doet en we de wijzigingen zien:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/ee069d8108e6ac211827b01390c45910.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Nu als we de service aanroepen:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/0be8a02c6ab6166d230818c43bbae3d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Geweldig! We zijn halverwege onze canary deployment. We kunnen de voortgang zien door het volgende uit te voeren:<\/p>\n<p><\/p>\n<p><code>kubectl argo rollouts get rollout rollout-canary<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/5b8a9fae9f92520b62cfcb5dd12fb7ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4 id=\"shag-2-50-trafika\">Stap 2: 50% verkeer:<\/h4>\n<p><\/p>\n<p>Laten we nu doorgaan naar de volgende stap: het omleiden van 50% van het verkeer. We hebben dit zo ingesteld dat deze stap handmatig wordt uitgevoerd:<\/p>\n<p><\/p>\n<p><code>kubectl argo rollouts promote rollout-canary # ga door naar stap 2<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/c856b7a60930cd5f6484ebe5a9080ffd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>En onze applicatie heeft 50% van de antwoorden van de nieuwe versies teruggegeven:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/502638210f546c5d973fc284beea1ec5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>En een overzicht van de rollout:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/64e996d9681a88475af31b09ecf61a3f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Prachtig.<\/p>\n<p><\/p>\n<h4 id=\"shag-3-100-trafika\">Stap 3: 100% verkeer:<\/h4>\n<p><\/p>\n<p>We configured it so that after 2 minutes, the step with 50% automatically completes and the step with 100% starts:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/d7eee8f41fcbd9c186b37666ea6c10fe.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>And the application output:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/f66c21e326f2bf52b29b460fc6e84957.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>En een overzicht van de rollout:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/5485ddc238b4eaad9e14d338acc116a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Canary deployment completed.<\/p>\n<p><\/p>\n<h4 id=\"eschyo-primery-s-argo-rollouts\">More examples with Argo Rollouts<\/h4>\n<p><\/p>\n<p>Here are more examples, such as how to set up environment previews and comparisons based on canary:<\/p>\n<p><\/p>\n<p><u><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/argoproj\/argo-rollouts\/tree\/master\/examples\">https:\/\/github.com\/argoproj\/argo-rollouts\/tree\/master\/examples<\/a><\/noindex><\/u><\/p>\n<p><\/p>\n<h4 id=\"video-ob-argo-rollouts-i-argo-ci\">Video about Argo Rollouts and Argo CI<\/h4>\n<p><\/p>\n<p>I really recommend this video; it shows how Argo Rollouts and Argo CI work together:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"yeVkTTO9nOA\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/yeVkTTO9nOA\/hqdefault.jpg\" alt=\"Video afspelen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h2 id=\"itog\">Conclusie<\/h2>\n<p><\/p>\n<p>I really like the idea of using CRDs that manage the creation of additional types of deployments or replicasets, redirect traffic, etc. Working with them is smooth. Next, I would like to test integration with Argo CI.<\/p>\n<p><\/p>\n<p>However, it seems that a major merge of Argo CI and Flux CI is coming, so I might wait for the new release: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/argo-flux-join-forces\">Argo Flux<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Have you had experience with Argo Rollouts or Argo CI?<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">Lees ook andere artikelen op onze blog:<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/470568\/\">Blue-Green Deployment van applicaties op Spring met de webserver Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/480072\/\">Kubernetes: waarom het zo belangrijk is om het resourcebeheer van het systeem in te stellen?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Inleiding tot de Hashicorp Consul Kubernetes Autorisatie<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/481992\/\">Tekton Pipeline \u2014 Kubernetes-native pipelines<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473578\/\">Bouwen van dynamische modules voor Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Telegram-bot voor Redmine. Hoe je het leven voor jezelf en anderen kunt vergemakkelijken<\/a><\/noindex><\/li>\n<\/ul>\n<p>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/513118\/\">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 k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Canary \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes https:\/\/unsplash.com\/photos\/V41PulGL1z0 \u0421\u0442\u0430\u0442\u044c\u0438 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 Canary Deployment \u0432 Kubernetes #1: Gitlab CI (\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f) Canary Deployment using Istio Canary Deployment using Jenkins-X Istio Flagger Canary Deployment \u041d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0412\u044b \u0447\u0438\u0442\u0430\u043b\u0438 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0433\u0434\u0435 \u043c\u044b \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b\u0438 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Canary Deployments. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90374,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90373","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.3 - 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 k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI.\" \/>\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\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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 #2: Argo Rollouts | 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 k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts\" \/>\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-31T11:42:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-31T11:42:12+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\udd47Canary Deployment in Kubernetes #2: Argo Rollouts | ProHoster","description":"We will be using the k8s-native deployment controller Argo Rollouts and GitlabCI.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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 #2: Argo Rollouts | ProHoster","og:description":"\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c k8s-\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f Argo Rollouts \u0438 GitlabCI.","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","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-31T11:42:12+00:00","article:modified_time":"2020-07-31T11:42:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90373","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:53:48","updated":"2022-09-30 17:28:16","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/90373","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=90373"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/90373\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/90374"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=90373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=90373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=90373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}