{"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\/sv\/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 kommer att anv\u00e4nda Gitlab CI och manuell GitOps f\u00f6r att implementera och anv\u00e4nda 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\">Artiklar fr\u00e5n denna cykel:<\/h4>\n<p><\/p>\n<ul>\n<li>(denna artikel)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/513118\/\">Canary Deployment med hj\u00e4lp av ArgoCI<\/a><\/noindex><\/li>\n<li>Canary Deployment med hj\u00e4lp av Istio<\/li>\n<li>Canary Deployment med hj\u00e4lp av Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><\/p>\n<p>Vi kommer att genomf\u00f6ra Canary-deployment manuellt genom GitOps och skapande\/\u00e4ndring av grundresurser i Kubernetes. <strong>Denna artikel \u00e4r fr\u00e4mst avsedd f\u00f6r att introducera<\/strong> hur Canary deployment fungerar i Kubernetes, eftersom det finns mer effektiva s\u00e4tt att automatisera, som vi kommer att diskutera i kommande artiklar.<\/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>Vid en Canary-uppdateringsstrategi till\u00e4mpas uppdateringar f\u00f6rst f\u00f6r en del av anv\u00e4ndarna. Genom \u00f6vervakning, loggdata, manuell testning eller andra kanaler f\u00f6r feedback testas releasen innan den till\u00e4mpas f\u00f6r alla anv\u00e4ndare.<\/p>\n<p><\/p>\n<h3 id=\"kubernetes-deployment-rolling-update\">Kubernetes Deployment (rolling update)<\/h3>\n<p><\/p>\n<p>Standardstrategin f\u00f6r Kubernetes Deployment \u00e4r rolling-update, d\u00e4r ett visst antal pods med nya versioner av bilder startas. Om de skapas utan problem avslutas pods med \u00e4ldre versioner av bilder och nya pods skapas parallellt.<\/p>\n<p><\/p>\n<h3 id=\"gitops\">GitOps<\/h3>\n<p><\/p>\n<p>Vi anv\u00e4nder GitOps i detta exempel eftersom vi:<\/p>\n<p><\/p>\n<ul>\n<li>anv\u00e4nder Git som en enda sanningens k\u00e4lla<\/li>\n<li>anv\u00e4nder Git Operations f\u00f6r byggande och deployment (inga kommandon, utom git tag\/merge beh\u00f6vs)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"primer\">Exempel<\/h3>\n<p><\/p>\n<p>L\u00e5t oss ta en bra praxis \u2014 ha ett enda repository f\u00f6r applikationskoden och ett f\u00f6r infrastrukturen.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniy\">Repository f\u00f6r applikationer<\/h4>\n<p><\/p>\n<p>Detta \u00e4r en mycket enkel API p\u00e5 Python+Flask som returnerar svar i JSON-format. Vi kommer att bygga paketet via GitlabCI och pusha resultatet till Gitlab Registry. I registret har vi tv\u00e5 olika versioner av releaser:<\/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 enda skillnaden mellan dem \u00e4r \u00e4ndringen av den returnerade JSON-filen. Vi anv\u00e4nder denna applikation f\u00f6r att maximalt enkelt visualisera vilken version vi kommunicerar med.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Infrastrukturens repository<\/h4>\n<p><\/p>\n<p>I detta repo kommer vi att deploya via GitlabCI i Kubernetes, <code>.gitlab-ci.yml<\/code> ser ut som f\u00f6ljer:<\/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>F\u00f6r att k\u00f6ra det p\u00e5 egen hand beh\u00f6ver du en kluster, du kan anv\u00e4nda 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 beh\u00f6ver g\u00f6ra 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> och skapa en variabel <code>KUBECONFIG<\/code> i GitlabCI som kommer att inneh\u00e5lla konfigurationen f\u00f6r \u00e5tkomst <code>kubectl<\/code> till din kluster.<\/p>\n<p><\/p>\n<p>Hur man f\u00e5r autentiseringsuppgifter f\u00f6r klustret (Gcloud) kan man l\u00e4sa om <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">h\u00e4r<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Infrastrukturens Yaml<\/h4>\n<p><\/p>\n<p>I infrastrukturrepositoryt 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>Och 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>Och en annan 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>Observera att app-deploy f\u00f6r tillf\u00e4llet inte har n\u00e5gra specificerade repliker.<\/p>\n<p><\/p>\n<h4 id=\"vypolnenie-nachalnogo-deploya\">Utf\u00f6r den initiala deploymenten<\/h4>\n<p><\/p>\n<p>F\u00f6r att k\u00f6ra den initiala deployment kan du manuellt k\u00f6ra GitlabCI-pipelinen i master-grenen. Efter detta <code>kubectl<\/code> ska visa f\u00f6ljande:<\/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 repliker och app-canary med 0. Det finns ocks\u00e5 en LoadBalancer som vi kan komma \u00e5t genom <code>curl<\/code> via External 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 att v\u00e5r testapplikation endast returnerar \u201cv1\u201d.<\/p>\n<p><\/p>\n<h3 id=\"vypolnenie-canary-deploya\">Utf\u00f6rande av Canary deployment<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-vypustit-novuyu-versiyu-dlya-chasti-polzovateley\">Steg 1: sl\u00e4pp en ny version f\u00f6r en del anv\u00e4ndare<\/h4>\n<p><\/p>\n<p>Vi har st\u00e4llt in antalet repliker till 1 i filen deploy-canary.yaml och bilden av den nya versionen:<\/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 har \u00e4ndrat antalet repliker till 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 pushar dessa \u00e4ndringar till arkivet, som kommer att starta deployment (via GitlabCI) och ser till slut:<\/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 kommer att peka p\u00e5 b\u00e5da deployments, eftersom b\u00e5da har selektorn app. P\u00e5 grund av den slumpm\u00e4ssiga f\u00f6rdelningen som standard i Kubernetes b\u00f6r vi se olika svar p\u00e5 ~ 10% av f\u00f6rfr\u00e5gningarna:<\/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>Det aktuella l\u00e4get f\u00f6r v\u00e5r applikation (GitOps, taget fr\u00e5n Git som en Single Source Of Truth) \u00e4r att ha tv\u00e5 deployments med aktiva repliker, en f\u00f6r varje version.<\/p>\n<p><\/p>\n<p>~10% av anv\u00e4ndarna f\u00e5r tillg\u00e5ng till den nya versionen och testar den oavsiktligt. Nu \u00e4r det dags att kontrollera loggar och \u00f6vervakningsdata f\u00f6r att identifiera problem.<\/p>\n<p><\/p>\n<h4 id=\"shag-2-vypustit-novuyu-versiyu-dlya-vseh-polzovateley\">Steg 2: sl\u00e4pp en ny version f\u00f6r alla anv\u00e4ndare<\/h4>\n<p><\/p>\n<p>Vi har beslutat att allt har g\u00e5tt bra, och nu beh\u00f6ver vi rulla ut den nya versionen till alla anv\u00e4ndare. F\u00f6r detta helt enkelt uppdatera <code>deploy.yaml<\/code> genom att installera den nya versionen av bilden och antalet repliker lika med 10. I <code>deploy-canary.yaml<\/code> Vi st\u00e4ller antalet repliker till att vara 0. Efter distributionen blir resultatet f\u00f6ljande:<\/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\">Sammanfattningsvis<\/h3>\n<p><\/p>\n<p>F\u00f6r mig hj\u00e4lper det att k\u00f6ra distributionen manuellt p\u00e5 detta s\u00e4tt f\u00f6r att f\u00f6rst\u00e5 hur enkelt det kan konfigureras med hj\u00e4lp av k8s. Eftersom Kubernetes till\u00e5ter att man uppdaterar allt via API kan dessa steg automatiseras med skript.<\/p>\n<p><\/p>\n<p>En annan sak som beh\u00f6ver implementeras \u00e4r ing\u00e5ngspunkten f\u00f6r testaren (LoadBalancer eller via Ingress), som bara kan anv\u00e4ndas f\u00f6r att f\u00e5 tillg\u00e5ng till den nya versionen. Den kan anv\u00e4ndas f\u00f6r manuell visning.<\/p>\n<p><\/p>\n<p>I kommande artiklar kommer vi att unders\u00f6ka andra automatiserade l\u00f6sningar som implementerar det mesta av det vi har gjort.<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">L\u00e4s \u00e4ven andra artiklar i v\u00e5r blogg:<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/468779\/\">Vad migreringen fr\u00e5n ClickHouse utan autentisering till ClickHouse med autentisering ledde till<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473578\/\">Bygg dynamiska moduler f\u00f6r Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/news\/t\/502658\/\">Uppdatering av nxs-build-tools \u2014 verktyget f\u00f6r att bygga deb och rpm-paket<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Introduktion till Hashicorp Consuls Kubernetes-autorisering<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/504762\/\">Vad vi har st\u00f6tt p\u00e5 vid anv\u00e4ndning av verktyget Csync2<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Telegram-bot f\u00f6r Redmine. Hur man f\u00f6renklar livet f\u00f6r sig sj\u00e4lv och andra<\/a><\/noindex><\/li>\n<\/ul>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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 kommer att anv\u00e4nda Gitlab CI och manuell GitOps f\u00f6r att implementera och anv\u00e4nda Canary-distribution i.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/90272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=90272"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/90272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/90273"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=90272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=90272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=90272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}