{"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\/no\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","title":{"rendered":"Canary Deployment i 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\">Vi vil bruke Gitlab CI og manuell GitOps for \u00e5 implementere og bruke Canary-deployment i Kubernetes.<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i 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\">Artiklene i denne serien:<\/h4>\n<p><\/p>\n<ul>\n<li>(denne artikkelen)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/513118\/\">Canary Deployment med ArgoCI<\/a><\/noindex><\/li>\n<li>Canary Deployment med Istio<\/li>\n<li>Canary Deployment med Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi vil utf\u00f8re Canary-deployment manuelt gjennom GitOps og oppretting\/endring av grunnleggende Kubernetes-ressurser. <strong>Denne artikkelen er prim\u00e6rt ment for \u00e5 bli introdusert<\/strong> for hvordan Canary-deployment fungerer i Kubernetes, ettersom det finnes mer effektive automatiseringsmetoder som vi vil se n\u00e6rmere p\u00e5 i de kommende artiklene.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Canary Deployment i 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\">Canary Deployment<\/h3>\n<p><\/p>\n<p>Med Canary-strategien for oppdatering blir endringene f\u00f8rst brukt p\u00e5 bare en del av brukerne. Gjennom overv\u00e5king, loggdata, manuell testing eller andre tilbakemeldingskanaler blir versjonen testet f\u00f8r den brukes av alle brukere.<\/p>\n<p><\/p>\n<h3 id=\"kubernetes-deployment-rolling-update\">Kubernetes Deployment (rolling update)<\/h3>\n<p><\/p>\n<p>Standard strategien for Kubernetes Deployment er rolling-update, hvor et bestemt antall podder med de nye versjonene av bildene blir startet. Hvis de opprettes uten problemer, avsluttes poddene med de gamle versjonene av bildene, og nye podder blir opprettet parallelt.<\/p>\n<p><\/p>\n<h3 id=\"gitops\">GitOps<\/h3>\n<p><\/p>\n<p>Vi bruker GitOps i dette eksemplet fordi vi:<\/p>\n<p><\/p>\n<ul>\n<li>bruker Git som den eneste sannhetskilden<\/li>\n<li>bruger Git Operations for bygging og distribusjon (ingen kommandoer annet enn git tag\/merge er n\u00f8dvendig)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"primer\">Eksempel<\/h3>\n<p><\/p>\n<p>La oss ta en god praksis \u2014 ha ett repository for applikasjonskode og ett for infrastruktur.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniy\">Repository for applikasjoner<\/h4>\n<p><\/p>\n<p>Dette er et veldig enkelt API i Python+Flask som returnerer et svar i JSON-format. Vi vil bygge pakken gjennom GitlabCI og pushe resultatet til Gitlab Registry. I registrering har vi to forskjellige versjoner av utgivelser:<\/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>Den eneste forskjellen mellom dem er endringen i den returnerte JSON-filen. Vi bruker denne applikasjonen for \u00e5 gi en sv\u00e6rt enkel visualisering av hvilken versjon vi kommuniserer med.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Infrastrukturrepository<\/h4>\n<p><\/p>\n<p>I denne repoen vil vi deploye gjennom GitlabCI i Kubernetes, <code>.gitlab-ci.yml<\/code> ser slik ut:<\/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>For \u00e5 kj\u00f8re det selv trenger du et klynge, du kan bruke 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>Du m\u00e5 gj\u00f8re 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 opprette en variabel <code>KUBECONFIG<\/code> i GitlabCI, som vil inneholde konfigurasjonen for tilgang <code>kubectl<\/code> til klyngen din.<\/p>\n<p><\/p>\n<p>Hvordan du f\u00e5r tilgang til legitimasjonen for klyngen (Gcloud) kan du lese om <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">her<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Infrastruktur-YAML<\/h4>\n<p><\/p>\n<p>I infrastruktur-repositoriet har vi 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>Og deployment i <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>Og en annen deployment i <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>Merk at app-deploy for tiden ikke har definerte replikasjoner.<\/p>\n<p><\/p>\n<h4 id=\"vypolnenie-nachalnogo-deploya\">Utf\u00f8ring av initial deployment<\/h4>\n<p><\/p>\n<p>For \u00e5 starte den initiale deployment kan du manuelt kj\u00f8re GitlabCI-pipelinen i master-grenen. Etter dette <code>kubectl<\/code> b\u00f8r det gi f\u00f8lgende:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/e8ea95fe6c3925f46f6430ce2293063c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Vi ser <code>app<\/code> deployment med 10 replikasjoner og app-canary med 0. Det er ogs\u00e5 LoadBalancer som vi kan n\u00e5 via <code>wget<\/code> p\u00e5 ekstern IP:<\/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=\"Canary Deployment i Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/06e6928002532dbe03b65356964110c7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Vi ser at v\u00e5r test-applikasjon kun returnerer \u201cv1\u201d.<\/p>\n<p><\/p>\n<h3 id=\"vypolnenie-canary-deploya\">Utf\u00f8ring av Canary-deployment<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-vypustit-novuyu-versiyu-dlya-chasti-polzovateley\">Trinn 1: utgi en ny versjon for en del av brukerne<\/h4>\n<p><\/p>\n<p>Vi satte antallet replikasjoner til 1 i filen deploy-canary.yaml og bildet for den nye versjonen:<\/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>I filen <code>deploy.yaml<\/code> vi endret antallet replikasjoner til 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>Vi pusher disse endringene til repositoriet hvor deployen vil bli utf\u00f8rt (via GitlabCI) og ser til slutt:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/b639716b31e41e8eac573fd365ad6780.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>V\u00e5r Service vil peke p\u00e5 begge deploys, siden begge har selektor app. P\u00e5 grunn av tilfeldig fordeling som standard i Kubernetes b\u00f8r vi se ulike svar p\u00e5 ~ 10% av foresp\u00f8rslene:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d1177207ebd8952fd1994ed0ebdda6a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Den n\u00e5v\u00e6rende tilstanden til applikasjonen v\u00e5r (GitOps, hentet fra Git som Single Source Of Truth) er tilstedev\u00e6relsen av to deployments med aktive replikasjoner, \u00e9n for hver versjon.<\/p>\n<p><\/p>\n<p>~10% av brukerne blir kjent med den nye versjonen og tester den utilsiktet. N\u00e5 er det p\u00e5 tide \u00e5 sjekke for feil i loggene og overv\u00e5kingsdata for \u00e5 finne problemer.<\/p>\n<p><\/p>\n<h4 id=\"shag-2-vypustit-novuyu-versiyu-dlya-vseh-polzovateley\">Trinn 2: utgi en ny versjon for alle brukere<\/h4>\n<p><\/p>\n<p>Vi har bestemt oss for at alt har g\u00e5tt bra, og n\u00e5 m\u00e5 vi distribuere den nye versjonen til alle brukere. For dette oppdaterer vi bare <code>deploy.yaml<\/code> ved \u00e5 installere den nye bildeversjonen og sette antall replikaer til 10. I <code>deploy-canary.yaml<\/code> setter vi antall replikaer tilbake til 0. Etter distribusjonen vil resultatet bli som f\u00f8lger:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment i 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\">Oppsummering<\/h3>\n<p><\/p>\n<p>For meg hjelper det \u00e5 starte distribusjonen manuelt p\u00e5 denne m\u00e5ten for \u00e5 forst\u00e5 hvor enkelt det kan konfigureres ved hjelp av k8s. Siden Kubernetes tillater oppdateringer via API, kan disse trinnene automatiseres gjennom skript.<\/p>\n<p><\/p>\n<p>En annen ting som m\u00e5 implementeres er inngangspunktet for testeren (LoadBalancer eller via Ingress), som gir tilgang bare til den nye versjonen. Dette kan brukes for manuell gjennomgang.<\/p>\n<p><\/p>\n<p>I f\u00f8lgende artikler skal vi se p\u00e5 andre automatiserte l\u00f8sninger som implementerer det meste av det vi har gjort.<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">Les ogs\u00e5 andre artikler i bloggen v\u00e5r:<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/468779\/\">Hva f\u00f8rte migrasjonen fra ClickHouse uten autentisering til ClickHouse med autentisering<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473578\/\">Bygging av dynamiske moduler for Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/news\/t\/502658\/\">Oppdatering av nxs-build-tools - verkt\u00f8yet for bygging av deb- og rpm-pakker<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Introduksjon til Hashicorp Consul\u2019s Kubernetes Autorisasjon<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/504762\/\">Hva vi m\u00e5tte h\u00e5ndtere ved bruk av verkt\u00f8yet Csync2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Telegram-bot for Redmine. Hvordan forenkle livet for seg selv og folk<\/a><\/noindex><\/li>\n<\/ul>\n<p>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Canary Deployment i Kubernetes #1: Gitlab CI | ProHoster","description":"Vi skal bruke Gitlab CI og manuell GitOps for \u00e5 innf\u00f8re og bruke Canary-distribusjon i.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/90272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=90272"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/90272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/90273"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=90272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=90272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=90272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}