{"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\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","title":{"rendered":"Canary Deployment in 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\">We zullen Gitlab CI en handmatige GitOps gebruiken voor de implementatie en het gebruik van Canary-deployment in Kubernetes<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in 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\">Artikelen in deze cyclus:<\/h4>\n<p><\/p>\n<ul>\n<li>(dit artikel)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/513118\/\">Canary Deployment met ArgoCI<\/a><\/noindex><\/li>\n<li>Canary Deployment met Istio<\/li>\n<li>Canary Deployment met Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><\/p>\n<p>We zullen de Canary-deployment handmatig uitvoeren via GitOps en het maken\/wijzigen van basisresources in Kubernetes. <strong>Dit artikel is in de eerste plaats bedoeld om bekend te raken<\/strong> met hoe Canary-deployment in Kubernetes werkt, aangezien er meer effici\u00ebnte manieren van automatisering zijn die we in de volgende artikelen zullen bespreken.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Canary Deployment in 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>Bij de Canary-strategie worden updates eerst toegepast op een deel van de gebruikers. Via monitoring, loggingdata, handmatige tests of andere feedbackkanalen wordt de release getest voordat deze voor alle gebruikers wordt toegepast.<\/p>\n<p><\/p>\n<h3 id=\"kubernetes-deployment-rolling-update\">Kubernetes Deployment (rolling update)<\/h3>\n<p><\/p>\n<p>De standaardstrategie voor Kubernetes Deployment is een rolling-update, waarbij een bepaald aantal pods met nieuwe versies van images wordt gestart. Als deze zonder problemen zijn aangemaakt, worden de pods met oude versies van images be\u00ebindigd en worden nieuwe pods parallel aangemaakt.<\/p>\n<p><\/p>\n<h3 id=\"gitops\">GitOps<\/h3>\n<p><\/p>\n<p>We gebruiken GitOps in dit voorbeeld omdat we:<\/p>\n<p><\/p>\n<ul>\n<li>Git als enige bron van waarheid gebruiken<\/li>\n<li>Git Operations voor build en deployment gebruiken (geen commando's behalve git tag\/merge nodig zijn)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"primer\">Voorbeeld<\/h3>\n<p><\/p>\n<p>Laten we een goede praktijk nemen \u2014 \u00e9\u00e9n repository voor de applicatiecode en \u00e9\u00e9n voor de infrastructuur.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniy\">Repository voor applicaties<\/h4>\n<p><\/p>\n<p>Dit is een zeer eenvoudige API in Python+Flask die een JSON-antwoord retourneert. We zullen het pakket bouwen via GitlabCI en het resultaat naar de Gitlab Registry pushen. In de registry hebben we twee verschillende versies van releases:<\/p>\n<p><\/p>\n<ul>\n<li><code>wuestkamp\/k8s-deployment-example-app:v1<\/code><\/li>\n<li><code>wuestkamp\/k8s-deployment-example-app:v2<\/code><\/li>\n<\/ul>\n<p><\/p>\n<p>Het enige verschil tussen hen is de wijziging van het teruggegeven JSON-bestand. We gebruiken deze applicatie voor een zo eenvoudig mogelijke visualisatie van met welke versie we communiceren.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Infrastructuurrepository<\/h4>\n<p><\/p>\n<p>In deze repo zullen we via GitlabCI naar Kubernetes deployen, <code>.gitlab-ci.yml<\/code> er als volgt uit:<\/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>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\n\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>Hoe je de referenties voor de cluster (Gcloud) kunt verkrijgen, kun je lezen <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/manually-connect-to-your-kubernetes-cluster-from-the-outside-d852346a7f0a\">hier<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-yaml\">Infrastructuur Yaml<\/h4>\n<p><\/p>\n<p>In de infrastructuurrepository hebben we 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>En deployment in <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>En een andere deployment in <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 op dat app-deploy momenteel geen gedefinieerde replica's heeft.<\/p>\n<p><\/p>\n<h4 id=\"vypolnenie-nachalnogo-deploya\">Uitvoeren van de initi\u00eble deployment<\/h4>\n<p><\/p>\n<p>Om de initi\u00eble deployment te starten, kun je de GitlabCI-pipeline handmatig starten in de masterbranch. Daarna <code>kubectl<\/code> moet het volgende tonen:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/e8ea95fe6c3925f46f6430ce2293063c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>We zien <code>app<\/code> deployment met 10 replica's en app-canary met 0. Er is ook een LoadBalancer waar we toegang toe hebben via <code>curl<\/code> met Externe 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 in Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/06e6928002532dbe03b65356964110c7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>We zien dat onze testapplicatie alleen \"v1\" retourneert.<\/p>\n<p><\/p>\n<h3 id=\"vypolnenie-canary-deploya\">Uitvoeren van de Canary deployment<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-vypustit-novuyu-versiyu-dlya-chasti-polzovateley\">Stap 1: een nieuwe versie uitgeven voor een deel van de gebruikers<\/h4>\n<p><\/p>\n<p>We hebben het aantal replica's ingesteld op 1 in het bestand deploy-canary.yaml en het beeld van de nieuwe versie:<\/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>In het bestand <code>deploy.yaml<\/code> we hebben het aantal replica's verhoogd tot 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>We pushen deze wijzigingen naar de repository, waaruit de deployment (via GitlabCI) zal worden gestart en zien uiteindelijk:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/b639716b31e41e8eac573fd365ad6780.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>Onze Service zal naar beide deployments wijzen, aangezien beiden de selector app hebben. Door de willekeurige verdeling standaard in Kubernetes, zouden we verschillende antwoorden op ~ 10% van de verzoeken moeten zien:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in Kubernetes #1: Gitlab CI\" src=\"\/wp-content\/uploads\/2020\/07\/d1177207ebd8952fd1994ed0ebdda6a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<p>De huidige staat van onze applicatie (GitOps, genomen uit Git als Single Source Of Truth) is dat er twee deployments zijn met actieve replica's, \u00e9\u00e9n voor elke versie.<\/p>\n<p><\/p>\n<p>~10% van de gebruikers maken kennis met de nieuwe versie en testen deze onbedoeld. Het is nu tijd om te controleren op fouten in de logbestanden en monitoringsgegevens om naar problemen te zoeken.<\/p>\n<p><\/p>\n<h4 id=\"shag-2-vypustit-novuyu-versiyu-dlya-vseh-polzovateley\">Stap 2: een nieuwe versie uitrollen voor alle gebruikers<\/h4>\n<p><\/p>\n<p>We hebben besloten dat alles goed is gegaan en nu moeten we de nieuwe versie voor alle gebruikers uitrollen. Hiervoor updaten we gewoon <code>deploy.yaml<\/code> door de nieuwe versie van de image in te stellen en het aantal replicas op 10. In <code>deploy-canary.yaml<\/code> stellen we het aantal replicas weer in op 0. Na de deployment zal het resultaat als volgt zijn:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Canary Deployment in 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\">Samenvattend<\/h3>\n<p><\/p>\n<p>Voor mij helpt het om de deployment handmatig zo uit te voeren om te begrijpen hoe gemakkelijk het kan worden ingesteld met k8s. Aangezien Kubernetes alles via de API kan updaten, kunnen deze stappen geautomatiseerd worden via scripts.<\/p>\n<p><\/p>\n<p>Een andere zaak die moet worden ge\u00efmplementeerd is het toegangspunt voor de tester (LoadBalancer of via Ingress), waarmee alleen toegang tot de nieuwe versie mogelijk is. Dit kan handmatig worden gebruikt om het te bekijken.<\/p>\n<p><\/p>\n<p>In de volgende artikelen zullen we andere geautomatiseerde oplossingen bekijken die de meeste van wat we hebben gedaan implementeren.<\/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\/ru\/company\/nixys\/blog\/468779\/\">Wat de migratie van ClickHouse zonder autorisatie naar ClickHouse met autorisatie heeft opgeleverd<\/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\/news\/t\/502658\/\">Update nxs-build-tools \u2014 de assistent voor het bouwen van deb en rpm-pakketten<\/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\/ru\/company\/nixys\/blog\/504762\/\">Met welke problemen we te maken kregen bij het gebruik van het hulpprogramma Csync2<\/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\/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.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 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\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\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 #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\/nl\/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 in Kubernetes #1: Gitlab CI | ProHoster","description":"We zullen Gitlab CI en handmatige GitOps gebruiken voor het implementeren en gebruiken van Canary-deployment in.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","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 #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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/90272","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=90272"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/90272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/90273"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=90272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=90272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=90272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}