{"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\/da\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","title":{"rendered":"Canary Deployment i 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\">Vi vil bruge den k8s-native deploymentscontroller Argo Rollouts og GitlabCI til at k\u00f8re Canary-deployments i Kubernetes<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i 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\">Artikler i denne cyklus<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/512766\/\">Canary Deployment i Kubernetes #1: Gitlab CI<\/a><\/noindex><\/li>\n<li>(Denne artikel)<\/li>\n<li>Canary Deployment ved hj\u00e6lp af Istio<\/li>\n<li>Canary Deployment ved hj\u00e6lp af 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>Vi h\u00e5ber, at du har l\u00e6st <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/512766\/\">f\u00f8rste del<\/a><\/noindex>, hvor vi kort forklarede, hvad Canary Deployments er. Vi viste ogs\u00e5, hvordan man implementerer det ved hj\u00e6lp af standard Kubernetes-ressourcer.<\/p>\n<p><\/p>\n<h3 id=\"argo-rollouts\">Argo Rollouts<\/h3>\n<p><\/p>\n<p>Argo Rollouts er en Kubernetes-native deploymentscontroller. Den tilbyder CRD (Custom Resource Definition) for Kubernetes. Dette g\u00f8r, at vi kan bruge en ny enhed: <code>Rollout<\/code>, som administrerer blue-green og canary deployments med forskellige konfigurationsmuligheder.<\/p>\n<p><\/p>\n<blockquote><p>Kontrolleren Argo Rollouts, der anvender den tilpassede ressource <code>Rollout,<\/code> giver mulighed for at implementere yderligere deploymentsstrategier s\u00e5som blue-green og canary for Kubernetes. Ressourcen <code>Rollout<\/code> tilbyder funktionalitet, der er lig med <code>Deployment<\/code>, kun med ekstra deploymentsstrategier.<br \/>\nPlatformen <code>Deployments<\/code> har to strategier til implementering: <code>RollingUpdate<\/code> og <code>Recreate<\/code>. Selvom disse strategier passer til de fleste scenarier, anvendes der yderligere strategier som blue-green eller canary til implementering p\u00e5 servere i meget stor skala, som ikke findes i Deployment-controlleren. For at bruge disse strategier i Kubernetes var brugerne n\u00f8dt til at skrive scripts oven p\u00e5 deres Deployments. Kontrolleren Argo Rollouts tilbyder disse strategier som enkle deklarative konfigurerbare parametre.<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>Der findes ogs\u00e5 Argo CI, som tilbyder et brugervenligt webinterface til brug sammen med Rollouts, vi vil se n\u00e6rmere p\u00e5 det i den n\u00e6ste artikel.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-argo-rollouts\">Installation af Argo Rollouts<\/h3>\n<p><\/p>\n<h4 id=\"na-storone-servera\">P\u00e5 serversiden<\/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>I vores infrastrukturrepo (se nedenfor) har vi allerede tilf\u00f8jet install.yaml som i\/k8s\/argo-rollouts\/install.yaml. S\u00e5ledes vil GitlabCI installere det i klyngen.<\/p>\n<p><\/p>\n<h4 id=\"na-storone-klienta-kubectl-plugin\">P\u00e5 klientsiden (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\">Eksempelapplikation<\/h3>\n<p><\/p>\n<p>En god praksis er at have adskilte repositories til applikationskoden og til infrastrukturen.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniya\">Repository til applikationen<\/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>Dette er en meget simpel API skrevet i Python+Flask, der returnerer et svar i JSON-format. Vi vil bygge pakken ved hj\u00e6lp af GitlabCI og uploade resultatet til Gitlab Registry. I registreringen har vi to forskellige versioner af udgivelserne:<\/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>Den eneste forskel mellem dem er den returnerede JSON-fil. Vi bruger denne applikation til at visualisere, hvilken version vi interagerer med, p\u00e5 den nemmeste m\u00e5de.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Infrastruktur repository<\/h4>\n<p><\/p>\n<p>I dette repository vil vi bruge GitlabCI til deployment til Kubernetes, .gitlab-ci.yml ser s\u00e5ledes ud:<\/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>For at k\u00f8re det selv skal du bruge et cluster, du kan bruge Gcloud:<\/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>Du skal lave en 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> og oprette en variabel <code>KUBECONFIG<\/code> i GitlabCI, som vil indeholde konfigurationen til adgang <code>kubectl<\/code> til dit 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\">Her<\/a><\/noindex> man kan l\u00e6se om, hvordan man f\u00e5r legitimationsoplysninger til klyngen (Gcloud).<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Infrastruktur Yaml<\/h4>\n<p><\/p>\n<p>Inden for infrastrukturrepositoryet har vi en 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>og 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 kan manuelt genoptages ved at k\u00f8re `kubectl argo rollouts promote ROLLOUT`\n     - pause: {}\n     - setWeight: 50\n     - pause: { duration: 120 } # to minutter<\/code><\/pre>\n<p><\/p>\n<p><code>Rollout<\/code> fungerer p\u00e5 samme m\u00e5de som Deployment. Hvis vi ikke angiver en opdateringsstrategi (som canary her), vil den opf\u00f8re sig som en standard rolling-update Deployment.<\/p>\n<p><\/p>\n<p>Vi definerer to trin i yaml til canary deployment:<\/p>\n<p><\/p>\n<ol>\n<li>10% trafik til canary (vent p\u00e5 manuel OK)<\/li>\n<li>50% trafik til canary (vent 2 minutter og forts\u00e6t til 100%)<\/li>\n<\/ol>\n<p><\/p>\n<h3 id=\"vypolnenie-nachalnogo-deploya\">Udf\u00f8relse af den indledende deployment<\/h3>\n<p><\/p>\n<p>Efter den indledende deployment vil vores ressourcer se s\u00e5ledes ud:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/2f161eb3c80382bbe4f14a1fd199f1d6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Og vi modtager kun svar fra den f\u00f8rste version af applikationen:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i 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\">Udf\u00f8rer Canary Deployment<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-10-trafika\">Trin 1: 10% trafik<\/h4>\n<p><\/p>\n<p>For at starte canary deployment skal vi blot \u00e6ndre versionen af billedet, som vi normalt g\u00f8r med deployment:<\/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>Og vi push'er \u00e6ndringerne, s\u00e5 Gitlab CI udf\u00f8rer deployment, og vi ser \u00e6ndringerne:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/ee069d8108e6ac211827b01390c45910.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Nu, hvis vi henvender os til servicen:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/0be8a02c6ab6166d230818c43bbae3d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Fantastisk! Vi er midt i vores canary deployment. Vi kan se fremskridtene ved at k\u00f8re:<\/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 i 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\">Trin 2: 50% trafik:<\/h4>\n<p><\/p>\n<p>Nu g\u00e5r vi videre til n\u00e6ste trin: omdirigering af 50% trafik. Vi har indstillet dette trin til at blive udf\u00f8rt manuelt:<\/p>\n<p><\/p>\n<p><code>kubectl argo rollouts promote rollout-canary # forts\u00e6t til trin 2<\/code><\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/c856b7a60930cd5f6484ebe5a9080ffd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Og vores applikation har returneret 50% svar fra de nye versioner:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/502638210f546c5d973fc284beea1ec5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Og oversigt over rollout:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/64e996d9681a88475af31b09ecf61a3f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Fremragende.<\/p>\n<p><\/p>\n<h4 id=\"shag-3-100-trafika\">Trin 3: 100% trafik:<\/h4>\n<p><\/p>\n<p>Vi har indstillet det, s\u00e5 trinnet med 50% automatisk afsluttes efter 2 minutter, og trinnet med 100% starter.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/d7eee8f41fcbd9c186b37666ea6c10fe.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Og applikationsoutput:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/f66c21e326f2bf52b29b460fc6e84957.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Og oversigt over rollout:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #2: Argo Rollouts\" src=\"\/wp-content\/uploads\/2020\/07\/5485ddc238b4eaad9e14d338acc116a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Canary-deployeringen er afsluttet.<\/p>\n<p><\/p>\n<h4 id=\"eschyo-primery-s-argo-rollouts\">Flere eksempler med Argo Rollouts<\/h4>\n<p><\/p>\n<p>Her er flere eksempler, for eksempel hvordan man konfigurerer milj\u00f8forh\u00e5ndsvisninger og sammenligninger baseret p\u00e5 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 om Argo Rollouts og Argo CI<\/h4>\n<p><\/p>\n<p>Jeg anbefaler virkelig denne video, der viser, hvordan Argo Rollouts og Argo CI arbejder sammen:<\/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=\"Afspil video\" 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\">Resultat<\/h2>\n<p><\/p>\n<p>Jeg er virkelig glad for ideen om at bruge CRD'er, der styrer oprettelsen af ekstra typer deployment eller replicasets, omdirigerer trafik osv. Arbejdet med dem forl\u00f8ber glat. Herefter vil jeg gerne teste integrationen med Argo CI.<\/p>\n<p><\/p>\n<p>Men \u00e5benbart er der en stor fusion af Argo CI og Flux CI p\u00e5 vej, s\u00e5 jeg kunne vente p\u00e5, at den nye version kommer ud: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/argo-flux-join-forces\">Argo Flux<\/a><\/noindex>. <\/p>\n<p><\/p>\n<p>Har du haft erfaring med Argo Rollouts eller Argo CI?<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">L\u00e6s ogs\u00e5 andre artikler p\u00e5 vores 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 af applikationer p\u00e5 Spring med webserveren Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/480072\/\">Kubernetes: hvorfor det er s\u00e5 vigtigt at konfigurere ressourceh\u00e5ndtering?<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Introduksjon til Hashicorp Consul\u2019s Kubernetes-autorisering<\/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\/\">Byggelse af dynamiske moduler til Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Telegram-bot til Redmine. Hvordan man forenkler livet for sig selv og andre<\/a><\/noindex><\/li>\n<\/ul>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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 i Kubernetes #2: Argo Rollouts | ProHoster","description":"Vi vil bruge den k8s-native deployment-controller Argo Rollouts og GitlabCI.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/canary-deployment-v-kubernetes-2-argo-rollouts","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/90373","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=90373"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/90373\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/90374"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=90373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=90373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=90373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}