{"id":35941,"date":"2019-10-31T22:07:41","date_gmt":"2019-10-31T19:07:41","guid":{"rendered":"https:\/\/prohoster.info\/blog\/chto-zhe-takoe-gitops\/"},"modified":"2019-10-31T22:07:41","modified_gmt":"2019-10-31T19:07:41","slug":"chto-zhe-takoe-gitops","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/chto-zhe-takoe-gitops","title":{"rendered":"Was ist GitOps?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Anmerkung des \u00dcbersetzers.<\/b>: Nach der k\u00fcrzlichen Ver\u00f6ffentlichung <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">Material<\/a><\/noindex> \u00fcber Pull- und Push-Methoden in GitOps haben wir ein gro\u00dfes Interesse an diesem Modell festgestellt. Allerdings gab es auf Russisch kaum Ver\u00f6ffentlichungen zu diesem Thema (auf Habr\u00e9 gibt es schlichtweg keine). Daher freuen wir uns, Ihnen die \u00dcbersetzung eines anderen Artikels anzubieten \u2014 auch wenn er bereits fast ein Jahr alt ist! \u2014 von der Firma Weaveworks, deren Leiter den Begriff \u201eGitOps\u201c gepr\u00e4gt hat. Der Text erl\u00e4utert die Essenz des Ansatzes und die wesentlichen Unterschiede zu den bereits bestehenden.<\/i><\/p>\n<p>\nVor einem Jahr haben wir <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-operations-by-pull-request\">eine Einf\u00fchrung in GitOps ver\u00f6ffentlicht<\/a><\/noindex>. Damals berichteten wir, wie das Team von Weaveworks eine SaaS vollst\u00e4ndig auf Kubernetes basierend gestartet hat und einen Katalog von empfohlenen Best Practices f\u00fcr Bereitstellung, Verwaltung und \u00dcberwachung in einer cloud-nativen Umgebung entwickelt hat.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Der Artikel war sehr popul\u00e4r. Andere Menschen begannen \u00fcber GitOps zu sprechen und ver\u00f6ffentlichten neue Werkzeuge f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hasura\/gitkube\">git push<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/dzone.com\/articles\/weaveworks-gitops-developer-toolkit-part-one-skaff\">Entwicklung<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/storing-secure-sealed-secrets-using-gitops\">Geheimnisse<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.alexellis.io\/introducing-openfaas-cloud\/\">Funktionen<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/jenkins.io\/blog\/2018\/03\/19\/introducing-jenkins-x\/\">kontinuierlicher Integration<\/a><\/noindex> usw. Auf unserer Website erschienen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/category\/gitops\/\">eine gro\u00dfe Anzahl<\/a><\/noindex> Ver\u00f6ffentlichungen und Anwendungsf\u00e4lle f\u00fcr GitOps. Aber einige Menschen hatten trotzdem noch Fragen. Wie unterscheidet sich das Modell von traditioneller <noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">Infrastruktur als Code<\/a><\/noindex> und kontinuierlicher Lieferung (<noindex><a rel=\"nofollow\" href=\"https:\/\/puppet.com\/blog\/a-deployment-pipeline-for-infrastructure-a-devops-case-study-at-nbn\">Continuous Delivery<\/a><\/noindex>)? Ist es zwingend erforderlich, Kubernetes zu verwenden?<\/p>\n<p>Bald erkannten wir, dass eine neue Beschreibung erforderlich war, die Folgendes bietet:<\/p>\n<ol>\n<li> Eine gro\u00dfe Anzahl von Beispielen und Geschichten;<\/li>\n<li> Eine konkrete Definition von GitOps;<\/li>\n<li> Einen Vergleich mit traditioneller Continuous Delivery.<\/li>\n<\/ol>\n<p>\nIn diesem Artikel haben wir versucht, all diese Themen abzudecken. Sie finden eine aktualisierte Einf\u00fchrung in GitOps und eine Sichtweise darauf von Entwicklern und CI\/CD. Wir konzentrieren uns haupts\u00e4chlich auf Kubernetes, obwohl das Modell durchaus verallgemeinerbar ist.<\/p>\n<h2>Lernen Sie GitOps kennen<\/h2>\n<p>\nStellen Sie sich Alice vor. Sie leitet die Familie Versicherungen, die Policen f\u00fcr Kranken-, Auto-, Immobilienversicherungen und Reiseversicherungen f\u00fcr Menschen anbieten, die zu besch\u00e4ftigt sind, um die Nuancen der Vertr\u00e4ge selbst zu verstehen. Ihr Gesch\u00e4ft begann als Nebenprojekt, als Alice als Datenwissenschaftlerin in einer Bank arbeitete. Eines Tages erkannte sie, dass sie fortschrittliche Computeralgorithmen nutzen kann, um Daten effizienter zu analysieren und Versicherungspakete zu schn\u00fcren. Investoren finanzierten das Projekt, und nun bringt ihr Unternehmen \u00fcber 20 Millionen Dollar pro Jahr ein und w\u00e4chst schnell. Zurzeit arbeiten 180 Personen in verschiedenen Positionen f\u00fcr sie. Dazu geh\u00f6rt auch ein technologisches Team, das f\u00fcr die Entwicklung, Wartung der Website, der Datenbank und die Analyse der Kundenbasis zust\u00e4ndig ist. Das Team von 60 Personen wird von Bob, dem technischen Direktor des Unternehmens, geleitet.<\/p>\n<p>Bobs Team implementiert Produktionssysteme in der Cloud. Ihre Hauptanwendungen laufen auf GKE und nutzen die Vorteile von Kubernetes in Google Cloud. Dar\u00fcber hinaus verwenden sie verschiedene Werkzeuge zur Datenverarbeitung und Analyse.<\/p>\n<p>Family Insurance hatte nicht vor, Container zu nutzen, war jedoch von dem Enthusiasmus f\u00fcr Docker angesteckt worden. Bald entdeckten die Spezialisten des Unternehmens, dass GKE es erm\u00f6glicht, Cluster zum Testen neuer Funktionen einfach und m\u00fchelos bereitzustellen. Jenkins wurde f\u00fcr CI hinzugef\u00fcgt, und Quay wurde zum Organisieren des Container-Registers eingef\u00fchrt; Skripte f\u00fcr Jenkins wurden geschrieben, die neue Container und Konfigurationen in GKE pushen.<\/p>\n<p>Es verging einige Zeit. Alice und Bob waren entt\u00e4uscht von der Leistung des gew\u00e4hlten Ansatzes und dessen Auswirkungen auf das Gesch\u00e4ft. Die Einf\u00fchrung von Containern hatte die Leistung nicht so gesteigert, wie das Team es erhofft hatte. Manchmal brachen Deployments zusammen, und es war unklar, ob die Code\u00e4nderungen daran schuld waren. Auch das Verfolgen von Konfigurations\u00e4nderungen stellte sich als schwierig heraus. Oft war es einfacher, einen neuen Cluster zu erstellen und die Anwendungen dorthin zu verschieben, um das Durcheinander zu beseitigen, in das das System geraten war. Alice hatte Angst, dass die Situation sich verschlechtern w\u00fcrde, als das Projekt weiterwuchs (dar\u00fcber hinaus stand ein neues Projekt auf Basis von maschinellem Lernen an). Bob hatte einen gro\u00dfen Teil der Arbeit automatisiert und verstand nicht, warum die Pipeline immer noch instabil war, schlecht skalierte und gelegentlich manuelle Eingriffe erforderte.<\/p>\n<p><b>Dann erfuhren sie von GitOps. Diese L\u00f6sung stellte sich als genau das heraus, was sie ben\u00f6tigten, um selbstbewusst voranzukommen.<\/b><\/p>\n<p>Alice und Bob hatten seit mehreren Jahren von git-basierten Workflows, DevOps und Infrastructure as Code geh\u00f6rt. Das Besondere an GitOps ist, dass es eine Reihe bew\u00e4hrter Praktiken \u2013 kategorisch und normativ \u2013 in den Kontext von Kubernetes bringt. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/search?q=gitops&amp;src=typd\">Dieses Thema<\/a><\/noindex>wurde mehrfach angesprochen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-high-velocity-cicd-for-kubernetes\">unter anderem im<\/a><\/noindex>.<\/p>\n<p>Weaveworks-Blog. Family Insurance beschlie\u00dft die Einf\u00fchrung von GitOps. Jetzt hat das Unternehmen ein automatisiertes Betriebsmodell, das mit Kubernetes kompatibel ist und <i>die Geschwindigkeit<\/i> f\u00fcr <i>Stabilit\u00e4t<\/i>, da sie:<\/p>\n<ul>\n<li> feststellten, dass die Produktivit\u00e4t des Teams sich verdoppelt hat und niemand dabei den Verstand verliert;<\/li>\n<li> die Skripte nicht mehr warten mussten. Stattdessen k\u00f6nnen sie sich nun auf neue Funktionen konzentrieren und die Ingenieurmethoden verbessern \u2013 beispielsweise durch die Einf\u00fchrung von Canary-Releases und die Verbesserung der Tests;<\/li>\n<li> den Deploy-Prozess verbessert haben \u2013 nun bricht er selten zusammen;<\/li>\n<li> haben die M\u00f6glichkeit, Deployments nach teilweisen Ausf\u00e4llen ohne manuelle Eingriffe wiederherzustellen;<\/li>\n<li> sie mehr Vertrauen in die Bereitstellungssysteme gewonnen haben. Alice und Bob stellten fest, dass sie das Team in Gruppen aufteilen konnten, die sich mit Mikrodiensten befassen und parallel arbeiten;<i>o<\/i>sie t\u00e4glich 30 bis 50 \u00c4nderungen am Projekt durch die Anstrengungen jeder Gruppe einbringen k\u00f6nnen und neue Techniken ausprobieren;<\/li>\n<li> k\u00f6nnen t\u00e4glich 30-50 \u00c4nderungen am Projekt durch die Anstrengungen jeder Gruppe vornehmen und neue Techniken ausprobieren;<\/li>\n<li> ziehen leicht neue Entwickler f\u00fcr das Projekt an, die innerhalb weniger Stunden Updates in die Produktion \u00fcber Pull Requests einpflegen k\u00f6nnen;<\/li>\n<li> sie bestehen leicht die SOC2-Pr\u00fcfung <i>(um die Anforderungen an die sichere Datenverwaltung von Dienstanbietern zu entsprechen; mehr dazu lesen Sie beispielsweise <noindex><a rel=\"nofollow\" href=\"https:\/\/www.imperva.com\/learn\/data-security\/soc-2-compliance\/\">hier<\/a><\/noindex> \u2014 Anm. d. \u00dcbersetzer)<\/i>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Was ist passiert?<\/h3>\n<p>\nGitOps ist zwei Dinge:<\/p>\n<ol>\n<li> Ein Betriebsmodell f\u00fcr Kubernetes und Cloud-native Anwendungen. Es bietet eine Sammlung von Best Practices f\u00fcr die Bereitstellung, Verwaltung und \u00dcberwachung von in Containern geb\u00fcndelten Clustern und Anwendungen. Eine elegante Definition in Form von <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/vitorsilva\/status\/999978906903080961\">einer Folie<\/a><\/noindex> ab <noindex><a rel=\"nofollow\" href=\"https:\/\/2018.agilept.org\/speaker_luis_faceira.html\">Luis Faceira<\/a><\/noindex>:\n<\/li>\n<li> Der Weg zur Schaffung einer entwicklerfreundlichen Umgebung f\u00fcr das Anwendungsmanagement. Wir wenden den Git-Workflow sowohl auf die Betriebsf\u00fchrung als auch auf die Entwicklung an. Beachten Sie, dass es nicht nur um Git Push geht, sondern um die Organisation des gesamten Sets an CI\/CD- und UI\/UX-Tools.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Ein paar Worte \u00fcber Git<\/h3>\n<p>\nWenn Sie nicht mit Versionskontrollsystemen und einem auf Git basierenden Workflow vertraut sind, empfehlen wir dringend, sich damit auseinanderzusetzen. Zu Beginn kann die Arbeit mit Branches und Pull Requests wie schwarze Magie erscheinen, aber die Vorteile sind den Aufwand wert. Hier ist <noindex><a rel=\"nofollow\" href=\"https:\/\/codeburst.io\/trunk-based-development-vs-git-flow-a0212a6cae64\">ein guter Artikel<\/a><\/noindex> ein guter Ausgangspunkt.<\/p>\n<h2>Wie Kubernetes funktioniert<\/h2>\n<p>\nIn unserer Geschichte wandten Alice und Bob sich an GitOps, nachdem sie eine Weile mit Kubernetes gearbeitet hatten. Tats\u00e4chlich ist GitOps eng mit Kubernetes verbunden \u2013 es ist ein Betriebsmodell f\u00fcr Infrastruktur und Anwendungen, die auf Kubernetes basieren.<\/p>\n<h3>Was bietet Kubernetes den Nutzern?<\/h3>\n<p>\nHier sind einige der wichtigsten Funktionen:<\/p>\n<ol>\n<li> Im Kubernetes-Modell kann alles in deklarativer Form beschrieben werden.<\/li>\n<li> Der Kubernetes-API-Server akzeptiert eine solche Deklaration als Eingabe und versucht dann st\u00e4ndig, den Cluster in den in der Deklaration beschriebenen Zustand zu versetzen.<\/li>\n<li> Deklarationen sind ausreichend, um eine gro\u00dfe Vielfalt von Workloads \u2013 'Anwendungen' \u2013 zu beschreiben und zu verwalten.<\/li>\n<li> Infolgedessen erfolgen \u00c4nderungen an der Anwendung und dem Cluster aufgrund von:\n<ul>\n<li> \u00c4nderungen an Container-Images;<\/li>\n<li> \u00c4nderungen an der deklarativen Spezifikation;<\/li>\n<li> Fehler in der Umgebung \u2013 zum Beispiel Container-Abst\u00fcrze.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Die hervorragenden Konvergenzf\u00e4higkeiten von Kubernetes<\/h3>\n<p>\nWenn ein Administrator \u00c4nderungen an der Konfiguration vornimmt, wird der Kubernetes-Orchestrator diese auf den Cluster anwenden, bis sein Zustand <i>der neuen Konfiguration n\u00e4herkommt.<\/i>. Dieses Modell funktioniert f\u00fcr jede Kubernetes-Ressource und wird durch benutzerdefinierte Ressourcendefinitionen (CRDs) erweitert. Daher besitzen Kubernetes-Deployments die folgenden wunderbaren Eigenschaften:<\/p>\n<ul>\n<li> <b>Automatisierung<\/b>: Kubernetes-Updates bieten einen Mechanismus zur Automatisierung des Prozesses, \u00c4nderungen korrekt und zeitgerecht anzuwenden.<\/li>\n<li> <b>Konvergenz<\/b>: Kubernetes wird weiterhin versuchen, Updates durchzuf\u00fchren, bis der Erfolg erreicht ist.<\/li>\n<li> <b>Idempotenz<\/b>: Wiederholte Anwendungen der Konvergenz f\u00fchren zum gleichen Ergebnis.<\/li>\n<li> <b>Determinismus<\/b>: Bei ausreichenden Ressourcen h\u00e4ngt der Zustand des aktualisierten Clusters nur vom gew\u00fcnschten Zustand ab.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Wie GitOps funktioniert<\/h2>\n<p>\nWir haben genug \u00fcber Kubernetes gelernt, um die Prinzipien von GitOps zu erkl\u00e4ren.<\/p>\n<p>Lassen Sie uns zu den von der Family Insurance verwalteten Micodiensten zur\u00fcckkehren. Womit haben sie normalerweise zu tun? Schauen Sie sich die Liste unten an (wenn Ihnen einige Punkte seltsam oder unbekannt vorkommen \u2014 bitte sehen Sie von Kritik ab und bleiben Sie bei uns). Das sind nur Beispiele f\u00fcr Arbeitsabl\u00e4ufe basierend auf Jenkins. Es gibt auch viele andere Prozesse bei der Verwendung anderer Tools.<\/p>\n<p>Das Wichtigste ist, dass wir sehen, dass jedes Update mit \u00c4nderungen an den Konfigurationsdateien und Git-Repositories endet. Diese \u00c4nderungen in Git f\u00fchren dazu, dass der \"GitOps-Operator\" das Cluster aktualisiert:<\/p>\n<p>1. Arbeitsablauf: \u201e<i>Jenkins-Bau \u2014 master-Zweig<\/i>\u00bb.<br \/>\nAufgabenliste:<\/p>\n<ul>\n<li> Jenkins pusht getaggte Images in Quay;<\/li>\n<li> Jenkins pusht Konfigurationen und Helm-Charts in den Master-Speicher-Bucket;<\/li>\n<li> Die Cloud-Funktion kopiert Konfiguration und Charts aus dem Bucket des master-Speichers in das Git-Repository master;<\/li>\n<li> Der GitOps-Operator aktualisiert das Cluster.<\/li>\n<\/ul>\n<p>\n2. <i>Jenkins-Bau \u2014 release- oder hotfix-Zweig<\/i>:<\/p>\n<ul>\n<li> Jenkins pusht ungetaggte Images in Quay;<\/li>\n<li> Jenkins pusht Konfigurationen und Helm-Charts in den Staging-Speicher-Bucket;<\/li>\n<li> Die Cloud-Funktion kopiert Konfiguration und Charts aus dem Bucket des staging-Speichers in das Git-Repository staging;<\/li>\n<li> Der GitOps-Operator aktualisiert das Cluster.<\/li>\n<\/ul>\n<p>\n3. <i>Jenkins-Bau \u2014 develop- oder feature-Zweig<\/i>:<\/p>\n<ul>\n<li> Jenkins pusht ungetaggte Images in Quay;<\/li>\n<li> Jenkins pusht Konfigurationen und Helm-Charts in den Develop-Speicher-Bucket;<\/li>\n<li> Die Cloud-Funktion kopiert Konfiguration und Charts aus dem Bucket des develop-Speichers in das Git-Repository develop;<\/li>\n<li>Der GitOps-Operator aktualisiert das Cluster.<\/li>\n<\/ul>\n<p>\n4. <i>Hinzuf\u00fcgen eines neuen Clients<\/i>:<\/p>\n<ul>\n<li> Der Manager oder Administrator (LCM\/ops) ruft Gradle f\u00fcr das erste Deployment und die Einrichtung von Load-Balancern (NLB) auf;<\/li>\n<li> LCM\/ops committet eine neue Konfiguration zur Vorbereitung des Deployments auf Updates;<\/li>\n<li> Der GitOps-Operator aktualisiert das Cluster.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Kurze Beschreibung von GitOps<\/h3>\n<p><\/p>\n<ol>\n<li> Beschreiben Sie den gew\u00fcnschten Zustand des gesamten Systems unter Verwendung deklarativer Spezifikationen f\u00fcr jede Umgebung (in unserer Geschichte definiert Bob's Team die gesamte Systemkonfiguration in Git).\n<ul>\n<li> Das Git-Repository ist die einzige Quelle der Wahrheit in Bezug auf den gew\u00fcnschten Zustand des gesamten Systems.<\/li>\n<li> Alle \u00c4nderungen an dem gew\u00fcnschten Zustand erfolgen durch Commits in Git.<\/li>\n<li> Alle gew\u00fcnschten Clusterparameter sind auch im Cluster selbst sichtbar. So k\u00f6nnen wir feststellen, ob die gew\u00fcnschten und beobachteten Zust\u00e4nde \u00fcbereinstimmen (konvergieren, <i>converge<\/i>) oder sich unterscheiden (divergieren, <i>diverge<\/i>) .<\/li>\n<\/ul>\n<\/li>\n<li> Wenn sich der gew\u00fcnschte und der beobachtete Zustand unterscheiden, dann:\n<ul>\n<li> Es gibt einen Konvergenzmechanismus, der fr\u00fcher oder sp\u00e4ter automatisch den Ziel- und den beobachteten Zustand synchronisiert. Innerhalb des Clusters k\u00fcmmert sich Kubernetes darum.<\/li>\n<li> Der Prozess wird umgehend mit der Benachrichtigung \"\u00c4nderung eingepflegt\" gestartet.<\/li>\n<li> Nach einem einstellbaren Zeitraum kann eine Benachrichtigung \"Diff\" gesendet werden, wenn sich die Zust\u00e4nde unterscheiden.<\/li>\n<\/ul>\n<\/li>\n<li> So verursachen alle Commits in Git \u00fcberpr\u00fcfbare und idempotente Updates im Cluster.\n<ul>\n<li>Rollback ist eine Konvergenz zu einem fr\u00fcheren gew\u00fcnschten Zustand.<\/li>\n<\/ul>\n<\/li>\n<li> Die Konvergenz ist endg\u00fcltig. Ihr Eintritt wird angezeigt durch:\n<ul>\n<li> Das Fehlen von \"Diff\"-Benachrichtigungen \u00fcber einen bestimmten Zeitraum.<\/li>\n<li> Eine \"konvergierte\" Benachrichtigung (z. B. Webhook, Git-Writeback-Ereignis).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><\/p>\n<h3>Was ist Divergenz?<\/h3>\n<p>\nNochmals: <i>Alle gew\u00fcnschten Eigenschaften des Clusters m\u00fcssen im Cluster selbst sichtbar sein.<\/i>.<\/p>\n<p>Einige Beispiele f\u00fcr Divergenz:<\/p>\n<ul>\n<li> \u00c4nderung in der Konfigurationsdatei aufgrund von Zusammenf\u00fchrungen in Git.<\/li>\n<li> \u00c4nderung in der Konfigurationsdatei aufgrund eines Commits in Git, der von einem GUI-Client vorgenommen wurde.<\/li>\n<li> Mehrere \u00c4nderungen im gew\u00fcnschten Zustand aufgrund eines PR in Git mit anschlie\u00dfender Erstellung des Container-Images und \u00c4nderungen an der Konfiguration.<\/li>\n<li> \u00c4nderung des Clusterzustands aufgrund eines Fehlers, Ressourcen-Konflikts, der zu \"schlechtem Verhalten\" f\u00fchrt, oder einfach einer zuf\u00e4lligen Abweichung vom urspr\u00fcnglichen Zustand.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Was stellt der Konvergenzmechanismus dar?<\/h3>\n<p>\nEinige Beispiele:<\/p>\n<ul>\n<li> F\u00fcr Container und Cluster stellt Kubernetes den Konvergenzmechanismus bereit.<\/li>\n<li> Der gleiche Mechanismus kann zur Verwaltung von Anwendungen und Konstruktionen auf Basis von Kubernetes (z. B. Istio und Kubeflow) verwendet werden.<\/li>\n<li> Der Mechanismus zur Verwaltung der Arbeitsinteraktion zwischen Kubernetes, Bild-Repositorys und Git bietet <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">GitOps-Operator Weave Flux<\/a><\/noindex>, der Teil von <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex>.<\/li>\n<li> F\u00fcr Basismaschinen muss der Konvergenzmechanismus deklarativ und autonom sein. Aus eigener Erfahrung k\u00f6nnen wir sagen, dass <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.gruntwork.io\/why-we-use-terraform-and-not-chef-puppet-ansible-saltstack-or-cloudformation-7989dad2865c\">Terraform<\/a><\/noindex> dieser Definition jedoch am n\u00e4chsten kommt, es dennoch menschlicher Kontrolle bedarf. In diesem Sinne erweitert GitOps die Traditionen von Infrastructure as Code.<\/li>\n<\/ul>\n<p>\nGitOps vereint Git mit einem hervorragenden Kubernetes-Konvergenzmechanismus und bietet ein Modell f\u00fcr den Betrieb.<\/p>\n<p>GitOps erm\u00f6glicht es uns zu erkl\u00e4ren: <i>Automatisierung und Kontrolle sind nur f\u00fcr solche Systeme m\u00f6glich, die beschrieben und beobachtet werden k\u00f6nnen.<\/i>.<\/p>\n<h3>GitOps ist f\u00fcr den gesamten Cloud-Native-Stack gedacht (z.B. Terraform usw.)<\/h3>\n<p>\nGitOps ist nicht nur Kubernetes. Wir wollen, dass das gesamte System deklarativ verwaltet wird und Konvergenz nutzt. Mit \"Gesamtsystem\" meinen wir eine Ansammlung von Umgebungen, die mit Kubernetes betrieben werden \u2014 zum Beispiel \"dev cluster 1\", \"Produktion\" usw. Jede Umgebung besteht aus Maschinen, Clustern, Anwendungen sowie Schnittstellen zu externen Diensten, die Daten, \u00dcberwachung usw. bereitstellen.<\/p>\n<p>Beachten Sie, wie wichtig Terraform in diesem Fall f\u00fcr das Bootstrapping-Problem ist. Kubernetes muss irgendwo bereitgestellt werden, und die Verwendung von Terraform bedeutet, dass wir dieselben GitOps-Workflows anwenden k\u00f6nnen, um die Steuerungsschicht zu erstellen, die Kubernetes und Anwendungen zugrunde liegt. Das ist eine n\u00fctzliche Best Practice.<\/p>\n<p>Ein gro\u00dfes Augenmerk liegt auf der Anwendung von GitOps-Konzepten auf Ebenen \u00fcber Kubernetes. Momentan gibt es GitOps-L\u00f6sungen f\u00fcr Istio, Helm, Ksonnet, OpenFaaS und Kubeflow, sowie z.B. f\u00fcr Pulumi, was eine Schicht zum Entwickeln von Cloud-Native-Anwendungen schafft.<\/p>\n<h2>Kubernetes CI\/CD: Vergleich von GitOps mit anderen Ans\u00e4tzen<\/h2>\n<p>\nWie bereits erw\u00e4hnt, ist GitOps zwei Dinge:<\/p>\n<ol>\n<li> Ein Betriebsmodell f\u00fcr Kubernetes und Cloud-Native, wie oben beschrieben.<\/li>\n<li> Der Weg zur Schaffung einer entwicklerorientierten Umgebung f\u00fcr die Verwaltung von Anwendungen.<\/li>\n<\/ol>\n<p>\nF\u00fcr viele ist GitOps in erster Linie ein Git-push-basierter Workflow. Auch wir m\u00f6gen ihn. Aber das ist nicht alles: Lassen Sie uns nun die CI\/CD-Pipelines betrachten.<\/p>\n<h3>GitOps erm\u00f6glicht kontinuierliche Bereitstellung (CD) unter Kubernetes.<\/h3>\n<p>\nGitOps bietet einen Mechanismus f\u00fcr kontinuierliche Bereitstellung, der die Notwendigkeit separater \"Bereitstellungssysteme\" \u00fcberfl\u00fcssig macht. Die gesamte Arbeit wird von Kubernetes f\u00fcr Sie erledigt.<\/p>\n<ul>\n<li> Ein Anwendungsupdate erfordert ein Update in Git. Dies ist ein transaktionales Update auf den gew\u00fcnschten Zustand. Das 'Deployment' erfolgt dann innerhalb des Clusters durch Kubernetes basierend auf der aktualisierten Beschreibung.<\/li>\n<li> Aufgrund der Funktionsweise von Kubernetes sind diese Updates konvergent. Dies gew\u00e4hrleistet einen Mechanismus f\u00fcr kontinuierliches Deployment, bei dem alle Updates atomar sind.<\/li>\n<li> Hinweis: <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.weave.works\/\">Weave Cloud<\/a><\/noindex> bietet einen GitOps-Operator, der Git und Kubernetes integriert und es erm\u00f6glicht, Continuous Delivery (CD) durch die Abstimmung des gew\u00fcnschten und aktuellen Zustands des Clusters durchzuf\u00fchren.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Ohne kubectl und Skripte<\/h3>\n<p>\nDie Verwendung von Kubectl zur Aktualisierung des Clusters sollte vermieden werden, insbesondere Skripte zur Gruppierung von kubectl-Befehlen. Stattdessen kann der Benutzer \u00fcber eine GitOps-Pipeline seinen Kubernetes-Cluster \u00fcber Git aktualisieren.<\/p>\n<p>Die Vorteile umfassen:<\/p>\n<ol>\n<li> <b>Richtigkeit<\/b>. Eine Gruppe von Updates kann angewendet, konvergiert und schlie\u00dflich validiert werden, was uns dem Ziel des atomaren Deployments n\u00e4her bringt. Im Gegensatz dazu bieten Skripte keine Garantien f\u00fcr die Konvergenz (mehr dazu unten).<\/li>\n<li> <b>Sicherheit<\/b>. <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/kelseyhightower\/status\/939003832805179392?lang=en\">Zitat von<\/a><\/noindex> Kelsey Hightower: \u201eBeschr\u00e4nken Sie den Zugriff auf den Kubernetes-Cluster auf Automatisierungswerkzeuge und Administratoren, die f\u00fcr dessen Debugging oder den Betrieb verantwortlich sind\u201c. Siehe auch <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">meinen Beitrag<\/a><\/noindex> zur Sicherheit und Compliance mit technischen Anforderungen sowie <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@vesirin\/how-i-gained-commit-access-to-homebrew-in-30-minutes-2ae314df03ab\">einen Artikel \u00fcber den Homebrew-Hack<\/a><\/noindex> durch den Diebstahl von Anmeldeinformationen aus einem nachl\u00e4ssig verfassten Jenkins-Skript.<\/li>\n<li> <b>Benutzererfahrung<\/b>. Kubectl legt die Mechanik des Kubernetes-Objektmodells offen, die sehr komplex ist. Ideal w\u00e4re es, wenn die Benutzer auf einer h\u00f6heren Abstraktionsebene mit dem System interagieren. Hier verweise ich erneut auf Kelsey und empfehle, sich <noindex><a rel=\"nofollow\" href=\"http:\/\/superuser.openstack.org\/articles\/kubernetes-boring\/\">dieses Res\u00fcmee anzusehen<\/a><\/noindex>.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Der Unterschied zwischen CI und CD<\/h3>\n<p>\nGitOps verbessert bestehende CI\/CD-Modelle.<\/p>\n<p>Ein moderner CI-Server ist ein Werkzeug zur Orchestrierung. Insbesondere ist es ein Werkzeug zur Orchestrierung von CI-Pipelines. Diese umfassen Build, Test, Merge in den Hauptzweig usw. CI-Server automatisieren die Verwaltung komplexer mehrstufiger Pipelines. Eine weit verbreitete Versuchung besteht darin, ein Skript f\u00fcr eine Reihe von Kubernetes-Updates zu erstellen und es als Pipeline-Element f\u00fcr das Pushen von \u00c4nderungen in das Cluster auszuf\u00fchren. Tats\u00e4chlich tun dies viele Spezialisten. Aber es ist nicht optimal, und das ist der Grund daf\u00fcr.<\/p>\n<p>CI sollte verwendet werden, um Aktualisierungen in den trunk einzubringen, und der Kubernetes-Cluster sollte sich basierend auf diesen Aktualisierungen \u00e4ndern, um CD \u201eintern\u201c zu verwalten. Wir nennen das <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/gitops-compliance-and-secure-cicd\">Pull-Modell f\u00fcr CD<\/a><\/noindex>, im Gegensatz zum CI-Push-Modell. CD ist Teil der <i>Laufzeit-Orchestrierung<\/i>.<\/p>\n<h3>Warum CI-Server CD nicht durch direkte Updates in Kubernetes durchf\u00fchren sollten<\/h3>\n<p>\n<i>Verwenden Sie den CI-Server nicht zur Orchestrierung direkter Updates in Kubernetes in Form einer Reihe von CI-Jobs. Dies ist ein Anti-Muster, \u00fcber das wir <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/kubernetes-anti-patterns-let-s-do-gitops-not-ciops\">hat bereits dar\u00fcber berichtet<\/a><\/noindex> in unserem Blog.<\/i><\/p>\n<p>Kommen wir zur\u00fcck zu Alice und Bob.<\/p>\n<p>Mit welchen Problemen hatten sie zu k\u00e4mpfen? Bobs CI-Server wendet \u00c4nderungen auf den Cluster an, aber wenn er w\u00e4hrend dieses Prozesses abst\u00fcrzt, wei\u00df Bob nicht, in welchem Zustand sich der Cluster befindet (oder befinden sollte) und wie er ihn reparieren kann. Das Gleiche gilt im Falle eines Erfolgs.<\/p>\n<p>Nehmen wir an, Bob's Team hat ein neues Image erstellt und dann ihre Deployments gepatcht, um das Image bereitzustellen (alles aus der CI-Pipeline heraus).<\/p>\n<p>Wenn das Image erfolgreich erstellt wird, aber die Pipeline abst\u00fcrzt, muss das Team herausfinden:<\/p>\n<ul>\n<li> Wurde das Update bereitgestellt?<\/li>\n<li> F\u00fchren wir den neuen Build aus? F\u00fchrt das zu unerw\u00fcnschten Nebeneffekten \u2013 besteht die M\u00f6glichkeit, zwei Builds des gleichen unver\u00e4nderten Images zu erhalten? <\/li>\n<li> Sollten wir auf das n\u00e4chste Update warten, bevor wir den Build ausf\u00fchren?<\/li>\n<li> Was genau ist schief gelaufen? Welche Schritte m\u00fcssen wiederholt werden (und welche d\u00fcrfen sicher wiederholt werden)?<\/li>\n<\/ul>\n<p>\n<i>Die Organisation eines git-basierten Workflows garantiert nicht, dass Bob's Team mit diesen Problemen nicht konfrontiert wird. Sie k\u00f6nnen immer noch beim Pushen eines Commits, beim Tag oder bei einem anderen Parameter Fehler machen; dieser Ansatz ist jedoch trotzdem viel n\u00e4her am expliziten alles-oder-nichts.<\/i><\/p>\n<p>Zusammenfassend: Hier ist der Grund, warum CI-Server sich nicht um CD k\u00fcmmern sollten:<\/p>\n<ul>\n<li> Aktualisierungsskripte sind nicht immer deterministisch; man kann leicht Fehler machen.<\/li>\n<li> CI-Server konvergieren nicht zu einem deklarativen Modell des Clusters.<\/li>\n<li> Es ist schwierig, Idempotenz sicherzustellen. Benutzer m\u00fcssen sich mit der tiefen Semantik des Systems auseinandersetzen.<\/li>\n<li> Es ist schwieriger, sich von teilweisen Ausf\u00e4llen zu erholen.<\/li>\n<\/ul>\n<p>\n<i>Hinweis zu Helm: Wenn Sie Helm verwenden m\u00f6chten, empfehlen wir, ihn mit einem GitOps-Operator wie zu kombinieren <noindex><a rel=\"nofollow\" href=\"https:\/\/www.weave.works\/blog\/managing-helm-releases-the-gitops-way\">Flux-Helm<\/a><\/noindex>zu kombinieren. Das hilft, Konvergenz zu gew\u00e4hrleisten. Helm ist f\u00fcr sich genommen weder deterministisch noch atomar.<\/i><\/p>\n<h2>GitOps als der beste Weg, um Continuous Delivery f\u00fcr Kubernetes zu realisieren<\/h2>\n<p>\nDas Team von Alice und Bob implementiert GitOps und stellt fest, dass die Arbeit mit Softwareprodukten, die Aufrechterhaltung von hoher Leistung und Stabilit\u00e4t wesentlich einfacher geworden ist. Lassen Sie uns diesen Artikel mit Illustrationen abschlie\u00dfen, die zeigen, wie ihr neuer Ansatz aussieht. Beachten Sie, dass wir haupts\u00e4chlich \u00fcber Anwendungen und Dienste sprechen, jedoch kann GitOps zur Verwaltung der gesamten Plattform eingesetzt werden.<\/p>\n<h3>Betriebsmodell f\u00fcr Kubernetes<\/h3>\n<p>\nSehen Sie sich das folgende Diagramm an. Es stellt Git und das Container-Images-Repository als gemeinsame Ressourcen f\u00fcr zwei orchestrierte Lebenszyklen dar:<\/p>\n<ul>\n<li> Ein Pipeline f\u00fcr kontinuierliche Integration, der Dateien in Git liest und schreibt und m\u00f6glicherweise das Container-Image-Repository aktualisiert.<\/li>\n<li> Eine Pipeline f\u00fcr Runtime GitOps, die Deployment mit Management und \u00dcberwachung kombiniert. Sie liest und schreibt Dateien in Git und kann Container-Images hochladen.<\/li>\n<\/ul>\n<h3>Was sind die wichtigsten Erkenntnisse?<\/h3>\n<p><\/p>\n<ol>\n<li> <b>Trennung der Probleme<\/b>: Beachten Sie, dass beide Pipelines Daten austauschen k\u00f6nnen, indem sie nur Git oder das Image-Repository aktualisieren. Mit anderen Worten, es gibt eine Netzwerkgrenze zwischen CI und Runtime-Umgebung. Wir nennen es \"Unver\u00e4nderlichkeits-Firewall\" <i>(immutability firewall)<\/i>, da alle Repository-Aktualisierungen neue Versionen erzeugen. F\u00fcr weitere Informationen zu diesem Thema k\u00f6nnen Sie die Folien 72-87 konsultieren. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/weaveworks\/continuous-lifecycle-london-2018-event-keynote-97418556\">dieser Pr\u00e4sentation<\/a><\/noindex>.<\/li>\n<li> <b>Jeder CI- und Git-Server kann verwendet werden<\/b>: GitOps funktioniert mit allen Komponenten. Sie k\u00f6nnen weiterhin Ihre bevorzugten CI- und Git-Server, Image-Repositories und Test-Sets verwenden. Fast alle anderen Tools f\u00fcr Continuous Delivery auf dem Markt erfordern einen eigenen CI-\/Git-Server oder ein Image-Repository. Dies kann zum begrenzenden Faktor bei der Entwicklung von Cloud-Native-Anwendungen werden. Im Fall von GitOps k\u00f6nnen Sie die gewohnten Werkzeuge verwenden.<\/li>\n<li> <b>Ereignisse als Integrationswerkzeug<\/b>: Sobald Daten in Git aktualisiert werden, informiert Weave Flux (oder der Weave Cloud Operator) dar\u00fcber die Runtime. Jedes Mal, wenn Kubernetes eine Reihe von \u00c4nderungen annimmt, wird Git aktualisiert. Dies bietet ein einfaches Integrationsmodell f\u00fcr die Organisation von Workflows f\u00fcr GitOps, wie unten gezeigt.<\/li>\n<\/ol>\n<h2>Fazit<\/h2>\n<p>\nGitOps bietet wesentliche Garantien f\u00fcr Updates, die jedes moderne CI\/CD-Tool ben\u00f6tigt:<\/p>\n<ul>\n<li> Automatisierung;<\/li>\n<li> Konvergenz;<\/li>\n<li> Idempotenz;<\/li>\n<li> Determinismus.<\/li>\n<\/ul>\n<p>\nDas ist wichtig, da es ein Betriebsmodell f\u00fcr Entwickler im Bereich Cloud Native bietet.<\/p>\n<ul>\n<li> Traditionelle Werkzeuge zur Verwaltung und \u00dcberwachung von Systemen sind mit Betriebsteams verbunden, die innerhalb eines Runbooks arbeiten <i>(eines Satzes von Routineverfahren und -operationen \u2014 Anm. d. \u00dcbers.).<\/i>, das an ein bestimmtes Deployment gebunden ist.<\/li>\n<li> Im Management von Cloud Native-Systemen ist das Werkzeug zur \u00dcberwachung der beste Weg, um die Ergebnisse von Bereitstellungen zu bewerten, damit das Entwicklerteam schnell darauf reagieren kann.<\/li>\n<\/ul>\n<p>\nStellen Sie sich eine Vielzahl von Clustern vor, die \u00fcber verschiedene Clouds verteilt sind, und viele Dienste mit eigenen Teams und Bereitstellungspl\u00e4nen. GitOps bietet ein skalierbar-invariantes Modell, um all diese Vielfalt zu verwalten.<\/p>\n<h2>P.S. vom \u00dcbersetzer<\/h2>\n<p>\nLesen Sie auch in unserem Blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/456754\/\">GitOps: Vergleich der Pull- und Push-Methoden<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">Wir stellen die Bibliothek kubedog zur \u00dcberwachung von Kubernetes-Ressourcen vor<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Erweiterung und Erg\u00e4nzung von Kubernetes (\u00dcbersicht und Video des Berichts)<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p class=\"for_users_only_msg\">Nur registrierte Benutzer k\u00f6nnen an der Umfrage teilnehmen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Bitte einloggen<\/a><\/noindex>.<\/p>\n<h2 class=\"default-block__polling-title\">Wussten Sie von GitOps, bevor diese beiden \u00dcbersetzungen auf Habr erschienen?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja, ich wusste es.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nur oberfl\u00e4chlich.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nein<\/p>\n<\/li>\n<\/ul>\n<p>    35 Benutzer haben abgestimmt. 10 Benutzer haben sich enthalten.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 pull \u0438 push \u0432 GitOps \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043a \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b\u043e (\u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0438\u0445 \u043f\u043e\u043f\u0440\u043e\u0441\u0442\u0443 \u043d\u0435\u0442). \u041f\u043e\u0441\u0435\u043c\u0443 \u0440\u0430\u0434\u044b \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u043f\u0443\u0441\u0442\u044c \u0438 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0434\u0438\u0447\u043d\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438! \u2014 \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Weaveworks, \u0433\u043b\u0430\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35941","post","type-post","status-publish","format-standard","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=\"\u041f\u0440\u0438\u043c.\" \/>\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\/chto-zhe-takoe-gitops\" \/>\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\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/chto-zhe-takoe-gitops\" \/>\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=\"2019-10-31T19:07:41+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:07:41+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\udd47Was ist GitOps? | ProHoster","description":"z.B.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/chto-zhe-takoe-gitops","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\udd47\u0427\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 GitOps? | ProHoster","og:description":"\u041f\u0440\u0438\u043c.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/chto-zhe-takoe-gitops","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":"2019-10-31T19:07:41+00:00","article:modified_time":"2019-10-31T19:07:41+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35941","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":"2026-01-22 01:21:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:53:31","updated":"2026-01-22 01:21:19","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\/35941","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=35941"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35941\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=35941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=35941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=35941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}