{"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\/de\/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\">Wir werden Gitlab CI und manuelles GitOps f\u00fcr die Implementierung und Nutzung von Canary-Deployments in Kubernetes verwenden.<\/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\">Artikel aus dieser Reihe:<\/h4>\n<p><\/p>\n<ul>\n<li>(dieser Artikel)<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/company\/nixys\/blog\/513118\/\">Canary Deployment mit ArgoCI<\/a><\/noindex><\/li>\n<li>Canary Deployment mit Istio<\/li>\n<li>Canary Deployment mit Jenkins-X Istio Flagger<\/li>\n<\/ul>\n<p><\/p>\n<p>Das Canary-Deployment f\u00fchren wir manuell \u00fcber GitOps und die Erstellung\/\u00c4nderung der grundlegenden Kubernetes-Ressourcen durch. <strong>Dieser Artikel ist in erster Linie dazu gedacht,<\/strong> einen Einblick in die Funktionsweise von Canary Deployments in Kubernetes zu geben, da es effizientere Automatisierungsmethoden gibt, die wir in den kommenden Artikeln behandeln werden.<\/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>Bei der Canary-Strategie werden Aktualisierungen zun\u00e4chst nur f\u00fcr einen Teil der Benutzer angewendet. Durch Monitoring, Log-Daten, manuelle Tests oder andere Feedback-Kan\u00e4le wird das Release vor seiner Anwendung f\u00fcr alle Benutzer getestet.<\/p>\n<p><\/p>\n<h3 id=\"kubernetes-deployment-rolling-update\">Kubernetes Deployment (rolling update)<\/h3>\n<p><\/p>\n<p>Die Standardstrategie f\u00fcr Kubernetes Deployments ist das Rolling-Update, bei dem eine bestimmte Anzahl von Pods mit neuen Versionen der Images gestartet wird. Wenn diese ohne Probleme erstellt wurden, werden die Pods mit den alten Versionen der Images beendet, w\u00e4hrend parallel neue Pods erstellt werden.<\/p>\n<p><\/p>\n<h3 id=\"gitops\">GitOps<\/h3>\n<p><\/p>\n<p>Wir verwenden GitOps in diesem Beispiel, da wir:<\/p>\n<p><\/p>\n<ul>\n<li>Git als einzige Quelle der Wahrheit nutzen<\/li>\n<li>Git-Operationen f\u00fcr das Builden und Deployen verwenden (keine Befehle au\u00dfer git tag\/merge erforderlich sind)<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"primer\">Beispiel<\/h3>\n<p><\/p>\n<p>Nehmen wir eine bew\u00e4hrte Praxis \u2014 einen Repository f\u00fcr Anwendungscode und einen f\u00fcr die Infrastruktur zu haben.<\/p>\n<p><\/p>\n<h4 id=\"repozitoriy-dlya-prilozheniy\">Anwendungs-Repository<\/h4>\n<p><\/p>\n<p>Dies ist eine sehr einfache API in Python+Flask, die eine Antwort im JSON-Format zur\u00fcckgibt. Wir werden das Paket \u00fcber GitlabCI erstellen und das Ergebnis ins Gitlab-Registry pushen. In der Registry haben wir zwei verschiedene Versionen der 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>Der einzige Unterschied zwischen ihnen ist die \u00c4nderung der zur\u00fcckgegebenen JSON-Datei. Wir verwenden diese Anwendung f\u00fcr eine maximal einfache Visualisierung, mit welcher Version wir kommunizieren.<\/p>\n<p><\/p>\n<h4 id=\"infrastrukturnyy-repozitoriy\">Infrastruktur-Repository<\/h4>\n<p><\/p>\n<p>In diesem Repository werden wir \u00fcber GitlabCI in Kubernetes deployen. <code>.gitlab-ci.yml<\/code> folgenderma\u00dfen aus:<\/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>Um ihn selbst auszuf\u00fchren, ben\u00f6tigen Sie einen Cluster, Gcloud kann verwendet werden:<\/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>Sie m\u00fcssen einen Fork erstellen <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> und eine Variable <code>KUBECONFIG<\/code> in GitlabCI anlegen, die die Konfiguration f\u00fcr den Zugriff enth\u00e4lt <code>kubectl<\/code> auf Ihren Cluster.<\/p>\n<p><\/p>\n<p>Wie man die Anmeldeinformationen f\u00fcr den Cluster (Gcloud) erh\u00e4lt, kann hier nachgelesen werden. <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\">Infrastruktur-YAML<\/h4>\n<p><\/p>\n<p>Im Infrastruktur-Repository haben wir einen 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>Und das 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>Und ein weiterer 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>Beachten Sie, dass der app-deploy derzeit keine definierten Replikate hat.<\/p>\n<p><\/p>\n<h4 id=\"vypolnenie-nachalnogo-deploya\">Durchf\u00fchrung des initialen Deployments<\/h4>\n<p><\/p>\n<p>Um den urspr\u00fcnglichen Deployment zu starten, k\u00f6nnen Sie das GitlabCI-Pipeline manuell im Master-Branch starten. Danach <code>kubectl<\/code> sollte Folgendes ausgegeben werden:<\/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>Wir sehen <code>App<\/code> einen Deployment mit 10 Replikaten und app-canary mit 0. Au\u00dferdem gibt es einen LoadBalancer, \u00fcber den wir ansprechen k\u00f6nnen <code>curl<\/code> \u00fcber die 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>Wir sehen, dass unsere Testanwendung nur \u201cv1\u201d zur\u00fcckgibt.<\/p>\n<p><\/p>\n<h3 id=\"vypolnenie-canary-deploya\">Durchf\u00fchrung des Canary-Deployments<\/h3>\n<p><\/p>\n<h4 id=\"shag-1-vypustit-novuyu-versiyu-dlya-chasti-polzovateley\">Schritt 1: Eine neue Version f\u00fcr einen Teil der Benutzer freigeben<\/h4>\n<p><\/p>\n<p>Wir haben die Anzahl der Replikate in der Datei deploy-canary.yaml auf 1 gesetzt und das Image der neuen Version:<\/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 der Datei <code>deploy.yaml<\/code> wir haben die Anzahl der Replikate auf 9 ge\u00e4ndert:<\/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>Wir pushen diese \u00c4nderungen in das Repository, aus dem das Deployment gestartet wird (durch GitlabCI) und sehen am Ende:<\/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>Unser Service wird auf beide Deployments verweisen, da beide einen Selector app haben. Aufgrund der standardm\u00e4\u00dfigen Zufallsverteilung in Kubernetes sollten wir verschiedene Antworten auf ~ 10% der Anfragen sehen:<\/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>Der aktuelle Zustand unserer Anwendung (GitOps, aus Git als Single Source Of Truth genommen) ist das Vorhandensein von zwei Deployments mit aktiven Replikaten, jeweils eines f\u00fcr jede Version.<\/p>\n<p><\/p>\n<p>~10% der Benutzer haben bereits Kontakt mit der neuen Version und testen sie unbeabsichtigt. Jetzt ist es an der Zeit, Protokolle und \u00dcberwachungsdaten auf Fehler zu pr\u00fcfen, um Probleme zu identifizieren.<\/p>\n<p><\/p>\n<h4 id=\"shag-2-vypustit-novuyu-versiyu-dlya-vseh-polzovateley\">Schritt 2: Eine neue Version f\u00fcr alle Benutzer freigeben<\/h4>\n<p><\/p>\n<p>Wir haben entschieden, dass alles gut gelaufen ist und jetzt m\u00fcssen wir die neue Version f\u00fcr alle Benutzer bereitstellen. Dazu aktualisieren wir einfach <code>deploy.yaml<\/code> das Image auf die neue Version und setzen die Anzahl der Replikate auf 10. <code>deploy-canary.yaml<\/code> Wir setzen die Anzahl der Replikate auf 0. Nach dem Deployment wird das Ergebnis wie folgt aussehen:<\/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\">Zusammenfassend<\/h3>\n<p><\/p>\n<p>F\u00fcr mich hilft es, das Deployment manuell so zu starten, um zu verstehen, wie einfach es mit k8s eingerichtet werden kann. Da Kubernetes alles \u00fcber die API aktualisiert, k\u00f6nnen diese Schritte \u00fcber Skripte automatisiert werden.<\/p>\n<p><\/p>\n<p>Eine weitere Sache, die umgesetzt werden muss, ist der Einstiegspunkt f\u00fcr den Tester (LoadBalancer oder \u00fcber Ingress), \u00fcber den nur auf die neue Version zugegriffen werden kann. Dies kann f\u00fcr manuelle \u00dcberpr\u00fcfungen verwendet werden.<\/p>\n<p><\/p>\n<p>In den folgenden Artikeln werden wir andere automatisierte L\u00f6sungen \u00fcberpr\u00fcfen, die die meisten der Dinge umsetzen, die wir gemacht haben.<\/p>\n<p><\/p>\n<h2 id=\"takzhe-chitayte-drugie-stati-v-nashem-bloge\">Lesen Sie auch andere Artikel in unserem Blog:<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/468779\/\">Was das Migrationsverfahren von ClickHouse ohne Authentifizierung auf ClickHouse mit Authentifizierung bewirkt hat<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473578\/\">Erstellung dynamischer Module f\u00fcr Nginx<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/news\/t\/502658\/\">Update nxs-build-tools \u2013 ein Helfer zum Erstellen von deb- und rpm-Paketen<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/473014\/\">Einf\u00fchrung in die Kubernetes-Autorisierung von Hashicorp Consul<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/504762\/\">Mit welchen Herausforderungen wir bei der Verwendung des Tools Csync2 konfrontiert waren<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/nixys\/blog\/347526\/\">Telegram-Bot f\u00fcr Redmine. Wie man das Leben f\u00fcr sich und andere erleichtert<\/a><\/noindex><\/li>\n<\/ul>\n<p>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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":"Wir werden Gitlab CI und manuelles GitOps verwenden, um Canary-Deployments einzuf\u00fchren und zu nutzen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/canary-deployment-v-kubernetes-1-gitlab-ci","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/90272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=90272"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/90272\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/90273"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=90272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=90272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=90272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}