{"id":35955,"date":"2019-10-31T22:08:26","date_gmt":"2019-10-31T19:08:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\/"},"modified":"2019-10-31T22:08:26","modified_gmt":"2019-10-31T19:08:26","slug":"razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","title":{"rendered":"Nach zwei Jahren Entwicklung erfolgte die Ver\u00f6ffentlichung von Debian.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<\/p>\n<p><\/p>\n<h2 id=\"kak-dailymotion-ispolzuet-kubernetes-razvertyvanie-prilozheniy\">Wie Dailymotion Kubernetes nutzt: Anwendungsbereitstellung<\/h2>\n<p><\/p>\n<p>Wir bei Dailymotion haben vor 3 Jahren begonnen, Kubernetes in der Produktion zu nutzen. Aber die Bereitstellung von Anwendungen \u00fcber mehrere Cluster ist m\u00fchsam, weshalb wir in den letzten Jahren versucht haben, unsere Werkzeuge und Arbeitsabl\u00e4ufe zu verbessern.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"s-chego-nachalos\">Wie alles begann<\/h3>\n<p><\/p>\n<p>Hier erz\u00e4hlen wir, wie wir unsere Anwendungen \u00fcber mehrere Kubernetes-Clustern weltweit bereitstellen.<\/p>\n<p><\/p>\n<p>Um mehrere Kubernetes-Objekte gleichzeitig bereitzustellen, nutzen wir <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Helm<\/a><\/noindex>, und alle unsere Charts werden in einem Git-Repository gespeichert. Um einen vollst\u00e4ndigen Anwendungsstack aus mehreren Diensten bereitzustellen, verwenden wir das sogenannte Aggregationschart. Im Grunde genommen ist es ein Chart, das Abh\u00e4ngigkeiten erkl\u00e4rt und es erm\u00f6glicht, die API und deren Dienste mit einem Befehl zu initialisieren.<\/p>\n<p><\/p>\n<p>Au\u00dferdem haben wir ein kleines Python-Skript \u00fcber Helm geschrieben, um \u00dcberpr\u00fcfungen durchzuf\u00fchren, Charts zu erstellen, Geheimnisse hinzuzuf\u00fcgen und Anwendungen bereitzustellen. All diese Aufgaben werden auf einer zentralen CI-Plattform mit einem Docker-Image durchgef\u00fchrt.<\/p>\n<p><\/p>\n<p>Kommen wir zu den Details.<\/p>\n<p><\/p>\n<blockquote><p>Hinweis: Wenn Sie dies lesen, wurde der erste Release-Kandidat von Helm 3 bereits angek\u00fcndigt. Die Hauptversion enth\u00e4lt eine Reihe von Verbesserungen, die darauf abzielen, einige Probleme zu l\u00f6sen, mit denen wir in der Vergangenheit konfrontiert waren.<\/p><\/blockquote>\n<p><\/p>\n<h3 id=\"rabochiy-process-razrabotki-chartov\">Entwicklungsworkflow f\u00fcr Charts<\/h3>\n<p><\/p>\n<p>F\u00fcr Anwendungen nutzen wir das Branching und haben beschlossen, diesen Ansatz auch f\u00fcr Charts zu verwenden.<\/p>\n<p><\/p>\n<ul>\n<li>Branch <strong>dev<\/strong> wird verwendet, um Charts zu erstellen, die auf Entwicklungsclustern getestet werden.<\/li>\n<li>Wenn ein Pull-Request an <strong>master<\/strong>gesendet wird, werden diese in der Staging-Umgebung \u00fcberpr\u00fcft.<\/li>\n<li>Schlie\u00dflich erstellen wir einen Pull-Request, um die \u00c4nderungen in den Branch <strong>prod<\/strong> zu \u00fcberf\u00fchren und diese in der Produktion anzuwenden.<\/li>\n<\/ul>\n<p><\/p>\n<p>Jede Umgebung hat ihr eigenes privates Repository, das unsere Charts speichert, und wir verwenden <noindex><a rel=\"nofollow\" href=\"https:\/\/chartmuseum.com\/\">Chartmuseum<\/a><\/noindex> mit sehr n\u00fctzlichen APIs. Dadurch gew\u00e4hrleisten wir strikte Isolation zwischen den Umgebungen und testen die Charts in realen Bedingungen, bevor wir sie in der Produktion verwenden.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/rz\/vt\/uk\/rzvtuk6q7b_rkeaxnyujzhmfjog.png\"><\/a><\/noindex><\/p>\n<p><\/p>\n<p><em>Charts-Repositories in verschiedenen Umgebungen<\/em><\/p>\n<p><\/p>\n<p>Es ist erw\u00e4hnenswert, dass, wenn Entwickler einen dev-Branch einpflegen, die Version ihres Charts automatisch an das dev Chartmuseum gesendet wird. So nutzen alle Entwickler ein gemeinsames dev-Repository, und es ist wichtig, die eigene Chart-Version genau anzugeben, um versehentlich die \u00c4nderungen anderer zu vermeiden.<\/p>\n<p><\/p>\n<p>Dar\u00fcber hinaus \u00fcberpr\u00fcft unser kleines Python-Skript Kubernetes-Objekte anhand der Spezifikationen der Kubernetes OpenAPI mit Hilfe von <noindex><a rel=\"nofollow\" href=\"https:\/\/kubeval.instrumenta.dev\/\">Kubeval<\/a><\/noindex>, bevor sie in Chartmuseum ver\u00f6ffentlicht werden.<\/p>\n<p><\/p>\n<h3 id=\"obschee-opisanie-rabochego-processa-razrabotki-charta\">Allgemeine Beschreibung des Chart-Entwicklungsprozesses<\/h3>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/yd\/cw\/qw\/ydcwqw-vqfitu5bj8ky4nh7xxea.png\"><\/a><\/noindex><\/p>\n<p><\/p>\n<ol>\n<li>Konfiguration der Pipeline-Jobs gem\u00e4\u00df der Spezifikation <noindex><a rel=\"nofollow\" href=\"https:\/\/gazr.io\/\">gazr.io<\/a><\/noindex> zur Qualit\u00e4tskontrolle (Linting, Unit-Tests).<\/li>\n<li>Bereitstellung eines Docker-Images mit Python-Tools, die unsere Anwendungen bereitstellen.<\/li>\n<li>Einrichtung der Umgebung nach dem Branch-Namen.<\/li>\n<li>\u00dcberpr\u00fcfung von Kubernetes-YAML-Dateien mit Kubeval.<\/li>\n<li>Automatisches Hochsetzen der Version des Charts und seiner \u00fcbergeordneten Charts (Charts, die von dem ver\u00e4nderbaren Chart abh\u00e4ngen).<\/li>\n<li>Hochladen des Charts in Chartmuseum, das mit seiner Umgebung \u00fcbereinstimmt.<\/li>\n<\/ol>\n<p><\/p>\n<h2 id=\"upravlenie-razlichiyami-v-klasterah\">Verwaltung der Unterschiede in den Clustern.<\/h2>\n<p><\/p>\n<h3 id=\"federaciya-klasterov\">Federation von Clustern<\/h3>\n<p><\/p>\n<p>Es gab eine Zeit, in der wir die <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/federation\/\">Kubernetes-Cluster-Federation<\/a><\/noindex>nutzten, bei der man Kubernetes-Objekte von einem API-Endpunkt aus deklarieren konnte. Aber es traten Probleme auf. Zum Beispiel konnten einige Kubernetes-Objekte nicht am Federation-Endpunkt erstellt werden, was die Verwaltung kombinierter Objekte und anderer Objekte f\u00fcr einzelne Cluster erschwerte.<\/p>\n<p><\/p>\n<p>Um das Problem zu l\u00f6sen, begannen wir, die Cluster unabh\u00e4ngig zu verwalten, was den Prozess erheblich vereinfachte (wir verwendeten die erste Version der Federation; in der zweiten k\u00f6nnte sich etwas ge\u00e4ndert haben).<\/p>\n<p><\/p>\n<h3 id=\"georaspredelennaya-platforma\">Geodistribuierte Plattform<\/h3>\n<p><\/p>\n<p>Aktuell ist unsere Plattform \u00fcber 6 Regionen verteilt \u2013 3 lokal und 3 in der Cloud.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/jq\/c1\/mr\/jqc1mru36g5byams4wddzducauw.png\"><\/a><\/noindex><br \/>\n<em>Verteilte Bereitstellung<\/em><\/p>\n<p><\/p>\n<h3 id=\"globalnye-znacheniya-helm\">Globale Helm-Werte<\/h3>\n<p><\/p>\n<p>4 globale Helm-Werte erm\u00f6glichen es, Unterschiede zwischen Clustern zu definieren. F\u00fcr all unsere Charts gibt es minimale Standardwerte.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">global:\n  cloud: True\n  env: staging\n  region: us-central1\n  clusterName: staging-us-central1<\/code><\/pre>\n<p><\/p>\n<p><em>Globale Werte<\/em><\/p>\n<p><\/p>\n<p>Diese Werte helfen dabei, den Kontext f\u00fcr unsere Anwendungen zu definieren und werden f\u00fcr verschiedene Aufgaben verwendet: Monitoring, Tracing, Logging, externe Aufrufe, Skalierung usw.<\/p>\n<p><\/p>\n<ul>\n<li>\"cloud\": wir haben eine hybride Kubernetes-Plattform. Zum Beispiel wird unsere API in GCP-Zonen und in unseren Rechenzentren bereitgestellt.<\/li>\n<li>\"env\": einige Werte k\u00f6nnen sich f\u00fcr nicht-productive Umgebungen \u00e4ndern. Zum Beispiel Ressourcendefinitionen und Autoskalierungskonfigurationen.<\/li>\n<li>\"region\": diese Information hilft dabei, den Standort des Clusters zu definieren und kann verwendet werden, um die n\u00e4chstgelegenen Endpunkte f\u00fcr externe Dienste zu bestimmen.<\/li>\n<li>\"clusterName\": wenn und wann wir einen Wert f\u00fcr einen bestimmten Cluster definieren m\u00f6chten.<\/li>\n<\/ul>\n<p><\/p>\n<p>Hier ist ein konkretes Beispiel:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">{{\n\/* Gibt die Horizontal Pod Autoscaler-Replikate f\u00fcr GraphQL zur\u00fcck *\/}}\n{{- define \"graphql.hpaReplicas\" -}}\n{{- if eq .Values.global.env \"prod\" }}\n{{- if eq .Values.global.region \"europe-west1\" }}\nminReplicas: 40\n{{- else }}\nminReplicas: 150\n{{- end }}\nmaxReplicas: 1400\n{{- else }}\nminReplicas: 4\nmaxReplicas: 20\n{{- end }}\n{{- end -}}<\/code><\/pre>\n<p><\/p>\n<p><em>Beispiel eines Helm-Templates<\/em><\/p>\n<p><\/p>\n<p>Diese Logik ist in einer Hilfs-Template definiert, um das Kubernetes YAML nicht zu \u00fcberladen.<\/p>\n<p><\/p>\n<h3 id=\"obyavlenie-prilozheniya\">Anwendungsdeklaration<\/h3>\n<p><\/p>\n<p>Unsere Deployment-Tools basieren auf mehreren YAML-Dateien. Hier ist ein Beispiel, wie wir einen Dienst und seine Skalierungstopologie (Anzahl der Replikate) im Cluster deklarieren.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">releases:\n  - foo.world\n\nfoo.world:                # Release-Name\n  services:               # Liste der Apps\/Projekte von dailymotion\n    foobar:\n      chart_name: foo-foobar\n      repo: git@github.com:dailymotion\/foobar\n      contexts:\n        prod-europe-west1:\n          deployments:\n            - name: foo-bar-baz\n              replicas: 18\n            - name: another-deployment\n              replicas: 3<\/code><\/pre>\n<p><\/p>\n<p><em>Dienstdefinition<\/em><\/p>\n<p><\/p>\n<p>Das ist ein Schema aller Schritte, die unseren Deployment-Prozess definieren. Der letzte Schritt deployt die Anwendung gleichzeitig auf mehreren Arbeits-Clustern.<\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/iu\/qh\/xk\/iuqhxki4nfqoi0mus258j0feylu.png\"><\/a><\/noindex><br \/>\n<em>Deployment-Schritte in Jenkins<\/em><\/p>\n<p><\/p>\n<h3 id=\"a-sekrety\">Und die Geheimnisse?<\/h3>\n<p><\/p>\n<p>Was die Sicherheit angeht, \u00fcberwachen wir alle Geheimnisse aus verschiedenen Quellen und speichern sie in einem einzigartigen Vault. <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/\">Vault<\/a><\/noindex> in Paris.<\/p>\n<p><\/p>\n<p>Unsere Deployment-Tools extrahieren die Werte der Geheimnisse aus dem Vault und f\u00fcgen sie bei der Bereitstellung in Helm ein.<\/p>\n<p><\/p>\n<p>Daf\u00fcr haben wir eine Zuordnung zwischen den Geheimnissen im Vault und den Geheimnissen, die unsere Anwendungen ben\u00f6tigen, definiert:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">geheimnisse:                                                                                                                                                                                                        \n     - geheimnis_id: \"stack1-app1-password\"                                                                                                                                                                                  \n       kontexte:                                                                                                                                                                                                   \n         - name: \"standard\"                                                                                                                                                                                         \n           vaultPath: \"\/kv\/dev\/stack1\/app1\/test\"                                                                                                                                                               \n           vaultKey: \"password\"                                                                                                                                                                                    \n         - name: \"cluster1\"                                                                                                                                                                           \n           vaultPath: \"\/kv\/dev\/stack1\/app1\/test\"                                                                                                                                                               \n           vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>Wir haben allgemeine Richtlinien festgelegt, die beim Speichern von Geheimnissen im Vault beachtet werden m\u00fcssen.<\/li>\n<li>Wenn das Geheimnis sich <strong>auf einen bestimmten Kontext oder Cluster bezieht<\/strong>, muss ein spezifischer Eintrag hinzugef\u00fcgt werden. (Hier hat der Kontext cluster1 einen eigenen Wert f\u00fcr das Geheimnis stack-app1-password).<\/li>\n<li>Andernfalls wird der Wert verwendet <strong>standardm\u00e4\u00dfig<\/strong>.<\/li>\n<li>F\u00fcr jeden Punkt in dieser Liste wird im <strong>Kubernetes-Geheimnis<\/strong> ein Schl\u00fcssel-Wert-Paar eingef\u00fcgt. Daher ist die Vorlage des Geheimnisses in unseren Charts sehr einfach.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\ndata:\n{{- range $key,$value := .Values.secrets }}\n  {{ $key }}: {{ $value | b64enc | quote }}\n{{ end }}\nkind: Secret\nmetadata:\n  name: \"{{ .Chart.Name }}\"\n  labels:\n    chartVersion: \"{{ .Chart.Version }}\"\n    tillerVersion: \"{{ .Capabilities.TillerVersion.SemVer }}\"\ntype: Opaque<\/code><\/pre>\n<p><\/p>\n<h2 id=\"problemy-i-ogranicheniya\">Probleme und Einschr\u00e4nkungen<\/h2>\n<p><\/p>\n<h3 id=\"rabota-s-neskolkimi-repozitoriyami\">Arbeiten mit mehreren Repositories<\/h3>\n<p><\/p>\n<p>Momentan trennen wir die Entwicklung von Charts und Anwendungen. Das bedeutet, dass Entwickler in zwei Git-Repositories arbeiten m\u00fcssen: eines f\u00fcr die Anwendung und das andere f\u00fcr die Definition ihrer Bereitstellung in Kubernetes. 2 Git-Repositories bedeuten 2 Arbeitsabl\u00e4ufe, und es ist f\u00fcr Neulinge leicht, sich zu verwirren.<\/p>\n<p><\/p>\n<h3 id=\"upravlyat-obobschennymi-chartami-hlopotno\">Es ist m\u00fchsam, mit generischen Charts zu arbeiten<\/h3>\n<p><\/p>\n<p>Wie bereits erw\u00e4hnt, sind generische Charts sehr praktisch, um Abh\u00e4ngigkeiten zu definieren und mehrere Anwendungen schnell bereitzustellen. Aber wir verwenden <code>--reuse-values<\/code>, um zu vermeiden, dass wir jedes Mal alle Werte \u00fcbermitteln, wenn wir eine Anwendung aus diesem generischen Chart bereitstellen.<\/p>\n<p><\/p>\n<p>Im Arbeitsprozess der kontinuierlichen Lieferung haben wir nur zwei Werte, die sich regelm\u00e4\u00dfig \u00e4ndern: die Anzahl der Repliken und das Tag des Images (Version). Andere, stabilere Werte werden manuell ge\u00e4ndert, was ziemlich kompliziert ist. Dar\u00fcber hinaus kann ein Fehler bei der Bereitstellung eines generischen Charts zu schwerwiegenden Ausf\u00e4llen f\u00fchren, wie wir aus eigener Erfahrung festgestellt haben.<\/p>\n<p><\/p>\n<h3 id=\"obnovlenie-neskolkih-faylov-konfiguracii\">Aktualisierung mehrerer Konfigurationsdateien<\/h3>\n<p><\/p>\n<p>Wenn ein Entwickler eine neue Anwendung hinzuf\u00fcgt, muss er mehrere Dateien \u00e4ndern: die Anwendungsdeklaration, die Liste der Geheimnisse, die Hinzuf\u00fcgung der Anwendung zu den Abh\u00e4ngigkeiten, falls sie im generischen Chart enthalten ist.<\/p>\n<p><\/p>\n<h3 id=\"razresheniya-jenkins-slishkom-rasshireny-v-vault\">Jenkins-Berechtigungen sind zu weit gefasst im Vault<\/h3>\n<p><\/p>\n<p>Jetzt haben wir einen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.vaultproject.io\/docs\/auth\/approle.html\">AppRole<\/a><\/noindex>, der alle Geheimnisse aus dem Vault liest.<\/p>\n<p><\/p>\n<h3 id=\"process-otkata-ne-avtomatizirovan\">Der Rollback-Prozess ist nicht automatisiert<\/h3>\n<p><\/p>\n<p>F\u00fcr den Rollback muss auf mehreren Clustern ein Befehl ausgef\u00fchrt werden, was fehleranf\u00e4llig ist. Wir f\u00fchren diesen Vorgang manuell durch, um sicherzustellen, dass die richtige Versions-ID angegeben wird.<\/p>\n<p><\/p>\n<h2 id=\"my-dvizhemsya-v-storonu-gitops\">Wir bewegen uns in Richtung GitOps<\/h2>\n<p><\/p>\n<h3 id=\"nasha-cel\">Unser Ziel<\/h3>\n<p><\/p>\n<p>Wir m\u00f6chten das Chart in das Repository der Anwendung zur\u00fcckbringen, die es bereitstellt.<\/p>\n<p><\/p>\n<p>Der Workflow wird derselbe sein wie bei der Entwicklung. Beispielsweise wird das Deployment automatisch gestartet, wenn ein Branch in den Master gesendet wird. Der Hauptunterschied zwischen diesem Ansatz und dem aktuellen Workflow wird sein, dass <strong>alles in git verwaltet wird<\/strong> (die Anwendung selbst und die Art und Weise ihrer Bereitstellung in Kubernetes).<\/p>\n<p><\/p>\n<p>Es gibt mehrere Vorteile:<\/p>\n<p><\/p>\n<ul>\n<li>Es ist viel <strong>verst\u00e4ndlicher<\/strong> f\u00fcr den Entwickler. Es ist einfacher, \u00c4nderungen im lokalen Chart anzuwenden.<\/li>\n<li>Die Bereitstellung der Dienstleistung kann dort definiert werden, <strong>wo auch der Code<\/strong> der Dienstleistung steht.<\/li>\n<li><strong>Management der L\u00f6schung generischer Charts<\/strong>. Der Dienst hat seine eigene Helm-Version. Dies wird es erm\u00f6glichen, den Lebenszyklus der Anwendung (Rollback, Upgrade) auf der kleinsten Ebene zu verwalten, ohne andere Dienste zu beeintr\u00e4chtigen.<\/li>\n<li><strong>Vorteile von git<\/strong> f\u00fcr die Verwaltung von Charts: \u00c4nderungsr\u00fcckg\u00e4ngig machen, Audit-Protokoll usw. Wenn eine \u00c4nderung des Charts r\u00fcckg\u00e4ngig gemacht werden muss, kann dies mit git erfolgen. Das Deployment wird automatisch gestartet.<\/li>\n<li>Man k\u00f6nnte \u00fcberlegen, den Entwicklungsworkflow mit Tools wie <strong>Skaffold<\/strong>, mit dem Entwickler \u00c4nderungen in einem der Produktionsumgebung \u00e4hnlichen Kontext testen k\u00f6nnen.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"dvuhetapnaya-migraciya\">Zwei-Stufen-Migration<\/h3>\n<p><\/p>\n<p>Unsere Entwickler verwenden diesen Arbeitsablauf seit 2 Jahren, daher ben\u00f6tigen wir eine m\u00f6glichst reibungslose Migration. Deshalb haben wir entschieden, einen ZwischenSchritt auf dem Weg zum Ziel hinzuzuf\u00fcgen.<br \/>\nDer erste Schritt ist einfach:<\/p>\n<p><\/p>\n<ul>\n<li>Wir behalten eine \u00e4hnliche Struktur f\u00fcr die Konfiguration der Anwendungsbereitstellung bei, aber in einem Objekt mit dem Namen DailymotionRelease.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: \"v1\"\nkind: \"DailymotionRelease\"\nmetadata:\n  name: \"app1.ns1\"\n  environment: \"dev\"\n  branch: \"mybranch\"\nspec:\n  slack_channel: \"#admin\"\n  chart_name: \"app1\"\n  scaling:\n    - context: \"dev-us-central1-0\"\n      replicas:\n        - name: \"hermes\"\n          count: 2\n    - context: \"dev-europe-west1-0\"\n      replicas:\n        - name: \"app1-deploy\"\n          count: 2\n  secrets:\n    - secret_id: \"app1\"\n      contexts:\n        - name: \"default\"\n          vaultPath: \"\\\/kv\\\/dev\\\/ns1\\\/app1\\\/test\"\n          vaultKey: \"password\"\n        - name: \"dev-europe-west1-0\"\n          vaultPath: \"\\\/kv\\\/dev\\\/ns1\\\/app1\\\/test\"\n          vaultKey: \"password\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>1 Release pro Anwendung (ohne allgemeine Charts).<\/li>\n<li>Charts im Git-Repository der Anwendung.<\/li>\n<\/ul>\n<p><\/p>\n<p>Wir haben mit allen Entwicklern gesprochen, daher hat der Migrationsprozess bereits begonnen. Der erste Schritt wird weiterhin mit der CI-Plattform \u00fcberwacht. Bald werde ich einen weiteren Beitrag \u00fcber den zweiten Schritt schreiben: wie wir auf den GitOps-Arbeitsablauf umgestellt haben mit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/weaveworks\/flux\">Flux<\/a><\/noindex>. Ich werde erz\u00e4hlen, wie wir alles eingerichtet haben und mit welchen Schwierigkeiten wir konfrontiert waren (einige Repositories, Geheimnisse usw.). Bleiben Sie dran.<\/p>\n<p><\/p>\n<p>Hier haben wir versucht, unseren Fortschritt im Anwendungsbereitstellungsprozess der letzten Jahre zu beschreiben, der zu \u00dcberlegungen zum GitOps-Ansatz f\u00fchrte. Wir haben unser Ziel noch nicht erreicht und werden \u00fcber die Ergebnisse berichten, sind jedoch davon \u00fcberzeugt, dass wir es richtig gemacht haben, als wir entschieden haben, alles zu vereinfachen und es den Gewohnheiten der Entwickler n\u00e4herzubringen.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/458934\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 3 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434. \u041d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 \u0442\u043e \u0435\u0449\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043c\u044b \u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. \u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u043f\u043e [&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-35955","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=\"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \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\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\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\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u0441 Helm | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm\" \/>\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:08:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:08:26+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\udd47Anwendungsbereitstellung in mehreren Kubernetes-Clustern mit Helm | ProHoster","description":"Wie Dailymotion Kubernetes verwendet: Anwendungsbereitstellung. Wir bei Dailymotion haben begonnen, Kubernetes zu nutzen.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","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\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 Kubernetes \u0441 Helm | ProHoster","og:description":"\u041a\u0430\u043a Dailymotion \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Kubernetes: \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u041c\u044b \u0432 Dailymotion \u043d\u0430\u0447\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kubernetes \u0432.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/razvertyvanie-prilozhenij-na-neskolkih-klasterah-kubernetes-s-helm","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:08:26+00:00","article:modified_time":"2019-10-31T19:08:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35955","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:25: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:25: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\/35955","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=35955"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35955\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=35955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=35955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=35955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}