{"id":4695,"date":"2026-10-04T21:24:32","date_gmt":"2026-10-04T19:24:32","guid":{"rendered":"https:\/\/www.marcelcuvelier.de\/?p=4695"},"modified":"2026-10-04T21:24:32","modified_gmt":"2026-10-04T19:24:32","slug":"git-docker-kubernetes-co-wer-macht-eigentlich-was","status":"publish","type":"post","link":"https:\/\/www.marcelcuvelier.de\/?p=4695","title":{"rendered":"Git, Docker, Kubernetes &#038; Co.: Wer macht eigentlich was?"},"content":{"rendered":"<h2>Durchblick im DevOps-Dschungel: Von Git \u00fcber Docker und Kubernetes bis hin zu Grafana<\/h2>\n<p>Git verwaltet den Code, Docker verpackt Anwendungen und Grafana zeigt Diagramme \u2013 so weit die Kurzfassung. Aber was bedeutet das eigentlich im Detail? Und wie wird aus dem Programmcode auf einem Entwicklerrechner eine Anwendung, die zuverl\u00e4ssig l\u00e4uft und bei Problemen rechtzeitig auf sich aufmerksam macht?<\/p>\n<p>Wer sich mit Softwareentwicklung oder dem Betrieb von IT-Systemen besch\u00e4ftigt, st\u00f6\u00dft schnell auf Namen wie GitHub, Jenkins, Kubernetes oder Prometheus. Vielleicht hast du einige davon schon geh\u00f6rt oder sogar selbst genutzt. Trotzdem ist nicht immer klar, welches Werkzeug wof\u00fcr zust\u00e4ndig ist. Manche \u00fcbernehmen \u00e4hnliche Aufgaben, andere erg\u00e4nzen sich. Gerade am Anfang fehlt h\u00e4ufig der \u00dcberblick, wie das alles zusammenpasst.<\/p>\n<p>Genau diesen \u00dcberblick m\u00f6chte ich mit diesem Beitrag schaffen. Denn um die Grundidee hinter diesen Werkzeugen zu verstehen, musst du weder ein \u201eNerd\u201c sein noch jahrelange Erfahrung in der IT mitbringen. Oft hilft schon ein verst\u00e4ndliches Beispiel: Woher wei\u00df ich, wer etwas am Programm ge\u00e4ndert hat? Wie kann ich automatisch pr\u00fcfen, ob danach noch alles funktioniert? Und woran erkenne ich, dass die Anwendung im laufenden Betrieb pl\u00f6tzlich langsamer wird? F\u00fcr solche Fragen gibt es passende Werkzeuge?<\/p>\n<p>Als Ausbilder f\u00fcr Fachinformatikerinnen und Fachinformatiker der Fachrichtungen Anwendungsentwicklung und Systemintegration vermittle ich diese Themen und ihre Zusammenh\u00e4nge. Auch als IHK-Pr\u00fcfer greife ich sie im Fachgespr\u00e4ch auf, wenn sie zum jeweiligen Projekt passen. Mir ist dabei wichtig, dass jemand erkl\u00e4ren kann, welches Problem ein Werkzeug l\u00f6st und warum es f\u00fcr die konkrete Aufgabe sinnvoll ist. Wer das verstanden hat, kann seinen Einsatz begr\u00fcnden und auch einsch\u00e4tzen, wann eine einfachere L\u00f6sung ausreichen w\u00fcrde.<\/p>\n<p>Der Beitrag soll gleichzeitig als kompaktes Glossar und kleines Nachschlagewerk dienen. Was unterscheidet Git von GitHub? Wof\u00fcr braucht man Kubernetes? Und warum werden Prometheus und Grafana so h\u00e4ufig gemeinsam eingesetzt?<\/p>\n<h2>Was bedeutet DevOps \u00fcberhaupt?<\/h2>\n<p>Der Begriff DevOps setzt sich aus <em>Development<\/em> (Softwareentwicklung) und <em>Operations<\/em> (IT-Betrieb) zusammen. Dahinter steckt eine Idee, die sich gut nachvollziehen l\u00e4sst: Die Menschen, die eine Anwendung entwickeln, und diejenigen, die sie sp\u00e4ter betreiben, arbeiten von Anfang an eng zusammen. Schlie\u00dflich soll die Software nicht nur auf dem Rechner des Entwicklers funktionieren, sondern auch im Alltag zuverl\u00e4ssig ihren Zweck erf\u00fcllen. Stell dir vor, ein Team entwickelt eine neue Funktion f\u00fcr einen Onlineshop. Aus Sicht der Entwicklung funktioniert zun\u00e4chst alles wie geplant. Im Betrieb stellen sich aber weitere Fragen: Was passiert, wenn viele Kunden gleichzeitig bestellen? Wie wird die neue Version eingespielt? Woran erkennt das Team einen Fehler? Und wie l\u00e4sst sich bei Problemen wieder ein funktionierender Stand herstellen? Bei DevOps werden solche Fragen fr\u00fchzeitig gemeinsam betrachtet. Auch die Software Qualit\u00e4tssicherung geh\u00f6rt dazu, damit passende Pr\u00fcfungen direkt mitgedacht werden.<\/p>\n<p>Ein wichtiger Baustein sind dabei nachvollziehbare und wiederholbare Abl\u00e4ufe. Eine neue Version sollte m\u00f6glichst nach einem festgelegten Verfahren erstellt, getestet und bereitgestellt werden. Wiederkehrende Schritte lassen sich automatisieren. Dadurch h\u00e4ngt weniger davon ab, ob jemand gerade an jede Kleinigkeit denkt oder eine Anleitung fehlerfrei von Hand abarbeitet.<\/p>\n<p>Genauso wichtig ist die R\u00fcckmeldung aus dem laufenden Betrieb. Wird die Anwendung nach einer \u00c4nderung langsamer oder treten bestimmte Fehler h\u00e4ufiger auf, braucht das Entwicklungsteam diese Informationen. So lassen sich Ursachen untersuchen und Verbesserungen gezielt angehen. Die Arbeit endet also nicht mit der Ver\u00f6ffentlichung einer neuen Version: Was im Betrieb passiert, hilft dabei, die Software weiterzuentwickeln.<\/p>\n<p>DevOps ist deshalb vor allem eine Frage der Zusammenarbeit und der gemeinsamen Verantwortung. Die passenden Werkzeuge k\u00f6nnen viel erleichtern: Sie f\u00fchren Tests aus, unterst\u00fctzen die Bereitstellung oder machen Probleme sichtbar. Ihren Nutzen entfalten sie aber erst, wenn das Team wei\u00df, was es damit erreichen m\u00f6chte und wer auf die Ergebnisse reagiert. Ziel ist, Probleme fr\u00fcher zu erkennen, vermeidbare Fehler zu reduzieren und \u00c4nderungen mit mehr Sicherheit zu ver\u00f6ffentlichen.<\/p>\n<h2>Git: \u00c4nderungen nachvollziehbar festhalten<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-4710 size-thumbnail\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/git.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Wer schon einmal Dateien mit Namen wie \u201eProjekt_final\u201c, \u201eProjekt_final_neu\u201c oder \u201eProjekt_final_wirklich_fertig\u201c angelegt hat, kennt das Problem: Man m\u00f6chte verschiedene Arbeitsst\u00e4nde behalten, verliert dabei aber schnell den \u00dcberblick. Welcher Stand ist aktuell? Was wurde ge\u00e4ndert? Und wie komme ich zur\u00fcck zu der Version, in der noch alles funktioniert hat? Genau hier hilft Git. Git ist ein sogenanntes <em>Versionsverwaltungssystem<\/em>. Es h\u00e4lt nachvollziehbar fest, wie sich die Dateien eines Projekts ver\u00e4ndern. Dadurch l\u00e4sst sich sp\u00e4ter nachsehen, welche \u00c4nderungen vorgenommen wurden, von wem sie stammen und welche Erkl\u00e4rung dazu hinterlegt wurde. Bei Bedarf k\u00f6nnen fr\u00fchere St\u00e4nde wiederhergestellt oder einzelne \u00c4nderungen r\u00fcckg\u00e4ngig gemacht werden.<\/p>\n<p>Daf\u00fcr werden zusammengeh\u00f6rige \u00c4nderungen als <strong>Commit<\/strong> festgehalten. Einen Commit kannst du dir wie einen bewusst gesetzten Zwischenstand vorstellen, den du mit einer kurzen Beschreibung versiehst \u2013 beispielsweise \u201eFehlermeldung bei falschem Passwort erg\u00e4nzt\u201c. Das normale Speichern einer Datei im Editor reicht daf\u00fcr noch nicht aus: Zun\u00e4chst speicherst du deine Arbeit, anschlie\u00dfend entscheidest du, welche \u00c4nderungen du in den n\u00e4chsten Commit aufnehmen m\u00f6chtest. So entsteht nach und nach eine verst\u00e4ndliche Geschichte deines Projekts.<\/p>\n<p>Besonders praktisch sind die sogenannten <strong>Branches<\/strong>, also Entwicklungszweige. Stell dir vor, die Anmeldung deiner Anwendung funktioniert und du m\u00f6chtest eine neue Funktion ausprobieren. Daf\u00fcr kannst du einen eigenen Branch anlegen. Dort bearbeitest du deine \u00c4nderungen, w\u00e4hrend der Hauptentwicklungszweig zun\u00e4chst unver\u00e4ndert bleibt. Auch mehrere Personen k\u00f6nnen auf diese Weise parallel an unterschiedlichen Aufgaben arbeiten.<\/p>\n<p>Ist die neue Funktion fertig und gepr\u00fcft, k\u00f6nnen ihre \u00c4nderungen wieder in den Hauptentwicklungszweig \u00fcbernommen werden. Dieses Zusammenf\u00fchren nennt man <em>Merge<\/em>. Git kann dabei vieles automatisch erledigen. Haben aber beispielsweise zwei Personen dieselbe Textstelle unterschiedlich bearbeitet, kann ein <em>Konflikt<\/em> entstehen. Dann muss jemand entscheiden, wie die gemeinsame Fassung aussehen soll. Git zeigt die betroffenen Stellen an \u2013 welche L\u00f6sung fachlich richtig ist, beurteilt das Team.<\/p>\n<p>Das Wort <strong>\u201everteilt\u201c<\/strong> bedeutet bei Git, dass die Versionsgeschichte nicht ausschlie\u00dflich auf einem zentralen Server liegt. Bei einer vollst\u00e4ndigen Kopie eines Projekts hast du auch dessen bisherige Historie auf deinem Rechner. Deshalb kannst du viele Aufgaben ohne Internet erledigen: \u00c4nderungen bearbeiten, Commits erstellen, Entwicklungszweige anlegen oder fr\u00fchere St\u00e4nde vergleichen. Erst wenn du \u00c4nderungen mit anderen austauschen m\u00f6chtest, brauchst du eine Verbindung zum jeweiligen Gegen\u00fcber oder zu einer gemeinsamen Ablage.<\/p>\n<p>Eine solche Projektablage hei\u00dft <strong>Repository<\/strong>. F\u00fcr die Zusammenarbeit wird h\u00e4ufig zus\u00e4tzlich ein entferntes Repository verwendet, auf das das Team zugreifen kann. Daf\u00fcr braucht es nicht zwingend GitHub oder GitLab: Auch ein eigener Git-Server ist m\u00f6glich. Was diese Plattformen dar\u00fcber hinaus bieten, schauen wir uns im n\u00e4chsten Abschnitt an.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Du m\u00f6chtest die Anmeldung deiner Anwendung um verst\u00e4ndlichere Fehlermeldungen erg\u00e4nzen. Daf\u00fcr legst du einen eigenen Branch an. In einem ersten Commit h\u00e4ltst du die neuen Meldungen fest, in einem weiteren die dazugeh\u00f6rigen Tests. Nach der gemeinsamen Pr\u00fcfung werden die \u00c4nderungen \u00fcbernommen. F\u00e4llt sp\u00e4ter ein Problem auf, l\u00e4sst sich gezielt nachvollziehen, was an der Anmeldung ver\u00e4ndert wurde. Genau diese Nachvollziehbarkeit macht Git f\u00fcr die Zusammenarbeit und die Fehlersuche so wertvoll.<\/p>\n<h2>GitHub und GitLab: Zusammenarbeit rund um den Code<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4711\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>GitHub und GitLab kannst du dir als gemeinsame Arbeitsplattformen f\u00fcr Softwareprojekte vorstellen. Die Grundlage bildet dabei Git, das \u00c4nderungen am Code nachvollziehbar festh\u00e4lt. GitHub und GitLab geben dem Projekt zus\u00e4tzlich einen zentralen Platz, an dem das Team zusammenarbeiten kann. Dort liegt das sogenannte <em>Repository<\/em>: vereinfacht gesagt der Projektordner mit dem Quellcode und seiner \u00c4nderungshistorie.<\/p>\n<p>Der Vorteil ist, dass sich dort auch die Arbeit rund um den Code organisieren l\u00e4sst. Hat jemand einen Fehler entdeckt oder eine Idee f\u00fcr eine neue Funktion, kann daf\u00fcr eine Aufgabe angelegt werden \u2013 ein sogenanntes <em>Issue<\/em>. Darin l\u00e4sst sich beschreiben, was zu tun ist, wer sich darum k\u00fcmmert und welche Fragen noch offen sind. So bleiben Informationen direkt beim Projekt und verteilen sich nicht auf E-Mails, Chatnachrichten und pers\u00f6nliche Notizzettel.<\/p>\n<p>Besonders hilfreich finde ich die M\u00f6glichkeit, \u00c4nderungen gemeinsam anzuschauen, bevor sie in den Hauptentwicklungsstand \u00fcbernommen werden. Stell dir vor, du hast die Anmeldung einer Anwendung erweitert. Deine \u00c4nderungen hast du zun\u00e4chst in einem eigenen Entwicklungszweig, einem <em>Branch<\/em>, umgesetzt. Jetzt m\u00f6chtest du sie dem Team vorstellen. Dazu er\u00f6ffnest du auf GitHub einen <em>Pull Request<\/em> oder auf GitLab einen <em>Merge Request<\/em>. Die Bezeichnungen unterscheiden sich, die Grundidee ist dieselbe: \u201eMeine \u00c4nderungen sind bereit. Schaut bitte einmal dr\u00fcber, bevor wir sie \u00fcbernehmen.\u201c<\/p>\n<p>Die anderen k\u00f6nnen dann genau sehen, welche Stellen du ver\u00e4ndert hast. Sie k\u00f6nnen Fragen stellen, Hinweise geben oder Verbesserungen vorschlagen. Diese gemeinsame Durchsicht nennt man <em>Code-Review<\/em>. Gerade in der Ausbildung ist das eine sch\u00f6ne Gelegenheit, voneinander zu lernen: Warum wurde etwas auf diese Weise gel\u00f6st? Gibt es eine verst\u00e4ndlichere Variante? Wurde ein m\u00f6glicher Fehlerfall ber\u00fccksichtigt? Ob vor der \u00dcbernahme zwingend jemand zustimmen muss, l\u00e4sst sich \u00fcber die Regeln des Projekts festlegen.<\/p>\n<p>Beide Plattformen k\u00f6nnen au\u00dferdem wiederkehrende Arbeitsschritte automatisch ausf\u00fchren. Bei GitHub \u00fcbernimmt das <em>GitHub Actions<\/em>, bei GitLab <em>GitLab CI\/CD<\/em>. Beispielsweise kann nach einer \u00c4nderung automatisch gepr\u00fcft werden, ob sich die Anwendung noch erstellen l\u00e4sst und die vorhandenen automatisierten Tests erfolgreich durchlaufen. Das Team bekommt dadurch fr\u00fch eine R\u00fcckmeldung, ob die \u00c4nderung m\u00f6glicherweise etwas besch\u00e4digt hat.<\/p>\n<p>Welche Plattform besser passt, h\u00e4ngt deshalb vor allem davon ab, wie das Team arbeitet: Welche Werkzeuge sind schon vorhanden? Was soll automatisiert werden? Und m\u00f6chte man die Plattform als Dienst nutzen oder selbst betreiben? F\u00fcr den Einstieg ist mir vor allem wichtig, dass die Rollen klar sind: <strong>Git h\u00e4lt die \u00c4nderungen fest. GitHub und GitLab helfen dabei, gemeinsam an diesen \u00c4nderungen zu arbeiten und die Abl\u00e4ufe drumherum zu organisieren.<\/strong><\/p>\n<h2>CI\/CD: \u00c4nderungen automatisch bauen, pr\u00fcfen und bereitstellen<\/h2>\n<p>Zwischen einer \u00c4nderung am Programmcode und einer neuen Version, die von den Nutzern verwendet werden kann, liegen mehrere Arbeitsschritte. Die Anwendung muss erstellt, gepr\u00fcft und schlie\u00dflich in der vorgesehenen Umgebung bereitgestellt werden. Damit diese Aufgaben nachvollziehbar und m\u00f6glichst automatisch ablaufen, werden sie h\u00e4ufig in einer <strong>Pipeline<\/strong> organisiert.&nbsp;Du kannst dir eine Pipeline wie einen festgelegten Arbeitsablauf mit mehreren Stationen vorstellen. An einer Station wird aus dem Quellcode eine ausf\u00fchrbare Anwendung oder ein Softwarepaket erstellt. Diesen Vorgang nennt man <em>Build<\/em>. An weiteren Stationen laufen beispielsweise automatisierte Tests oder eine Codeanalyse. Sind die vorgesehenen Pr\u00fcfungen erfolgreich, kann die Anwendung auf einer Testumgebung bereitgestellt werden. Schl\u00e4gt eine wichtige Pr\u00fcfung fehl, wird der weitere Ablauf entsprechend den eingerichteten Regeln gestoppt.<\/p>\n<p>In diesem Zusammenhang begegnet dir h\u00e4ufig die Abk\u00fcrzung <strong>CI\/CD<\/strong>. Dahinter stehen eng miteinander verbundene Vorgehensweisen. Gerade bei \u201eCD\u201c lohnt es sich, genauer hinzuschauen, denn das kann sowohl <em>Continuous Delivery<\/em> als auch <em>Continuous Deployment<\/em> bedeuten.<\/p>\n<p><strong>Continuous Integration (CI): \u00c4nderungen regelm\u00e4\u00dfig zusammenf\u00fchren und pr\u00fcfen<\/strong><\/p>\n<p>Wenn mehrere Personen an einer Anwendung arbeiten, m\u00fcssen ihre \u00c4nderungen irgendwann zusammenpassen. Bei Continuous Integration werden \u00c4nderungen deshalb h\u00e4ufig und m\u00f6glichst in kleinen Schritten in einen gemeinsamen Entwicklungsstand integriert. Automatisierte Builds und Tests liefern dazu fr\u00fch eine R\u00fcckmeldung.<\/p>\n<p>Stell dir vor, du ver\u00e4nderst die Anmeldung, w\u00e4hrend ein Kollege an der Benutzerverwaltung arbeitet. F\u00fcr sich genommen k\u00f6nnen beide \u00c4nderungen funktionieren. Ob sie auch gemeinsam funktionieren, zeigt sich erst beim Zusammenf\u00fchren und Pr\u00fcfen. Je fr\u00fcher das passiert, desto leichter l\u00e4sst sich ein auftretendes Problem meist eingrenzen. F\u00fcr mich liegt darin ein wesentlicher Vorteil von CI: Das Team bekommt zeitnah Hinweise, solange die \u00c4nderungen noch \u00fcberschaubar und gedanklich pr\u00e4sent sind.<\/p>\n<p><strong>Continuous Delivery: Eine ver\u00f6ffentlichungsf\u00e4hige Version bereithalten<\/strong><\/p>\n<p>Continuous Delivery f\u00fchrt diesen Gedanken weiter. Die Software durchl\u00e4uft einen wiederholbaren Ablauf, der sie erstellt, pr\u00fcft und f\u00fcr eine Ver\u00f6ffentlichung vorbereitet. Ziel ist, eine Version bereitzuhalten, die bei Bedarf zuverl\u00e4ssig in den Produktivbetrieb \u00fcbernommen werden kann \u2013 also in die Umgebung, mit der die tats\u00e4chlichen Nutzer arbeiten.<\/p>\n<p>Die Ver\u00f6ffentlichung kann dabei weiterhin eine bewusste Entscheidung sein. Beispielsweise pr\u00fcft das Team die Version zus\u00e4tzlich auf einer Testumgebung und gibt sie anschlie\u00dfend frei. Die technischen Schritte sind weitgehend automatisiert, aber der Zeitpunkt der Ver\u00f6ffentlichung wird gezielt festgelegt.<\/p>\n<p><strong>Continuous Deployment: Erfolgreich gepr\u00fcfte \u00c4nderungen automatisch ver\u00f6ffentlichen<\/strong><\/p>\n<p>Bei Continuous Deployment entf\u00e4llt diese zus\u00e4tzliche manuelle Freigabe vor jeder Ver\u00f6ffentlichung. Eine \u00c4nderung, die alle vorgesehenen automatisierten Pr\u00fcfungen erfolgreich durchl\u00e4uft, wird automatisch in den Produktivbetrieb \u00fcbernommen.<\/p>\n<p>Das setzt gro\u00dfes Vertrauen in die Pr\u00fcfungen und den Bereitstellungsprozess voraus. Auch die \u00dcberwachung nach der Ver\u00f6ffentlichung und ein geeigneter Umgang mit Problemen m\u00fcssen mitgedacht werden. Automatisierte Tests k\u00f6nnen schlie\u00dflich nur die F\u00e4lle \u00fcberpr\u00fcfen, f\u00fcr die sie eingerichtet wurden.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Du erg\u00e4nzt eine verst\u00e4ndlichere Fehlermeldung bei der Anmeldung. Im Rahmen von CI wird die \u00c4nderung mit dem gemeinsamen Entwicklungsstand zusammengef\u00fchrt und automatisch gepr\u00fcft. Bei Continuous Delivery wird daraus eine ver\u00f6ffentlichungsf\u00e4hige Version vorbereitet, deren Produktivsetzung noch freigegeben werden kann. Bei Continuous Deployment erfolgt auch dieser letzte Schritt automatisch, sobald alle vorgesehenen Pr\u00fcfungen bestanden sind.<\/p>\n<h3>GitHub Actions<\/h3>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4712\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/github-actions.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Wenn du an einer Anwendung arbeitest, wiederholen sich viele Aufgaben: Nach einer \u00c4nderung m\u00f6chtest du beispielsweise pr\u00fcfen, ob die automatisierten Tests noch erfolgreich durchlaufen und sich die Anwendung weiterhin fehlerfrei erstellen l\u00e4sst. Diese Schritte jedes Mal von Hand anzusto\u00dfen, kostet Zeit \u2013 und im Alltag wird auch schnell einmal etwas vergessen. GitHub Actions hilft dir dabei, solche Abl\u00e4ufe direkt in deinem GitHub-Projekt zu automatisieren.&nbsp;Dazu legst du einen sogenannten <em>Workflow<\/em> an. Den kannst du dir wie einen Arbeitsplan vorstellen: Er beschreibt, wann etwas passieren soll und welche Schritte anschlie\u00dfend ausgef\u00fchrt werden. Ein Ausl\u00f6ser kann beispielsweise sein, dass du neue \u00c4nderungen zu GitHub \u00fcbertr\u00e4gst \u2013 das nennt man <em>Push<\/em>. Auch ein Pull Request, also eine Anfrage zur \u00dcbernahme von \u00c4nderungen, kann einen Workflow starten. Ebenso sind zeitgesteuerte Abl\u00e4ufe m\u00f6glich, etwa ein Testlauf in jeder Nacht.<\/p>\n<p>Dieser Arbeitsplan wird in einer Textdatei im Format <em>YAML<\/em> festgehalten. Die Dateien liegen im Projektverzeichnis unter <code>.github\/workflows\/<\/code>. Auch wenn das zun\u00e4chst technisch klingt: Im Grunde stehen darin strukturierte Anweisungen wie \u201eHole den aktuellen Code, bereite die ben\u00f6tigte Umgebung vor und f\u00fchre anschlie\u00dfend die Tests aus\u201c. Weil die Dateien zum Projekt geh\u00f6ren, werden \u00c4nderungen an diesen Abl\u00e4ufen ebenfalls mit Git dokumentiert.<\/p>\n<p>Die eigentliche Arbeit \u00fcbernehmen sogenannte <strong>Runner<\/strong>. Das sind die Ausf\u00fchrungsumgebungen, auf denen die festgelegten Schritte abgearbeitet werden. Du kannst sie dir wie einen zus\u00e4tzlichen Rechner vorstellen, der deinen Arbeitsplan ausf\u00fchrt. Ein Workflow beschreibt also die Aufgaben \u2013 der Runner erledigt sie.&nbsp;Damit l\u00e4sst sich weit mehr als ein Testlauf automatisieren. Ein Workflow kann beispielsweise die Anwendung erstellen, sie als Container-Image verpacken oder auf einer Testumgebung bereitstellen. Welche Schritte sinnvoll sind und aufeinander folgen, legst du passend zu deinem Projekt fest.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Du hast die Anmeldung deiner Anwendung erweitert und er\u00f6ffnest einen Pull Request. Daraufhin startet GitHub Actions automatisch die daf\u00fcr eingerichteten Tests. Schl\u00e4gt einer davon fehl, wird das Ergebnis beim Pull Request sichtbar. Du kannst dir die Ausgabe ansehen und die Ursache untersuchen, bevor die \u00c4nderung \u00fcbernommen wird. Gerade im Team finde ich diese fr\u00fche R\u00fcckmeldung hilfreich: Alle Beteiligten k\u00f6nnen sehen, welche Pr\u00fcfungen bereits erfolgreich waren und wo noch etwas gekl\u00e4rt werden muss.<\/p>\n<h3>GitLab CI\/CD<\/h3>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4714\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/gitlab-ci.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Was GitHub mit GitHub Actions erm\u00f6glicht, bietet GitLab mit <strong>GitLab CI\/CD<\/strong>: Du kannst wiederkehrende Aufgaben rund um deine Anwendung automatisieren und direkt mit deinem Projekt verbinden. Beispielsweise l\u00e4sst sich nach einer Code\u00e4nderung automatisch pr\u00fcfen, ob die Anwendung noch erstellt werden kann und die vorgesehenen Tests erfolgreich durchlaufen.&nbsp;Der gesamte Ablauf wird als <strong>Pipeline<\/strong> bezeichnet. Stell sie dir wie eine Reihe von Arbeitsstationen vor: Zuerst wird die Anwendung erstellt, anschlie\u00dfend gepr\u00fcft und danach beispielsweise auf einer Testumgebung bereitgestellt. Jede Station hat eine bestimmte Aufgabe. Schl\u00e4gt eine wichtige Pr\u00fcfung fehl, k\u00f6nnen die nachfolgenden Schritte gestoppt werden. So l\u00e4sst sich verhindern, dass eine als fehlerhaft erkannte Version einfach weitergereicht wird.<\/p>\n<p>Den Arbeitsplan daf\u00fcr hinterlegst du normalerweise in der Datei <code>.gitlab-ci.yml<\/code> im Hauptverzeichnis deines Projekts. Darin beschreibst du einzelne Aufgaben, sogenannte <em>Jobs<\/em>. Ein Job k\u00f6nnte beispielsweise die automatisierten Tests starten, ein anderer die Anwendung f\u00fcr die Ver\u00f6ffentlichung vorbereiten. Zusammengeh\u00f6rige Jobs lassen sich in Ablaufstufen, sogenannten <em>Stages<\/em>, organisieren \u2013 etwa \u201eErstellen\u201c, \u201eTesten\u201c und \u201eBereitstellen\u201c. Jobs derselben Stufe k\u00f6nnen parallel laufen, sofern gen\u00fcgend Ausf\u00fchrungskapazit\u00e4t vorhanden ist.<\/p>\n<p>Au\u00dferdem kannst du Regeln festlegen: Welche Aufgaben sollen bei jeder \u00c4nderung ausgef\u00fchrt werden? Welche nur dann, wenn eine neue Version ver\u00f6ffentlicht werden soll? Und an welcher Stelle m\u00f6chtest du eine manuelle Freigabe einbauen? Bei gr\u00f6\u00dferen Projekten l\u00e4sst sich die Konfiguration auf mehrere Dateien verteilen oder um wiederverwendbare Vorlagen erg\u00e4nzen. So muss nicht jedes Team denselben Ablauf von Grund auf neu beschreiben.<\/p>\n<p><strong>Die eigentliche Arbeit \u00fcbernehmen GitLab Runner.<\/strong> Sie nehmen die Jobs entgegen und f\u00fchren die darin beschriebenen Anweisungen in einer passenden Umgebung aus. Daf\u00fcr m\u00fcssen die ben\u00f6tigten Voraussetzungen vorhanden sein: Ein Testlauf braucht beispielsweise die passende Programmiersprache und die verwendeten Testwerkzeuge. Soll die Anwendung auf einen Server \u00fcbertragen werden, werden zus\u00e4tzlich eine erreichbare Zielumgebung und die erforderlichen Zugriffsrechte ben\u00f6tigt. Die Pipeline-Datei ist also der Arbeitsplan; Runner und Ausf\u00fchrungsumgebung sorgen daf\u00fcr, dass er umgesetzt werden kann.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Du hast die Anmeldung deiner Anwendung \u00fcberarbeitet und \u00fcbertr\u00e4gst deine \u00c4nderungen zu GitLab. Die Pipeline erstellt zun\u00e4chst die Anwendung und f\u00fchrt anschlie\u00dfend die automatisierten Tests aus. Sind diese erfolgreich, kann die neue Version auf einer Testumgebung bereitgestellt werden. Dort l\u00e4sst sie sich zus\u00e4tzlich ausprobieren und pr\u00fcfen. Die Ver\u00f6ffentlichung im Produktivbetrieb kann weiterhin eine bewusste Freigabe erfordern. Gerade diese Verbindung aus automatischen Pr\u00fcfungen und gezielten Entscheidungen finde ich hilfreich: Wiederkehrende Arbeit wird abgenommen, w\u00e4hrend das Team die Kontrolle \u00fcber die Ver\u00f6ffentlichung beh\u00e4lt.<\/p>\n<h3>Jenkins<\/h3>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4716\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/jenkins.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Jenkins hilft dabei, wiederkehrende Aufgaben in der Softwareentwicklung automatisch auszuf\u00fchren. Dazu geh\u00f6ren beispielsweise das Erstellen einer Anwendung, das Ausf\u00fchren von Tests oder die Bereitstellung einer neuen Version. Du kannst dir Jenkins wie eine zentrale Arbeitsorganisation vorstellen: Es st\u00f6\u00dft die vorgesehenen Aufgaben an, koordiniert ihre Ausf\u00fchrung und zeigt anschlie\u00dfend, welche Schritte erfolgreich waren und wo Probleme aufgetreten sind.&nbsp;Im Unterschied zu den direkt in GitHub oder GitLab eingebauten Automatisierungsfunktionen ist Jenkins ein eigenst\u00e4ndiger Automatisierungsserver. Damit ist zun\u00e4chst eine Software gemeint, die auf einem geeigneten Rechner oder in einer entsprechenden Serverumgebung betrieben wird. Jenkins l\u00e4sst sich mit verschiedenen Werkzeugen und Projektablagen verbinden. Das ist beispielsweise dann interessant, wenn in einem Unternehmen bereits unterschiedliche Systeme genutzt werden, die in einem gemeinsamen Ablauf zusammenarbeiten sollen.<\/p>\n<p>Ein solcher Ablauf l\u00e4sst sich als <em>Pipeline<\/em> in einer Datei namens <code>Jenkinsfile<\/code> beschreiben. Darin steht beispielsweise: \u201eHole den aktuellen Programmcode, erstelle die Anwendung, f\u00fchre die Tests aus und stelle die gepr\u00fcfte Version auf dem Testserver bereit.\u201c Das Jenkinsfile kann gemeinsam mit dem Anwendungscode in Git gespeichert werden. Dadurch bleibt nachvollziehbar, wer den Ablauf wann ver\u00e4ndert hat. Auch \u00c4nderungen an der Automatisierung k\u00f6nnen so vom Team gemeinsam gepr\u00fcft werden.<\/p>\n<p>Viel von seiner Flexibilit\u00e4t erh\u00e4lt Jenkins durch Erweiterungen, sogenannte Plugins. Sie erm\u00f6glichen die Anbindung weiterer Werkzeuge und Dienste. So kann Jenkins beispielsweise mit einer Codeverwaltung zusammenarbeiten, Testergebnisse aufbereiten oder Benachrichtigungen versenden. Die einzelnen Aufgaben k\u00f6nnen au\u00dferdem auf zus\u00e4tzlichen Ausf\u00fchrungsrechnern erledigt werden, den sogenannten <em>Agents<\/em>. Das ist praktisch, wenn unterschiedliche Aufgaben verschiedene Umgebungen ben\u00f6tigen oder mehrere Arbeiten parallel laufen sollen.&nbsp;Dieser Gestaltungsspielraum bringt allerdings auch Verantwortung mit sich. Wer Jenkins selbst betreibt, muss sich um Updates, die verwendeten Plugins, Zugriffsrechte und die Ausf\u00fchrungsumgebungen k\u00fcmmern. Auch die Automatisierung braucht also Pflege, damit sie dauerhaft zuverl\u00e4ssig funktioniert. Bei der Auswahl w\u00fcrde ich deshalb immer mit betrachten, wer diese Aufgaben \u00fcbernimmt und wie viel Aufwand das Team daf\u00fcr einplanen kann.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Ein Team m\u00f6chte seine Webanwendung nach jeder \u00c4nderung automatisch pr\u00fcfen. Jenkins holt sich daf\u00fcr den aktuellen Code, erstellt die Anwendung und startet die vorgesehenen Tests. Schl\u00e4gt ein Test fehl, kann das Team die Ergebnisse und Protokolle einsehen und die Ursache untersuchen. Sind alle Pr\u00fcfungen erfolgreich, kann die Pipeline die Anwendung anschlie\u00dfend auf einer Testumgebung bereitstellen. Der Vorteil liegt f\u00fcr mich vor allem darin, dass dieser festgelegte Ablauf wiederholbar ausgef\u00fchrt wird und seine Ergebnisse f\u00fcr das Team nachvollziehbar bleiben.<\/p>\n<h2>Docker: Anwendungen reproduzierbar verpacken<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4708\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/docker.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>\u201eBei mir funktioniert es!\u201c \u2013 dieser Satz beschreibt ein bekanntes Problem in der Softwareentwicklung. Auf dem Rechner des Entwicklers l\u00e4uft eine Anwendung problemlos. Auf dem Testserver fehlt pl\u00f6tzlich eine ben\u00f6tigte Bibliothek oder es ist eine andere Version der Programmiersprache installiert. Der Code ist derselbe, aber die Umgebung unterscheidet sich. Genau hier hilft Docker: Es erm\u00f6glicht, eine Anwendung zusammen mit vielen ihrer ben\u00f6tigten Bestandteile in einem definierten Paket bereitzustellen.<\/p>\n<p>Dieses Paket hei\u00dft <strong>Image<\/strong>. Darin stecken beispielsweise der Anwendungscode, ben\u00f6tigte Bibliotheken und die passende Laufzeitumgebung \u2013 also die Software, die zum Ausf\u00fchren der Anwendung erforderlich ist. Du kannst dir das Image wie eine vorbereitete Vorlage vorstellen, aus der sich immer wieder dieselbe Ausgangsumgebung erzeugen l\u00e4sst.&nbsp;Wie diese Vorlage entsteht, beschreibt eine Datei namens <code>Dockerfile<\/code>. Sie ist gewisserma\u00dfen das Rezept: Welche Grundlage verwenden wir? Welche zus\u00e4tzlichen Pakete werden installiert? Wohin wird der Anwendungscode kopiert? Und mit welchem Befehl soll die Anwendung starten? Docker arbeitet diese Anweisungen beim Erstellen des Images ab.<\/p>\n<p>Ein Container ist eine aus diesem Image erzeugte Instanz, in der die Anwendung ausgef\u00fchrt werden kann. Der Unterschied l\u00e4sst sich gut merken: Das Image ist die Vorlage, der Container die daraus erzeugte Umgebung. Aus demselben Image k\u00f6nnen mehrere Container entstehen, beispielsweise f\u00fcr verschiedene Testl\u00e4ufe. Jeder davon besitzt seine eigene beschreibbare Schicht. Daten, die dauerhaft erhalten bleiben sollen, etwa Datenbankinhalte, m\u00fcssen deshalb gezielt au\u00dferhalb dieser austauschbaren Schicht gespeichert werden.&nbsp;Der gro\u00dfe Vorteil ist, dass sich ein einmal erstelltes Image auf dem Entwicklungsrechner, in der Testumgebung und sp\u00e4ter im Produktivbetrieb verwenden l\u00e4sst \u2013 vorausgesetzt, die jeweilige Umgebung ist daf\u00fcr geeignet. Viele Unterschiede durch manuelle Installationen entfallen dadurch. Das macht die Bereitstellung einer Anwendung besser nachvollziehbar und wiederholbar.<\/p>\n<p>Ganz verschwinden die Unterschiede zwischen den Umgebungen allerdings nicht. Eine Anwendung braucht m\u00f6glicherweise weiterhin eine erreichbare Datenbank, passende Zugangsdaten oder bestimmte Netzwerkeinstellungen. Auch die Prozessorarchitektur kann eine Rolle spielen. Docker schafft also eine einheitlichere Grundlage, ersetzt aber weder die richtige Konfiguration noch die Pr\u00fcfung unter den tats\u00e4chlichen Einsatzbedingungen.<\/p>\n<p>H\u00e4ufig kommt an dieser Stelle die Frage auf: Ist ein Container nicht einfach eine kleine virtuelle Maschine? Der Vergleich ist verst\u00e4ndlich, technisch gibt es aber einen wichtigen Unterschied. Eine <strong>virtuelle Maschine<\/strong> betreibt ein eigenes Betriebssystem mit einem eigenen <em>Kernel<\/em>, also dem zentralen Betriebssystemkern. Container teilen sich dagegen den Kernel der Umgebung, in der sie laufen. Dadurch ben\u00f6tigen sie h\u00e4ufig weniger Ressourcen und k\u00f6nnen schnell gestartet werden. Auf manchen Systemen stellt eine virtuelle Maschine im Hintergrund erst die passende Umgebung f\u00fcr diese Container bereit.&nbsp;Container und virtuelle Maschinen lassen sich deshalb gut miteinander kombinieren. Beispielsweise kann auf einem Server eine virtuelle Maschine laufen, in der wiederum mehrere Container betrieben werden. Welche Aufteilung sinnvoll ist, h\u00e4ngt unter anderem von den Anforderungen an Betrieb, Sicherheit und Wartung ab.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Das Team hat die Anmeldung seiner Webanwendung erweitert. Die Pipeline erstellt daraus ein neues Image und stellt es zun\u00e4chst in der Testumgebung bereit. Dort wird die Anwendung gepr\u00fcft. Sind die vorgesehenen Pr\u00fcfungen erfolgreich, wird genau dieselbe Image-Version f\u00fcr die Ver\u00f6ffentlichung verwendet. F\u00fcr mich liegt darin ein wichtiger Vorteil: Die Anwendung wird zwischen Test und Ver\u00f6ffentlichung nicht noch einmal neu zusammengestellt. Die gepr\u00fcfte Grundlage bleibt erhalten \u2013 auch wenn beispielsweise die Verbindung zur Datenbank f\u00fcr den Produktivbetrieb anders konfiguriert wird.<\/p>\n<h2>Kubernetes: Container \u00fcber mehrere Systeme betreiben<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4717\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/kubernetes.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Mit Docker l\u00e4sst sich eine Anwendung in Containern bereitstellen. Doch was passiert, wenn viele solcher Container betrieben werden sollen \u2013 vielleicht sogar verteilt auf mehrere Server? Wer entscheidet, wo sie laufen? Was passiert bei einem Ausfall? Und wie wird eine neue Version eingespielt, w\u00e4hrend die Anwendung weiterhin genutzt wird? Bei diesen Aufgaben unterst\u00fctzt Kubernetes.<\/p>\n<p>Kubernetes verwaltet containerisierte Anwendungen in einem sogenannten <strong>Cluster<\/strong>. Damit ist eine Gruppe von Rechnern gemeint, die zusammenarbeiten. Das k\u00f6nnen physische Server oder virtuelle Maschinen sein. Du kannst dir Kubernetes dabei wie eine Betriebskoordination vorstellen: Es verteilt die vorgesehenen Anwendungen auf geeignete Rechner und \u00fcberpr\u00fcft regelm\u00e4\u00dfig, ob der tats\u00e4chliche Zustand noch zu den Vorgaben passt.<\/p>\n<p>Die kleinste Einheit, die Kubernetes dabei bereitstellt und verwaltet, hei\u00dft <strong>Pod<\/strong>. In einem Pod l\u00e4uft ein Container oder eine kleine Gruppe eng zusammengeh\u00f6riger Container. Das k\u00f6nnte beispielsweise deine Webanwendung zusammen mit einem zus\u00e4tzlichen Hilfsdienst sein. Die Container innerhalb eines Pods teilen sich bestimmte Ressourcen, etwa die Netzwerkumgebung, und werden gemeinsam auf einem Rechner untergebracht. F\u00fcr den Einstieg reicht zun\u00e4chst die Vorstellung: Ein Pod ist die gemeinsame H\u00fclle, in der Kubernetes diese Container betreibt.<\/p>\n<p>Besonders wichtig ist das Prinzip des gew\u00fcnschten Zustands. Du beschreibst beispielsweise: \u201eVon meiner Webanwendung sollen dauerhaft drei Exemplare laufen.\u201c Kubernetes versucht dann, diese Vorgabe einzuhalten. F\u00e4llt ein entsprechend verwalteter Pod aus, kann ein neuer als Ersatz angelegt werden. F\u00e4llt ein ganzer Rechner aus, k\u00f6nnen betroffene Anwendungen auf anderen geeigneten Rechnern neu gestartet werden \u2013 sofern dort gen\u00fcgend Ressourcen zur Verf\u00fcgung stehen und die \u00fcbrigen Voraussetzungen erf\u00fcllt sind.&nbsp;Auch bei Aktualisierungen hilft dieses Prinzip. Statt alle laufenden Exemplare einer Anwendung gleichzeitig zu beenden, kann Kubernetes sie schrittweise durch die neue Version ersetzen. Das nennt man ein <em>Rolling Update<\/em>. W\u00e4hrend ein Teil bereits aktualisiert wird, bedienen andere Exemplare weiterhin Anfragen. Damit das zuverl\u00e4ssig funktioniert, muss unter anderem gepr\u00fcft werden k\u00f6nnen, ob die neuen Exemplare tats\u00e4chlich bereit sind, Anfragen zu \u00fcbernehmen. Eine unterbrechungsfreie Aktualisierung ergibt sich also nicht allein daraus, dass Kubernetes eingesetzt wird.<\/p>\n<p>Ein weiterer Begriff, dem du dabei begegnen wirst, ist Skalierung. Gemeint ist, die verf\u00fcgbare Kapazit\u00e4t an den Bedarf anzupassen. Wird deine Anwendung st\u00e4rker genutzt, k\u00f6nnen beispielsweise zus\u00e4tzliche Exemplare gestartet werden. Sinkt die Auslastung wieder, l\u00e4sst sich deren Anzahl reduzieren. Das kann mit passenden Messwerten und Regeln automatisch erfolgen. Die daf\u00fcr ben\u00f6tigte Rechenleistung muss allerdings vorhanden sein oder zus\u00e4tzlich bereitgestellt werden k\u00f6nnen. Auch muss die Anwendung daf\u00fcr geeignet sein, mit mehreren parallel laufenden Exemplaren zu arbeiten.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Ein Onlineshop erwartet w\u00e4hrend einer Rabattaktion deutlich mehr Besucher. Mit einer entsprechend eingerichteten automatischen Skalierung k\u00f6nnen zus\u00e4tzliche Exemplare der Webanwendung gestartet werden, um mehr Anfragen zu bearbeiten. F\u00e4llt eines aus, sorgt Kubernetes f\u00fcr Ersatz. Eine langsame Datenbank oder einen Fehler im Bestellprozess behebt das allerdings nicht automatisch. Deshalb bleiben eine durchdachte Architektur, aussagekr\u00e4ftige Tests und die \u00dcberwachung der gesamten Anwendung wichtig.<\/p>\n<p>F\u00fcr mich ist Kubernetes deshalb vor allem dann interessant, wenn die Anforderungen an den Betrieb diesen zus\u00e4tzlichen Aufwand rechtfertigen. Der Cluster selbst muss schlie\u00dflich ebenfalls eingerichtet, abgesichert und gepflegt werden. Wer Docker nutzt, braucht also nicht automatisch auch Kubernetes. F\u00fcr eine kleine Anwendung kann eine einfachere Betriebsumgebung v\u00f6llig ausreichen. Entscheidend ist, welche Probleme tats\u00e4chlich gel\u00f6st werden sollen und ob das Team die gew\u00e4hlte L\u00f6sung zuverl\u00e4ssig betreiben kann.<\/p>\n<h2>Ansible: Infrastruktur nachvollziehbar verwalten<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4707\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/ansible.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Wer schon einmal mehrere Server eingerichtet hat, kennt die wiederkehrenden Aufgaben: Software installieren, Benutzer anlegen, Konfigurationsdateien anpassen und Dienste starten. Auf einem einzelnen System l\u00e4sst sich das noch gut von Hand erledigen. Bei mehreren Rechnern wird es schnell aufwendig. Au\u00dferdem kann es passieren, dass eine Einstellung vergessen oder auf einem Server etwas anders umgesetzt wird. Ansible hilft dabei, solche administrativen Aufgaben nachvollziehbar zu automatisieren.&nbsp;Daf\u00fcr beschreibst du die erforderlichen Schritte in einem sogenannten <strong>Playbook<\/strong>. Du kannst dir das wie eine Arbeitsanweisung vorstellen, die Ansible f\u00fcr dich abarbeitet. Darin steht beispielsweise: \u201eInstalliere den Webserver, \u00fcbertrage diese Konfigurationsdatei und stelle sicher, dass der Dienst l\u00e4uft.\u201c Die Playbooks werden im Textformat <em>YAML<\/em> geschrieben. Dadurch lassen sie sich auch mit Git verwalten, gemeinsam pr\u00fcfen und bei Bedarf anpassen.<\/p>\n<p>Welche Rechner bearbeitet werden sollen, wird in einer \u00dcbersicht festgelegt, dem sogenannten <em>Inventory<\/em>. Dort k\u00f6nnen Systeme auch zu Gruppen zusammengefasst werden, beispielsweise Entwicklungsserver und Testserver. So l\u00e4sst sich dieselbe Grundkonfiguration auf mehrere Rechner anwenden, w\u00e4hrend einzelne Einstellungen je nach Umgebung unterschiedlich bleiben d\u00fcrfen.<\/p>\n<p>F\u00fcr die einzelnen Aufgaben verwendet Ansible <strong>Module<\/strong>. Das sind spezialisierte Bausteine, etwa zum Installieren von Softwarepaketen, zum Kopieren von Dateien oder zum Verwalten von Diensten. Du musst damit nicht jeden Arbeitsschritt selbst als Folge einzelner Systembefehle formulieren, sondern kannst h\u00e4ufig direkt beschreiben, welches Ergebnis du erreichen m\u00f6chtest.<\/p>\n<p>Besonders hilfreich finde ich dabei ein Prinzip mit einem zun\u00e4chst etwas sperrigen Namen: <strong>Idempotenz<\/strong>. Gemeint ist, dass eine erneute Ausf\u00fchrung den bereits erreichten Zustand nicht unn\u00f6tig ver\u00e4ndert. Soll ein bestimmtes Softwarepaket installiert sein und ist es bereits vorhanden, muss nichts weiter passieren. Entspricht eine Konfigurationsdatei schon der vorgesehenen Fassung, braucht sie nicht erneut ge\u00e4ndert zu werden.&nbsp;Stell es dir wie eine Checkliste vor: Ansible pr\u00fcft bei entsprechend aufgebauten Aufgaben, welche Punkte bereits erf\u00fcllt sind, und erledigt die noch offenen Arbeiten. Dadurch kann ein Playbook wiederholt ausgef\u00fchrt werden, beispielsweise nachdem ein neuer Server hinzugekommen ist oder die gew\u00fcnschte Konfiguration angepasst wurde.<\/p>\n<p>Dieses Verhalten ist allerdings nicht automatisch bei jeder Aufgabe gegeben. Wenn du in einem Playbook einen eigenen Shell-Befehl hinterlegst, der eine Zeile an eine Datei anh\u00e4ngt, k\u00f6nnte diese Zeile bei jedem Durchlauf erneut erg\u00e4nzt werden. Deshalb kommt es darauf an, geeignete Module zu verwenden und die Aufgaben sorgf\u00e4ltig zu formulieren. Auch ein automatisierter Ablauf muss gepr\u00fcft werden, bevor er auf wichtigen Systemen eingesetzt wird.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> F\u00fcr eine Webanwendung werden ein Entwicklungs- und ein Testserver ben\u00f6tigt. Beide sollen denselben Webserver und eine vergleichbare Grundkonfiguration erhalten. Statt die Einrichtung zweimal von Hand durchzuf\u00fchren, beschreibt das Team sie in einem Ansible-Playbook. Unterschiede, etwa die jeweiligen Servernamen, werden gezielt als Werte f\u00fcr die passende Umgebung hinterlegt. Kommt sp\u00e4ter ein weiterer Testserver hinzu, l\u00e4sst sich dieselbe Arbeitsanweisung wiederverwenden. Das spart Arbeit und macht zugleich nachvollziehbar, wie die Systeme eingerichtet wurden.<\/p>\n<h2>SonarQube: Codequalit\u00e4t fr\u00fchzeitig pr\u00fcfen<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4720\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/sonarqube.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Eine Anwendung kann auf den ersten Blick funktionieren und trotzdem problematische Stellen im Programmcode enthalten. Vielleicht wurde ein m\u00f6glicher Fehlerfall \u00fcbersehen, eine Funktion ist unn\u00f6tig kompliziert geworden oder dieselbe Logik wurde an mehreren Stellen kopiert. Solche Dinge fallen beim Ausprobieren nicht unbedingt auf, k\u00f6nnen sp\u00e4tere \u00c4nderungen aber erschweren. SonarQube hilft dabei, den Quellcode automatisiert auf solche Auff\u00e4lligkeiten zu untersuchen.&nbsp;Dabei kommt unter anderem die sogenannte <strong>statische Codeanalyse<\/strong> zum Einsatz. \u201eStatisch\u201c bedeutet hier, dass der Code untersucht wird, ohne die Anwendung daf\u00fcr wie ein Nutzer auszuf\u00fchren. SonarQube pr\u00fcft ihn anhand von Regeln und sucht nach auff\u00e4lligen Mustern. Du kannst dir das ein wenig wie eine Rechtschreib- und Stilpr\u00fcfung f\u00fcr Programmcode vorstellen: Sie liefert Hinweise auf m\u00f6gliche Probleme und erkl\u00e4rt, warum eine Stelle genauer betrachtet werden sollte.<\/p>\n<p>Die Ergebnisse k\u00f6nnen unterschiedliche Bereiche betreffen. Manche Hinweise deuten auf m\u00f6gliche Programmfehler hin, andere auf Sicherheitsprobleme oder auf Code, der schwer verst\u00e4ndlich und aufwendig zu pflegen ist. Gerade diese Wartbarkeit wird leicht untersch\u00e4tzt. Schlie\u00dflich soll sich auch jemand im Code zurechtfinden, der die betreffende Funktion nicht selbst geschrieben hat \u2013 oder der nach einem Jahr wieder daran arbeiten muss.&nbsp;Welche Pr\u00fcfungen konkret m\u00f6glich sind, h\u00e4ngt unter anderem von der Programmiersprache sowie vom verwendeten SonarQube-Produkt und dessen Edition ab. Au\u00dferdem m\u00fcssen die Ergebnisse sinnvoll eingeordnet werden: Ein Hinweis ist ein Anlass, genauer hinzusehen. Er bedeutet nicht automatisch, dass die Anwendung an dieser Stelle tats\u00e4chlich einen Fehler verursacht.<\/p>\n<p>Damit das Team aus den Ergebnissen klare Entscheidungen ableiten kann, gibt es sogenannte <strong>Quality Gates<\/strong>. Dahinter stehen festgelegte Qualit\u00e4tsbedingungen, die erf\u00fcllt sein sollen, bevor eine \u00c4nderung weitergegeben wird. Stell dir das wie einen vereinbarten Pr\u00fcfpunkt vor: Sind die Anforderungen erf\u00fcllt, kann der n\u00e4chste Schritt folgen. Sind sie nicht erf\u00fcllt, muss das Team zun\u00e4chst nacharbeiten oder den Befund kl\u00e4ren.<\/p>\n<p>SonarQube l\u00e4sst sich daf\u00fcr in eine automatisierte Pipeline einbinden. Bei entsprechender Einrichtung kann ein nicht bestandenes Quality Gate verhindern, dass die Pipeline mit der Ver\u00f6ffentlichung fortf\u00e4hrt oder eine \u00c4nderung in den Hauptentwicklungszweig \u00fcbernommen wird. Diese Wirkung muss allerdings bewusst eingerichtet werden \u2013 allein durch die Installation von SonarQube wird noch keine Ver\u00f6ffentlichung blockiert.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Ein Team erweitert die Anmeldung seiner Webanwendung. Die automatisierten Funktionstests laufen erfolgreich durch. SonarQube weist jedoch darauf hin, dass eine neue Funktion sehr komplex geworden ist und sich dadurch nur schwer nachvollziehen l\u00e4sst. Das Team schaut sich die Stelle an und teilt sie in kleinere, verst\u00e4ndlichere Funktionen auf. Die Anmeldung verh\u00e4lt sich anschlie\u00dfend weiterhin wie vorgesehen, ihr Code l\u00e4sst sich aber leichter pr\u00fcfen und sp\u00e4ter \u00e4ndern.<\/p>\n<p>Aus Sicht der Qualit\u00e4tssicherung finde ich diese zus\u00e4tzliche R\u00fcckmeldung wertvoll. Ein unauff\u00e4lliges Analyseergebnis ist allerdings kein Beweis daf\u00fcr, dass die Anwendung insgesamt fehlerfrei oder sicher ist. Ob sie die fachlichen Anforderungen erf\u00fcllt, verst\u00e4ndlich bedienbar ist oder bei vielen gleichzeitigen Zugriffen zuverl\u00e4ssig arbeitet, muss mit weiteren geeigneten Pr\u00fcfungen untersucht werden. SonarQube erg\u00e4nzt deshalb die Tests und das gemeinsame Code-Review um einen zus\u00e4tzlichen Blick auf den Quellcode.<\/p>\n<h2>Prometheus und Grafana: Messwerte sammeln und sichtbar machen<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4719\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/prometheus.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Eine Anwendung ist ver\u00f6ffentlicht und der Server l\u00e4uft \u2013 aber l\u00e4uft auch alles so, wie es soll? Werden Anfragen z\u00fcgig beantwortet? Reicht der verf\u00fcgbare Arbeitsspeicher aus? Und nimmt die Auslastung vielleicht schon seit Tagen zu, ohne dass es bisher jemand bemerkt hat? Prometheus und Grafana helfen dabei, solche Entwicklungen sichtbar zu machen. Die beiden Werkzeuge werden h\u00e4ufig gemeinsam eingesetzt, \u00fcbernehmen aber unterschiedliche Aufgaben.&nbsp;Prometheus sammelt und speichert Messwerte. Dazu geh\u00f6ren beispielsweise die CPU-Auslastung, der belegte Arbeitsspeicher oder die Anzahl der Anfragen an eine Anwendung. Jeder Messwert wird zusammen mit einem Zeitpunkt gespeichert. So entstehen sogenannte <em>Zeitreihen<\/em>. Du siehst dadurch nicht nur, wie stark ein Server gerade besch\u00e4ftigt ist, sondern kannst auch nachvollziehen, wie sich seine Auslastung \u00fcber Minuten, Stunden oder Tage ver\u00e4ndert hat.<\/p>\n<p>Damit Prometheus an diese Informationen kommt, fragt es in regelm\u00e4\u00dfigen Abst\u00e4nden daf\u00fcr vorgesehene Schnittstellen ab. Manche Anwendungen stellen ihre Messwerte selbst bereit. In anderen F\u00e4llen \u00fcbernehmen kleine Hilfsprogramme diese Aufgabe, die sogenannten <strong>Exporter<\/strong>. Du kannst sie dir wie Messf\u00fchler vorstellen: Sie lesen Informationen \u00fcber ein System aus und stellen sie in einer Form bereit, die Prometheus verarbeiten kann.<\/p>\n<p>Mit der Abfragesprache <strong>PromQL<\/strong> lassen sich die gesammelten Daten anschlie\u00dfend gezielt auswerten. Damit kann man beispielsweise untersuchen, wie hoch die durchschnittliche Auslastung in einem bestimmten Zeitraum war oder wie sich die Fehlerrate einer Anwendung entwickelt hat. F\u00fcr den Einstieg musst du diese Sprache noch nicht beherrschen. Wichtig ist zun\u00e4chst die Idee: Aus vielen einzelnen Messwerten werden Informationen, mit denen sich der Zustand eines Systems besser beurteilen l\u00e4sst.<\/p>\n<p><strong><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4715\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/grafana.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Grafana <\/strong>macht diese Informationen anschaulich. Es greift auf angebundene Datenquellen wie Prometheus zu und stellt deren Daten in sogenannten <em>Dashboards<\/em> dar. Das sind \u00dcbersichtsseiten mit Diagrammen, Kennzahlen und Statusanzeigen. Statt lange Zahlenlisten durchzugehen, kannst du beispielsweise anhand einer Kurve erkennen, wann die CPU-Auslastung gestiegen ist oder ob der freie Speicherplatz langsam knapp wird.&nbsp;<\/p>\n<p>Die Aufgabenverteilung l\u00e4sst sich deshalb gut merken: Prometheus sammelt die Messwerte und bewahrt ihren zeitlichen Verlauf auf. Grafana bereitet sie so auf, dass du Ver\u00e4nderungen und Auff\u00e4lligkeiten leichter erkennst. Grafana kann dabei auch andere Datenquellen nutzen; Prometheus ist eine h\u00e4ufig eingesetzte Kombination.&nbsp;Nat\u00fcrlich m\u00f6chte niemand den ganzen Tag auf ein Dashboard schauen. Deshalb lassen sich <strong>Alarmregeln<\/strong> einrichten. Sie legen fest, unter welchen Bedingungen eine Benachrichtigung ausgel\u00f6st werden soll \u2013 beispielsweise, wenn der freie Speicherplatz einen bestimmten Wert unterschreitet oder eine Anwendung \u00fcber l\u00e4ngere Zeit ungew\u00f6hnlich langsam antwortet. Daf\u00fcr k\u00f6nnen unter anderem Prometheus-Regeln zusammen mit dem <em>Alertmanager<\/em> oder die Alarmierungsfunktionen von Grafana verwendet werden.&nbsp;Dabei lohnt es sich, die Regeln bewusst zu gestalten. Eine kurze Auslastungsspitze ist nicht unbedingt ein Problem. Bleibt die Belastung dagegen l\u00e4ngere Zeit hoch, kann eine Meldung sinnvoll sein. Ebenso sollte klar sein, welches Werkzeug f\u00fcr welche Benachrichtigung zust\u00e4ndig ist, damit dieselbe St\u00f6rung nicht mehrfach gemeldet wird. F\u00fcr mich ist ein Alarm dann hilfreich, wenn er auf etwas hinweist, bei dem ich tats\u00e4chlich nachsehen oder handeln sollte.<\/p>\n<p>Ich nutze Prometheus zusammen mit Grafana selbst zur \u00dcberwachung meines Homeservers und meiner externen Server. F\u00fcr jedes \u00fcberwachte System habe ich ein eigenes Dashboard eingerichtet. Dort kann ich mir mit einem Blick einen ersten Eindruck verschaffen: Wie stark ist der Server ausgelastet? Ist noch gen\u00fcgend Speicherplatz vorhanden? Gibt es auff\u00e4llige Ver\u00e4nderungen? Das hilft mir, den Zustand der Systeme einzusch\u00e4tzen, ohne mich daf\u00fcr auf jedem Server einzeln anmelden zu m\u00fcssen.&nbsp;Die eingerichteten Alarmregeln informieren mich per E-Mail, wenn etwas nicht ganz rund l\u00e4uft. So muss ich die Dashboards nicht st\u00e4ndig ge\u00f6ffnet haben. Kommt eine Meldung, kann ich mir den zeitlichen Verlauf genauer ansehen und gezielt nach der Ursache suchen.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Nach der Ver\u00f6ffentlichung einer neuen Version dauert die Anmeldung an einer Webanwendung pl\u00f6tzlich deutlich l\u00e4nger. Wenn die entsprechenden Antwortzeiten erfasst werden, wird die Ver\u00e4nderung im Grafana-Dashboard sichtbar. Ein passend eingerichteter Alarm informiert das Team, sobald die festgelegte Grenze ausreichend lange \u00fcberschritten wird. Anschlie\u00dfend l\u00e4sst sich untersuchen, ob beispielsweise die Serverauslastung ebenfalls gestiegen ist oder eine andere Ursache dahintersteckt. Das Monitoring liefert damit einen wichtigen Hinweis \u2013 die eigentliche Ursachenanalyse folgt danach.<\/p>\n<h2>ELK-Stack: Protokolle zentral durchsuchen<\/h2>\n<p><a href=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-thumbnail wp-image-4709\" src=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack-150x150.png\" alt=\"\" width=\"150\" height=\"150\" srcset=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack-150x150.png 150w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack-300x300.png 300w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack-230x230.png 230w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack-350x350.png 350w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack-480x480.png 480w, https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/elk-stack.png 512w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a>Ein Dashboard zeigt dir, dass die Fehlerrate einer Anwendung gestiegen ist. Aber was ist genau passiert? Welche Anfrage ist fehlgeschlagen, und welche Fehlermeldung wurde dabei ausgegeben? F\u00fcr solche Fragen lohnt sich ein Blick in die Protokolle, auch <em>Logs<\/em> genannt. Darin halten Anwendungen und Systeme Ereignisse fest \u2013 beispielsweise einen fehlgeschlagenen Verbindungsaufbau oder einen Fehler beim Verarbeiten einer Bestellung.&nbsp;Auf einem einzelnen Server lassen sich solche Protokolle noch recht gut direkt durchsuchen. Wenn eine Anwendung aber aus mehreren Diensten besteht, die auf unterschiedlichen Rechnern laufen, wird das schnell un\u00fcbersichtlich. Der ELK-Stack hilft dabei, diese Informationen zentral zusammenzuf\u00fchren und durchsuchbar zu machen. \u201eStack\u201c bezeichnet hier eine Kombination von Werkzeugen, die zusammenarbeiten.<\/p>\n<p>Die Abk\u00fcrzung <strong>ELK<\/strong> steht f\u00fcr drei Bestandteile mit unterschiedlichen Aufgaben:<\/p>\n<ul>\n<li><strong>Elasticsearch<\/strong> speichert die Daten und bereitet sie so auf, dass sie gezielt durchsucht werden k\u00f6nnen. Diese Aufbereitung nennt man <em>Indexierung<\/em>. \u00c4hnlich wie ein Stichwortverzeichnis in einem Buch erleichtert sie es, passende Eintr\u00e4ge zu finden, ohne jedes Protokoll einzeln durchzugehen.<\/li>\n<li><strong>Logstash<\/strong> nimmt Daten aus verschiedenen Quellen entgegen und verarbeitet sie f\u00fcr die weitere Nutzung. Es kann beispielsweise aus einer Protokollzeile den Zeitpunkt, die Art der Meldung und den Namen des betroffenen Dienstes herausl\u00f6sen. Dadurch lassen sich diese Angaben sp\u00e4ter gezielt filtern und vergleichen.<\/li>\n<li><strong>Kibana<\/strong> ist die Oberfl\u00e4che, \u00fcber die du die Daten erkunden kannst. Dort suchst du nach Fehlermeldungen, grenzt einen Zeitraum ein oder erstellst Diagramme und \u00dcbersichten.<\/li>\n<\/ul>\n<p>Du kannst dir die Zusammenarbeit also so vorstellen: Logstash bereitet eingehende Protokolldaten auf, Elasticsearch macht sie durchsuchbar, und Kibana gibt dir die passende Oberfl\u00e4che, um damit zu arbeiten.&nbsp;Heute begegnet dir daf\u00fcr h\u00e4ufig die Bezeichnung <strong>Elastic Stack<\/strong>, weil inzwischen weitere Komponenten dazugeh\u00f6ren. Ein Beispiel ist <em>Elastic Agent<\/em>, das Daten von Systemen erfassen und weiterleiten kann. Welche Bausteine ben\u00f6tigt werden, h\u00e4ngt vom jeweiligen Aufbau ab. Logstash muss deshalb nicht zwangsl\u00e4ufig in jeder Installation eingesetzt werden.<\/p>\n<p>Besonders hilfreich finde ich das Zusammenspiel mit dem Monitoring: Messwerte zeigen h\u00e4ufig, dass etwas auff\u00e4llig ist; Protokolle liefern weitere Hinweise darauf, was passiert ist. Eine Kurve kann beispielsweise zeigen, dass seit 14 Uhr mehr Anfragen fehlschlagen. In den Logs l\u00e4sst sich anschlie\u00dfend nachsehen, welche Fehlermeldungen in diesem Zeitraum aufgetreten sind und welche Dienste betroffen waren. Die Ursache steht damit nicht automatisch fest, aber die Suche l\u00e4sst sich deutlich gezielter angehen.<\/p>\n<p><strong>Praxisbeispiel:<\/strong> Nach einer Aktualisierung melden mehrere Nutzer, dass sie sich nicht mehr anmelden k\u00f6nnen. Das Monitoring best\u00e4tigt eine erh\u00f6hte Fehlerrate. In Kibana grenzt das Team die Suche auf den Zeitraum seit der Ver\u00f6ffentlichung und den Anmeldedienst ein. Dabei fallen wiederholte Meldungen auf, dass keine Verbindung zur Datenbank hergestellt werden konnte. Das ist ein konkreter Ansatzpunkt: Nun l\u00e4sst sich pr\u00fcfen, ob sich etwa die Verbindungseinstellungen ge\u00e4ndert haben oder die Datenbank nicht erreichbar ist.<\/p>\n<p>Bei der zentralen Protokollierung lohnt sich allerdings etwas Planung. Viele Dienste k\u00f6nnen in kurzer Zeit gro\u00dfe Datenmengen erzeugen. Deshalb sollte das Team festlegen, welche Informationen wirklich gebraucht werden und wie lange sie aufbewahrt werden sollen. Auch sensible Inhalte wie Passw\u00f6rter oder Zugriffsschl\u00fcssel geh\u00f6ren nicht in die Protokolle. Ziel ist eine hilfreiche Grundlage f\u00fcr die Fehlersuche, die \u00fcbersichtlich bleibt und deren Speicherbedarf zum tats\u00e4chlichen Nutzen passt.<\/p>\n<h2>Die genannten DevOps-Tools im \u00dcberblick<\/h2>\n<div style=\"overflow-x: auto; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse; text-align: left;\">\n<caption style=\"text-align: left; padding: 0 0 10px;\"><strong>Welches Werkzeug \u00fcbernimmt welche Aufgabe?<\/strong><\/caption>\n<thead>\n<tr style=\"background-color: #263746; color: #ffffff;\">\n<th style=\"padding: 12px;\" scope=\"col\">Werkzeug<\/th>\n<th style=\"padding: 12px;\" scope=\"col\">Schwerpunkt<\/th>\n<th style=\"padding: 12px;\" scope=\"col\">Typischer Einsatz<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding: 10px;\">Git<\/td>\n<td style=\"padding: 10px;\">Versionsverwaltung<\/td>\n<td style=\"padding: 10px;\">\u00c4nderungen dokumentieren und zusammenf\u00fchren<\/td>\n<\/tr>\n<tr style=\"background-color: #f2f5f7; color: #202830;\">\n<td style=\"padding: 10px;\">GitHub \/ GitLab<\/td>\n<td style=\"padding: 10px;\">Codehosting und Zusammenarbeit<\/td>\n<td style=\"padding: 10px;\">Repositories, Reviews und Aufgaben verwalten<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px;\">GitHub Actions \/ GitLab CI\/CD<\/td>\n<td style=\"padding: 10px;\">Integrierte Automatisierung<\/td>\n<td style=\"padding: 10px;\">Builds, Tests und Deployments ausf\u00fchren<\/td>\n<\/tr>\n<tr style=\"background-color: #f2f5f7; color: #202830;\">\n<td style=\"padding: 10px;\">Jenkins<\/td>\n<td style=\"padding: 10px;\">CI\/CD<\/td>\n<td style=\"padding: 10px;\">Automatisierte Pipelines organisieren<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px;\">Docker<\/td>\n<td style=\"padding: 10px;\">Containerisierung<\/td>\n<td style=\"padding: 10px;\">Images bauen und Container ausf\u00fchren<\/td>\n<\/tr>\n<tr style=\"background-color: #f2f5f7; color: #202830;\">\n<td style=\"padding: 10px;\">Kubernetes<\/td>\n<td style=\"padding: 10px;\">Containerverwaltung<\/td>\n<td style=\"padding: 10px;\">Anwendungen im Cluster betreiben<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px;\">Ansible<\/td>\n<td style=\"padding: 10px;\">Konfigurationsautomatisierung<\/td>\n<td style=\"padding: 10px;\">Systeme wiederholbar konfigurieren<\/td>\n<\/tr>\n<tr style=\"background-color: #f2f5f7; color: #202830;\">\n<td style=\"padding: 10px;\">SonarQube<\/td>\n<td style=\"padding: 10px;\">Statische Codeanalyse<\/td>\n<td style=\"padding: 10px;\">Codequalit\u00e4t pr\u00fcfen und Quality Gates auswerten<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px;\">Prometheus<\/td>\n<td style=\"padding: 10px;\">Metriken und Alarmregeln<\/td>\n<td style=\"padding: 10px;\">Messwerte erfassen und auswerten<\/td>\n<\/tr>\n<tr style=\"background-color: #f2f5f7; color: #202830;\">\n<td style=\"padding: 10px;\">Grafana<\/td>\n<td style=\"padding: 10px;\">Visualisierung und Alerting<\/td>\n<td style=\"padding: 10px;\">Dashboards und Benachrichtigungen erstellen<\/td>\n<\/tr>\n<tr>\n<td style=\"padding: 10px;\">Elastic Stack \/ ELK<\/td>\n<td style=\"padding: 10px;\">Datensuche und Logauswertung<\/td>\n<td style=\"padding: 10px;\">Protokolle zentral analysieren<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2>Praxisbeispiel: Von der Code\u00e4nderung bis zum Betrieb<\/h2>\n<p>Angenommen, ein Team erweitert die Anmeldung einer Webanwendung. Ein m\u00f6glicher Ablauf sieht so aus:<\/p>\n<ol>\n<li><strong>\u00c4nderung entwickeln:<\/strong> Der neue Code entsteht in einem Git-Branch und wird mit nachvollziehbaren Commits dokumentiert.<\/li>\n<li><strong>Pr\u00fcfung ansto\u00dfen:<\/strong> Ein Pull Request auf GitHub oder Merge Request auf GitLab startet die eingerichtete Pipeline.<\/li>\n<li><strong>Qualit\u00e4t untersuchen:<\/strong> Automatisierte Tests pr\u00fcfen das Verhalten. SonarQube erg\u00e4nzt die Pr\u00fcfung durch statische Analyse. Teammitglieder f\u00fchren ein Code-Review durch.<\/li>\n<li><strong>Anwendung verpacken:<\/strong> Die Pipeline erstellt ein versioniertes Container-Image und legt es in einer Registry ab.<\/li>\n<li><strong>Testumgebung nutzen:<\/strong> Das Image wird bereitgestellt. Dort folgen beispielsweise Integrations- und Systemtests. Ansible kann die ben\u00f6tigte Umgebung vorbereiten.<\/li>\n<li><strong>Ver\u00f6ffentlichung durchf\u00fchren:<\/strong> Nach den vorgesehenen Pr\u00fcfungen und Freigaben wird dieselbe gepr\u00fcfte Image-Version produktiv eingesetzt, beispielsweise in Kubernetes.<\/li>\n<li><strong>Betrieb beobachten:<\/strong> Prometheus erfasst Messwerte, Grafana macht Ver\u00e4nderungen sichtbar, und zentrale Logs unterst\u00fctzen die Ursachenanalyse bei Problemen.<\/li>\n<\/ol>\n<p>Das ist lediglich eine m\u00f6gliche Kombination von vielen verschiedenen Varianten. Die verwendeten Werkzeuge k\u00f6nnen nat\u00fcrlich auch anders aussehen &#8211; entscheidend sind nachvollziehbare \u00dcberg\u00e4nge und verl\u00e4ssliche R\u00fcckmeldungen.<\/p>\n<p>Ich hoffe, ich konnte hier den Nicht-Nerds einen kleinen \u00dcberblick geben, was 2026 im Softwareentwicklungsprozess bzw. als DevOps eingesetzt wird, sofern einem diese Tools\/Frameworks zur Verf\u00fcgung stehen. Nat\u00fcrlich muss man dann immer auch noch abw\u00e4gen, ob man dabei nicht mit Kanonen auf Spatzen schie\u00dft. \ud83d\ude42<\/p>\n<div style=\"clear: both; margin: 32px 0; padding: 22px; background: #f5f7f8; border-top: 3px solid #238b89; border-radius: 5px; color: #243746; text-align: left;\">\n<h2 style=\"margin: 0 0 12px; padding: 0; font-size: 24px; line-height: 1.3; color: #243746;\">Quellen &amp; weiterf\u00fchrende Links<\/h2>\n<p style=\"margin: 0 0 18px; padding: 0; font-size: 15px; line-height: 1.6;\">Du m\u00f6chtest mehr erfahren? Hier findest du die offiziellen Dokumentationen zum Weiterlesen und Ausprobieren.<\/p>\n<p style=\"margin: 0 0 20px; padding: 0 0 16px; border-bottom: 1px solid #d5dfe3; font-size: 15px; line-height: 1.6;\"><strong>Meine Inspiration:<\/strong> Das Video <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/www.facebook.com\/reel\/2515123068991588\">Every Major DevOps Tool Explained in 11 Minutes!<\/a> hat mich zu diesem Beitrag angeregt.<\/p>\n<p style=\"margin: 0 0 16px; padding: 0; font-size: 15px; line-height: 1.8;\"><strong style=\"color: #243746;\">Versionsverwaltung &amp; Zusammenarbeit<\/strong><br \/>\n<a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/git-scm.com\/book\/en\/v2\">Git-Handbuch<\/a> &nbsp;\u00b7&nbsp; <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/docs.github.com\/en\/get-started\/start-your-journey\/what-is-github\">GitHub<\/a><\/p>\n<p style=\"margin: 0 0 16px; padding: 0; font-size: 15px; line-height: 1.8;\"><strong style=\"color: #243746;\">Automatisierung &amp; CI\/CD<\/strong><br \/>\n<a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/docs.github.com\/en\/actions\/get-started\/understanding-github-actions\">GitHub Actions<\/a> &nbsp;\u00b7&nbsp; <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/docs.gitlab.com\/ci\/pipelines\/\">GitLab CI\/CD<\/a> &nbsp;\u00b7&nbsp; <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/www.jenkins.io\/doc\/book\/pipeline\/jenkinsfile\/\">Jenkins<\/a><\/p>\n<p style=\"margin: 0 0 16px; padding: 0; font-size: 15px; line-height: 1.8;\"><strong style=\"color: #243746;\">Container &amp; Systemkonfiguration<\/strong><br \/>\n<a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/docs.docker.com\/get-started\/docker-overview\/\">Docker<\/a> &nbsp;\u00b7&nbsp; <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/overview\/\">Kubernetes<\/a> &nbsp;\u00b7&nbsp; <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/docs.ansible.com\/projects\/ansible\/latest\/playbook_guide\/playbooks_intro.html\">Ansible<\/a><\/p>\n<p style=\"margin: 0 0 16px; padding: 0; font-size: 15px; line-height: 1.8;\"><strong style=\"color: #243746;\">Codequalit\u00e4t<\/strong><br \/>\n<a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/docs.sonarsource.com\/sonarqube-server\/quality-standards-administration\/managing-quality-gates\/introduction-to-quality-gates\">SonarQube: Quality Gates<\/a><\/p>\n<p style=\"margin: 0; padding: 0; font-size: 15px; line-height: 1.8;\"><strong style=\"color: #243746;\">Monitoring &amp; Protokollauswertung<\/strong><br \/>\n<a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/prometheus.io\/docs\/introduction\/overview\/\">Prometheus<\/a> &nbsp;\u00b7&nbsp; <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/grafana.com\/docs\/grafana\/latest\/introduction\/\">Grafana<\/a> &nbsp;\u00b7&nbsp; <a style=\"display: inline; margin: 0; padding: 0; color: #146b70; text-decoration: underline;\" href=\"https:\/\/www.elastic.co\/docs\/get-started\/the-stack\">Elastic Stack<\/a><\/p>\n<\/div>\n<div class=\"pdf24Plugin-cp\"> \t<form name=\"pdf24Form0\" method=\"post\" target=\"pdf24PopWin\" action=\"https:\/\/doc2pdf.pdf24.org\/wordpress.php\"><input type=\"hidden\" name=\"blogCharset\" value=\"Cw1x07UAAA==\" \/><input type=\"hidden\" name=\"blogPosts\" value=\"MwQA\" \/><input type=\"hidden\" name=\"blogUrl\" value=\"yygpKSi20tcvLy\/Xy00sSk7NSS4tS83JTC3SS0kFAA==\" \/><input type=\"hidden\" name=\"blogName\" value=\"y00sSk7NSS4tS83JTC3SS0kFAA==\" \/><input type=\"hidden\" name=\"blogValueEncoding\" value=\"gzdeflate base64\" \/><input type=\"hidden\" name=\"postId_0\" value=\"MzGzNAUA\" \/><input type=\"hidden\" name=\"postTitle_0\" value=\"c88s0VFwyU\/OTi3SUfAuTUotykstSS1WUFM2MLawVnDO17NSCE8tUshNTM4oUUjNTE\/NK8nJTM5QKE8stgcA\" \/><input type=\"hidden\" name=\"postLink_0\" value=\"yygpKSi20tcvLy\/Xy00sSk7NSS4tS83JTC3SS0nVty+wNTGzNAUA\" \/><input type=\"hidden\" name=\"postAuthor_0\" value=\"800sSk7NAQA=\" \/><input type=\"hidden\" name=\"postDateTime_0\" value=\"MzIwMtM1NNA1MFEwMrQyNLAyNgIA\" \/><input type=\"hidden\" name=\"postContent_0\" value=\"zX3LkhtXkuV+viKabdPWZYbMJCmpSpViiZYUnyVRYokSaaNNWSARAEIAIlDxIMhclY31H8xqzNq6NvoGzUaryT\/pL5hPGPfj7vf6jUCSlCUkdZVJFDOBiPv0x\/Hj7neWtz+93zfny+m6PF9l5Sa7X7z6atse3W\/Pl321KNan2Yu6yh6VXXb507Rosvv1+Yr+6KtZ9nlPP6iKrmizadlmy7LKLvrsUZPP8yq\/c0KP\/m93tp\/yV18VzS5fd0WXzYoq+6yeFRN7EP1qm5+vuuys2hXVjN9Z4en6nOyiKBdddr\/MF02+2RTZf\/79f2Vtne0Keu6sLGgUzcU8b1v65nF2xkPc5TSgYlb0eCH9hZ5QVB3NcCkz7PJyfTf7ll6yowfsymaW5X1LY9tkz5oa7zmnMdIP5\/Tdin78oOp2tEDrommK82VFL+GfxzFPMJSLnmazvvyhbctFRn\/28w5TmRYlP3i6LjY0OX5CR7Pq6EP8hpbHRf+xKZpVm2+yTU6\/v3vnZIvle0nvwic2NN\/n9bzb5U1R6HDozRkNtMHQ7xVdUxbT7BXt15Nvjp6\/aTu8b1rQXl7+MKf3dZOs7S5\/vPxHl7U8jfUaI\/gy58\/xWtBmPe6nk+zPRbUqq3bi9xgvomlsim5Z9O1x9qKkBxQ0ti5b5i0tdc+rQmtNi86DoFfQvxfF8vLHppOvt\/Uip38X6yl9njal7y664+ybpu4ueAol\/bTCA0va6iZbrfNmQlu9Pl\/SAGgpVhdFv8h29fzyp4aWmybzQzWjdaQvHmdP84o+J+e0KpY8p8sflhXvO21VP1\/k06KaZHlFIymyolnQly\/oQ7y8x9mjosl5zze0q3TwFtm8WK5pZryN9AYe\/eW\/05NxUyZYLT5bOS1By0Phw1lt6SB2x7Z3j4oq7\/lktDyU8OVsc\/kjzbHIbFvxCd7AsmvyBa9bPp8X1TEd1YouwwaH61FDR6mcFQVftI73XJ5rq1Lg9tEBpG1f8jw3fSubsitmcmDp7vzHl0Uz+8+\/\/zvtAf29qmkE3+fLpljTjIvsQTOnv\/Cpol\/yl558wwOcNiVfy+PsKzrQy3I973Rv+Rl4I28D1rnlWbTbkgXHy3rJt7EoL\/\/BU+WNpGF0fD3zeNPoGPC3i4ZPUXc3e0lzXeU0b7kWXb3Ju5Jel22by5\/mPLF6Sitf0S2R8csOzPtq1ZV1VdKD9G7XTU5DbFa0iIUMgDasxWKGi8sCYU13gP5GC2hXaLu+\/LG7gMDghaG95YmQnLibPeST19Z8IrOHtFv0rUU57TIaAm8+PyduSbjFZ+uWTmA7Lde8qji9D2kCZTWvG54fScKSRimSb\/gb7AT\/sOGrIRIyTKD1soC\/LfeejwgtL68I7xBtYreWA4djk32zhGzgL5S0\/dl3eoDpuNPzSZD2WNk2e\/L486NnWPkmWzRFOZentLSItHQ8qkXR0tb8IEKMN7mq8OsLOrjfF7T9axa\/vN\/fFyTnZZXotpYN7vssZ\/G446mVC92i74sN3VLeO5KiDX2ZD0QUBCpLcfyCUKAta0XckoSkV\/OZ4HXm7V7V1aohIWZSgMZXVa9qEn8QHCxj+S7jKOc4CXQUJ3IM+aLQDx6QOMy7C5KmC1oNfIbflfM60ScgYkmq8yj5W1AP9K85LRBLmy9odLxDpGcaFpksb2l0syIIi\/s0iCABeGgLyFZTFLQVq3qzzVcsih+t67bNRQuTUqJ3tSTEz5c0ijUdSbpnK553xev8kibWs8CgXxYkPzoo81ei1EnY040TcTpteDId6Z\/KiX29S1hSeu5MdlJ1QKKoSSmbsFzQ4eL1whbR+ShIzOtdIKvgpdfPYm+I0F7m\/ZY\/p5aDrMiiKedz+xieZBqzze4UG\/rUq2Jdb+nsdndO6O\/Zv+7Rkr\/DSPnjX20LuRatfppUpV773wUxTpI3VylLl4mtE+znE5K+oukxgkVP2opWnQ\/SRclCN4Py707JXCmypwWfCj4R\/I3UXsh0bMWafs1Do498X7DurOwF9M+WjhQNYUrDK0rRXQ1dlo5exPuneoqFHP0Rx\/6cTkFZXP4D8gtHiZ9oq6IKtuob6H5Wu1+rTTOjYxQtnUSm8svbmsV0JWeeLv\/Zet3li9TqYWFSZd\/taNHo+tK5IuHMQ+oKDIPsvZo0Ol\/cbwo+HrYMusJV0ZNY1dfK\/ZXr9xWpcTrly3rLsqnNnmMSLBgfOPnnlQCNq2KpREJBNARr7EWxJYFOV\/5JtJdaHpuaAVk+FZXV8aUV+X6KK8Riix+rAu4VaTi2PSEIkptK5pY8UFQZrEtef0ztBS1rKYqTxSY9hDWeU1RisMraYOIPyQopmmitygmTwaZ2Jf3W9HyycfzD5yzWsiWMAxkbiRq7VHqtU6U2JylnU4rXmY8im6dFpyoiOVl\/6fN1SbZA1\/LwChgSZv7N8ouepTvbO0FRQrGIQqOzwdqBfr0oZvwKHVaQjySATUuwXKDr3\/FUSZLPVIf4uzjl8fSyZrQAy3qNn5xNYZaTgnsQjpvtCd8UUhFknC345rRyudUBmNOukjdULPjy0TfYTip407CgdCoWLCxZoInBTxeWPi+\/tJnweZjxNi+xK3xPG9LLtKdYDxNravFg71gQzdg\/y6CY+VEV5i8Wdj6FNaTqcqEWbEU\/oD8\/X8MaX8FRInteTXAVRPTLrlcrl6ZD44VMecwPyqcqZwamLLtdsgOiuWnvv7786Xy1KdYzVW6QJyODiqeu1yCKwLC6ZFj\/G59S\/mE0tzDYjrU2XJiOPAJaKrkOpmiKRmwOU118d5w8oOXPN2rwPDGDqoZWfF4nq\/5t0+ZQyqIpe\/3vGW81vbzF4PimFxd8ZzO2lpfYHp4SFivjGbOsoVUSEQvTnoZIz7j8kQ16uKCQ\/pg1n77Kjp9ImTKKpShwxOLGGZ+kF04E1UUftYkzJ3C3sU8kN\/M1O4YNRKGIFrnoGKAZf7Lroo\/Y3LNrL6MkuUkmdQc\/m6dtt9i5INnq8keYsSwe6XKId0g645QEdsHyHLfmG9rOlk\/LRNe7u\/yJbSdM7h7uDm5OcG83sjkm67BnHR1SkuN44Jc9vk7LMGeYQexPiHJ+uIrsIFjhkUwAE5BaEJHEjr2YZeacQXgUqiRL9o0WxbQqac7kwecL3prj7DueZ8mvCGOD4CzYOzXfg1Qnm+BkfEEG6RGm3zfFrL\/APcfbwi3gUdCYNiQooOhIfvG+iHvnjlKQjmQwkTF3mjxhIA0hwZZYnWBg3ckzWr75n24su27bnp6c7Ha7403enJOdTUqdjIjmeFac7LZH5zXtU9Wd9Nt1nc\/ak9s3b\/\/+5NbNk0XZHW+rxY1P75Qburz0O1Jsf7qxzi\/e3KAzdF7L3\/P2TXV+IzvnK0d\/I4eA5A+daXpyuaFTePThH27dpE27KI66Zb+ZVnm5vpG1zfn1hnZ066Obr+kfDJGOfvenGzdIgs265Z9u0I9vkEIsF8tO\/0KvI\/PycG\/M6M8d3d7rPO6Dmzdf0z94HP153cfd\/uDma\/oHj6M\/rz06muwHOtkPrj\/ZDz+++Zr+wePoz2s+Do\/56Nbt3Q0cLD53pFon2b9u8tdHOASnvEPb17\/Lbt28+Yrehr\/dyE4+vXOSC+5mIMcmX5MiJntDb2YEzP7z7\/+hju1f52WVr\/\/z7\/8+Gf3wryTpGXOBLBv9kizEFd\/mv5KLTaqVP8jqhW0NdUODXahC5pShriCoXsG1Y9OiMl3UCiJTkOKUKw8JtIZZLLYShKNhgLMEnmJ\/mC1BsxpZhZDb2dMn70JJ7XoyZyJsE21TclA3Ag9c9A0bBiyyVAOyjpsYrHQFbiMAkKBmNKFGNR+JtmM4rTwS2Hw1CTjystkVZp9OH98qzMyavwUKAhePbL2WDYZ1t1cmCpTXKjQStlmcat0pQAMyXWeSeVPcfDV+Qyv4m6AViUwmDUx\/8CpVsoq8MXTEdqST4fF10MOqe\/D1B4KBsCpkE1rBPxwOPOEYlvw9spmbeVC\/qoPIUtBzoFZw0QSb1GzBCzIa0kFi5xgbXYjpv88Yv5\/DN1PPwVxPsfUZAPbPY+jiTts1dbX49DOae0l+uv5VzWo5o2KTc3iAPwPwRfBLdht36kKzLbgDsKmwArzNEo42sBteY3VyJjjY9AAoeJhcq765gFlKX2CfmpeV7w+dB3okhxamCl+2ZCW0uN+ir83G5ctDRga\/cJM9I33GNpGByR1dXj4fLZ1wMjbJQ3y+hVnRVDoAHC828x7Myo7ssUbw85msJ+6FGI9kHZ2SYWYubKvP0RURIx53nQHtVj3+gkGzqlOkB5\/dew7pEbiJZCXI8+Oyk7mj2LnKFwbIyFrmx3bFUp0iPqDBfh9AwHSBWR5BNs3SaxTOD20AwATyqxuSLcB3xZPjWxCudxUOzr0G4H4bjs5ELG1v7V\/sONAzAhvE67D9m8k+RDckEUAwffs49X2oBO3MluRw8M+wc\/G0yilFyIlPGsZNW0Q3Fh\/n0zIt1L\/yu+n2h\/bs8gc4iZCWjxkWK4YTdfhGXwXxRA8no3tq7jmbkCwHntFSs+MTJIRatS2D1XzOt3nD8njN3qOhhSQzxMoMwZOAP4WNfKJ+4AC4gSbDai4K4PasxvTVwJv9aVTgQk\/kFbOVqI6KTvWn7\/ME2uC+mHtRQV8yjMnK4SkLPVUEj1SuqBIEiNMmQQYWrbMSW\/VYZjwFApcIBR5RXFIs43pakHPxWvyWYriEcccNVWY1xqP7vK7m63Kl0KVeMjlX9CkO4QQwPNzrSqNPwLPMRcseSgyUjycUEPAMmbKEUPnzjN\/U7D\/Q758r7pVXEHwqJgyoZuAaQ2+ix0+OdtE3JMDWEaZyKqFlJKsLV5ZEJx1LfJrEYpT5AfrlLXjEAiyEZUyRL6IECdKw9ahmjMySOO\/o6PJ8iobel9GHFp1oRbnqrPAtUEgf+7zeqi5x6t3il4A2ZwWAgWnZksBlbfaY5l43ZaGAKd6rmCnH6MS7jhJAsMFwZ+olQ8d8IKqiiwcs9dbCAaHNFUncZkVUZGMxZyJFFPlI4dNKCCoJvcpqQ3zgfuRlSjgUYq2jf7wPjB0HtBJFGxCRUkTnIMLziMcjLAEM6qLXHfBAwtmUIxQe1SsMedTdyPEJ9s04Tm2n6etiW7esMt+Ek3QswTg+OAMEA6CrBSPIOuHQDM4NXztGCWgv2HiMDwVFAQjORHY5byNgcNFL5EviUEHmG+pED5JTerFDnHSmkRVZBfrvL\/LpqchjvB+qAb840jPLhq3hjhKxEdn8bJ13HeNWLGbyRtaWLEAG2kgB4bRwtLiHFOV4ECCkqNTPpmzjlx1vc1hzW9JnTf66bE22ncYbet9rwHeoTzoCqfoPCId+BSiphtrD0tHRfau2PKYLoxcctyCYJ7DjzSwsFEJ7Gt4kBn1p31UgX4AlNp+Dhaog1DHCZiO0y3BpM3D56\/7eOGXEh\/AHNqjNA+AttgAlwEnvJhh+mIaNBIvKxTeKa+2Uupr6jlCAgTtfBjCv2Oos8udX3AyNNekWAegUNk3T8cMSPImPcC+nGSd48CjmI4CcoJSew8JKy356HWQpxZISoOnWAZAlGt2vDy4NXnoAfImfeFiIiZ94WJQJYzwo0MRPPCzWpIf1GnDT6LoN\/F92op2xpzDP1ukH3HiLDGxFlRbOGxbQHiwi6FdwUQwOMjMsddw3uNf7kWSWw8fZeNiLgm0epdKB8DHQv4wXBJuNFdzFRETfxitcL2mi3mXzEvYdPhr9RJjS3kKgv56y\/FQGBtCCfCHhGB1X3cxYk0mQZpP9hfEtsP54Mu0gLtUu1QRM6Bovapi3YhrDiBUYiYeZW3T0bL+0zOpmkVca5lMdwT5HF+x9F\/5lm2UGHkIM4TEZIUbIUwdsYl5O\/L0xXwK0qKqNTf99mNoT8ibMbbqfN2U1iDwrgGLKi2y9rq9kJXZGWZyBNbK6\/InJfJ1HtTTIDLwD\/gi8fwAN8F\/pB0nAzsLDtJTxYPHz1MOwOJ55C\/PswdFTEvwtWdPLvKuMPKXY2pZUH3mjAld8WXflxUXR0TXZg08wBAmQJpuXbFgbTvhUzbUVIBh\/bWK0PK8uejXP2HXi+Bt4U1c4uoJf7XN0h4hGrw5LYpoNLTM2aNn86dhHGSAMweGJIEIwmswYG\/kcE\/0AHw+x1HA+JnSsFYw7zv4Mgo6zHntMmW8YbnYij3LEyDigVRXmf81Npsj553c962nyXxd\/6+lD4ifjFuhnWejEz8LbTz4scu9eccGbWBm\/OPKh5ORMBhxLjW\/DsT9lFPDpaAmBV0mkH5wbkvckVDmerxGDmRjstvVsoPNaOH7qMRxjFSjsX6ovZlDJjG\/xAkZfCiqb7z7rvZXIm3qMSKs9QO9Z8CMfl5VAGCKmawXnfYibd0hoZIaweMUDsngrDKIEZmGZdvR1Qb7vzsAWoSMo5K\/sR1AuW6Nls+93ThZ5xaAh3NklrtMruvPk5VTqRa55vRAhBwsN4QflkQ5gLJJtTAO8SwdDOJl78ElyUF6QQMvpDNzNXsrDyir4X8y1FE5ETseOtorh8FZAEHrwVxJHD3TgKqeNjJ6fCm+mJpe4wgzhpD6AeHEgT9CM1xVoVwGJYOUqWGGUReUsdQUjiHf5D5YQG4XQArPEokBGMPEIF\/mOCpQJSKLXTU4lkyywN7yl+puz80iXmxhow7dOP8P\/+dmTk8\/u677fS8EyaKK9XA8\/KoMJVeSB1hJiMo4zUgOjM8qWLqs5NbQxS9A3sTaRR9MFzgHtar1eiDxHEEeoKoLZQ0BNC45i8SJIkAfIihwjz3URFrJ3C90BkonLCVX2\/ayUaN5x5PUL5mHbmskdBKuCOR9C9xlTNyLxxxjoGLbBi6cavHOcDMgpCWWGBZJAHriByULp8ktIzwKMfMV5qnGsbI2SaGD7tBLqhbD7hdcf+IrKlp4pfbYjy02gDlFkOqOU+ot7UWN3mf2P0Z8GFOiRQQAjl3yOQMXYHl0W63lRGXvG6+ZAzHdPIWETbE47VcYZI3neb5jVxvZpYr4dB+gkuM+4ECnE54\/7VGwCpbQ7zpie7OBLW2xrfHkGuSq9mowDWtFEL4aYHODJNFUEu8wKFH41m9YssjRoMJAiSnYKdxHgtCfA6Q3u5bhFsFY1AIKfUGP0jm\/JZJhKPG0vVe5+HhIjIpI6dER6OaRG10uk3FRu9iSwG2nshgiWtpwBCSu3BfNLIwQWt7c7\/pdq2m4\/ud8Hl6xUm9q+5qKTCU9QF1DGEig90PDPO7NsvUV0ZgPTX6e5SdFFwdtNkAuxMWyLeQjRF8xXwJ1lhVWnV+y8LJg+nKrxez0paRXkZ1UE0OJ4ZV2HIZFU3Kq0jc4KWwd5la\/ftByfK6O8jifCcUGdlDZPJjl5hv43eE\/\/jqPEdOjLHxYayzMKacT4mAE5UZ6uI\/+eya5x2GXLKVsSjVPqrjgTvMeqw\/mt9XYb5fuTytJ6QmpFjjEuigXHAfgQhdwiSBnyk5oLHlAIlotSDWi356RDJPAlLLtgKdGtnoKQXGBz+TOyO1Uwxlh7kzH72X1mmazrZQUjSQxg2JmCLzu3ZWbUOUmGqHf1cq0GX9WVVV\/T4bxPt4BeLn43lAO839Gntuv6TeTpaxxojEu77zxxaSz\/+tmT36USteG131z+cPmPMvLfLQoIP0\/k60A8s\/KtqnFsNK9GPlQMymwuf0JUaBS9LJnSMUPSh88CM\/PqismoVEqC8qrr7VQMpFtZaapHFYjDlUmyKkGvH4x8SskGEsriWXpTceElkUMuLcltDo8I2+QK6yds2dgxDe7I0D91QW2WTp+zjkcYC7fuHnIBEQ1RCk8waTTMo\/i5esZmAk9hHCeGgOe+H7O9DjJoj2+b9h9kNkiAFG\/AwAEzfLfnQEkmVMV+biB6zpLsAKZd1JkRXxPDn6dNIkU4zTOXx0SjEqoByTwJk2DGG+SfKdzVyFbTwWmN\/RkBKNbvnz05HVuxTOAnDyX4fZzEIal+Q\/sJljWcAFx9U69Mxq9AT+PL9AO\/W6Cat1xaEwenQrJ\/NaQ\/k9r6Ycki2Jj3IriNnDq4q3seLETizgy4RxhjYdpK7JTAkRYzX5Jx5a4kKQGVCvoJjiEflWjSOIMmAmljNjcdfZlBkTCC7dNuihe90fEkGB+IW2kOjRhrdDpmPZ3SV1NlhI+RIRHKDOGBDFOKojTbahIY6PxTUuAtQz1K6RBTcEzouF\/um6IjTcgiL1XyGB2rYKkjiAp\/nvHTkSeoyxl8FhfxT0DiK9Q7jiO79bjPCeeJETrZ9o7D8moyh\/wKeEA72AZQ44mxMhGKB3jw9JEtS4YraPuwESyEFy29t98FU3qnnF0bnE+zlosrXYQh1Xt0MQbaJb4JEW4JSooB7RYX3lwPjspDGgkgYXbFvi\/2TlnzZMIY5eCy35Yab0Nve78x5+\/ixGzbOOP3OPcJ20SSARdNTYeg5bF3DSLheg3cGHq13dLcAqZxXZDXzVPJOaE9ZDQB2dnlsuuVRYjHB0KdLtpNWkpOl2z48uVil7nULDMextlNQ3UsOti0W+JGccYeQre8tQojhpzoEO9txRUJJqryTH9W8N\/YjFegZ2NCZBK3RnLd1zk4hKKYYhKcQ0s07vJ2wyUyS1Xk99VsL240MraCrpB357zDYT7v0EdOoEMt+EPJhy4gUSx3yJ4Hluok8p7BxLuJ6xDjQ4z5rEFkNXnl58f6epqvZ3uunDvenB4lactONS8\/GAF49KNDxuePcnnwLxSnv32gOL2O8reJ1+95+YHi9vbkw8fv7cmHj+OHMR88nm9PPnhc3x\/ya6WTCPvuah9TMxHEMrV4ZkolPBW20hAKTKJt0z02lxXNKIsrYHGF1fdi44LnjaH4aAe6FNIhNG8RpGCKsZ3RZk\/ztcs2ZbihYyXOcesaSbRsicGuRYGKkGquJgOTxTV1RUNtgrW\/Qn6D4B2J6LMUyrIxIFgphxHblfgyTBAEOeUBR5HEMMzMVVQwR3wqYbMl\/PVi8+nLulnN1\/VO4RGp63JlfkOkdnhskK3HGHXvrMoEpq3Op1J+fZg9LHtqLpMqDArV7BBOrz7rWw6fFUJnHx4ltukNpO+FbzCAzn0oqSNvcaE5FWzxpzDjs75dGspovEgf5lV2v+Yqz5GpetEnITc+Pwln3njVnJCqK84JNY2kltD1oQfCE7gwlLCHyRXOgIEtE6yrFiloO8CAZaUmMt\/AzntLvFx+z3BGA8LMnPCZ5Xw8BKEBC\/A\/zp5+IechTYG571KQFI6PjAc63xLFLrWkR3aH4eBPj0VUnex02u3JnRP5haxuSH+N0f7gJ2Xk3FcL8k7IaEP4uzB4UTAHMgvJ7ukbMU\/PACME2j5jiY9JWsG41hyxUOBLTSh1davLHzmAGr1TuB3qWjOmlh5R\/lJIE0ZWzUsGOnyGFrOP7XoKr9PB\/YlXFUI9ttW0OzQiDvC2MEQ5rDSrVz1baEDJvDccq4cFMo8vMeVZSMZV7sl6bxLkto3pLWeK27Plac4tanuAXK4ZBWkgId7j6SJkEsRYSYhMgGqRSBPv+lWh0EeaI9WIzEtFj0UXOhEN4UZFGSRXVGakARpcdnqeLIBx3TGuIC95vT0qhkJuSHVm4Di5dMNaCMlA9omoVEM5\/jwgA3o82+Q5X8yjJ2xmWvU5C2C+NbAQojQvB8I1FBPCFouHMg+oPCtVHkJQEpo3L7mR0DV2ihHD\/DmO2h4W0OxKGpB4q5FuI3vupS6YXjT2Je49S85uqEi97yWkakPGfFBEudVJ5MVqVvhwC5dr0LR6pXa50bgs\/zT2ppdI6WyS7GLBWi3k4Os4GP8m9T8TMI0GE\/kqylRK6F6twb1pwYtADjtlC4VZRh2SITqHUKfEncRrw6lK7K5dbkjzrlarDCp+USALNMRrOfaa+HmOhHFIL2+dT4\/Oy1\/IwfvwAA6eDPDX9+3G7z2AW6cPPaxHpw89rDNnIz2oH6cPPawLF0\/wdbw3uoIqCNVc8DKxaMxy5HwpTsvpjH3Cn3bcFXdL9YenTrYNSVymVSN1OK0hlqpHFYFWRWmoW15J2lYxhuW9MnY8LTbiJJI35GoNfcr99KyEW+IpWhHCejsnSw0GpOa0+aYLIXnxAl1W+Zi+MVW6J0dkJEY5NI1Iy5RL8SJCzQRHyeBsF4QCd+PCRTFAlNqsCQNGK1SOaBLvwVzg6CKXh1IOyDLvLNRiVZD0aLwvtyHQSUsh84tJMvOGpfEXImuiTg7GK7j6XP9AXUChoKxb9f6XOYfXmpUYwq7MGdPvFStYFJrtDn0bifSp4akWRahzIEaT5tMrtU4ZRZJMH30gvetvNmv1f1iZg2btPadhTrrS24NhG1x5KY0QC8cO8g3+XE9bKzBB36e\/ykJ3xT6zdD\/wov6pVMQT9m8zOG0B2X9b4JE27LtREQYeYFLlqrRgJx29eTojccvpyC0KY3omCQpIE2CvmDy+B2ZXW7ETngv+hpNPP7jnDWZ4bxgLswKYUM10Ina47VyG5HPjbLU1KAhIJwWt1vtMq3ybX6DMXOQzoo5nKLYaaLERY1GaTmDXBp5kkLKtkA45nCGevieqDvGSu\/Z1BGW0OKmV\/UyqyqXRhs4V29MS1AwZhHorCMwleB6eOI7Z0Y\/BIZRCfouGizpboAKZP2m+Bgpl19W8XPRKQAEjTRkw5lHHZAp4Q73xipUuCKLZi7oBN9wndZKsABlQsi8E4pMIb1HphqvoRtnRRl0kXiifSTJyfd7D+1alKg5n5GGCBK8f4bnj+NFzFoWFA43VIU5MFAAlIwNaYNeQjoDmxJJnAcVA4FCzWi3MlyIeoNohKx+Ro8LRcIGpgSYRnV7LKt4jQ1zdRGF+0t1st406PKpgjdqpMmZnPGDeJi0FOmbShex5xe6ww0bFjlVekjwuq5mGY8G0hyRSj5qnpNnpq42iD9\/1qOXaogC6WyFBvUyJH2mJlNYAhhRf+8TAhX4gFsLbWxTZUT1i2qqJSSpJpO7Q3jbWLyA0veXzGBo6KvWhsCmd4XQVohUVMbt068Ih7vZAZ\/u1Dc6qsS\/b4gqeZSK+fh7VUhL0TO5oVaWU2hFrp3iGnkx+rOEE+0zpABjoVSyUKCD17EXuo8zZlS\/giLCza9OYqpCfQPWQyHQgtzDHLGADDgF4uS8HQ43VqRHXfGkXz4Mh4UwHLcT1r1D400LyLoPnr3X6D+j0fy9P\/IVc\/t9f1+XX4f3KDv+et17X3bdHHtDZt0ce0NUPozyco2+PPKCb787sNZx8vUtpudWrfHL1QPY15BgkW130Id0KwUILVYwUPMBQC58O9IokZ5+F1C0YUo5kv6dw6p5kkCGQajMOPrElZpvCVRdA2wj4YGQbGomMvPpYLArxXJLCpRTXAnXaqWzIWKHeJhpsMgpfXgmRhqqrpKcWhVYLBglG0IMnG7KxQykmgdwrF+wdF2oRKJtsayRwODUKopDShsXhCOsXqrqEMkPN6Kst7CtLbOFvR8WOtQ+EVWFEdUq1C4WOAscshnFqLZslW+0zFYJB5zR2J7atot02du8lbKRVT6gmmTQXEfqzq9BTeUyJI1xlO7Za0ciDd6Bo27yyUrwh1\/hbKYu03Dg8fFh+TDtaFNYvJtilM8mltuVJawz183EVAXHxkoriwgNo7Ct+NYAwcaw6oEscri3TSn4Vv7BVDELXdE4ulAEQ3r1RoEHK6KULdXpFJNWneE1CQCu1BCcWQU1ipkLbiB+PhFNv2kleNn1FrH\/NZmZPnjfUzUesrkigN\/pe7EOCxCS5Uowmab1Cn9ElCZVSn26YyyVVA2Zx88BvSHKbrabdMLQ7vmwx9lKTaNJ4Thz7INc0nAfuZwTBqtUfHq6L1+W0lJL2tPiSeGgXR2bzQKNrGsN1ENGzdb9gpQRXNELEhSUzmRWq+UaNy9jkrZP0Snhtsvb23sENi7UtGbB16RPD0z\/BRhexijWtsqFHIknuFaFOQrlQT5URm8qK7QVQzAn5cS6yXj0XdvZumvbPqmJwOFznPdSZM3b+21CGQmRMKBmp0mQkMMLgktK434ZYe3A9beZpxuMYkTLJoZC0kD4eMetSq83yhpDfvsnQKkk6TrDeW2gqVFI+HXsmTae4yrBtbJo920kDJxFF9OBvt0wjaScjJ1\/P2WToXvdvpRtYVY7KsZ6Ht8iQCLjhz+aMm1kHB6DpnC0G3DfJXvD1NIUIq+n\/u3y51qY3ElbVfCdp9cVPDd0lKhUHafqnS1HXzg5SZ54+sMsThyoEpRkx+Nmu\/gPrTmIJ0JAHtFfTPG1eMMYJR0GSqGiX9drAOBnePs5M8PrHvr4F5PdHUdJQAH5m4H\/ua98PKtmrUu\/qFXxPFpDvCqcrggBC8jtzNgOcMYCdBnS092Fd+II7khQ1D0lSPj2+iSw1uaeOSRMjSDEDKEV32VsPBYD8SsmW2TIOM5G1aE0snybdDU+TroYoyyQV\/\/k7gXtywMJpM7z2l3Heb358XeddRvcr++7jl17XddcnHtBz1yce0HG3MR7Ob9cnHtBtj4f1Gl47ok0lSkoklZyL9p\/YjAUjTeTAc2nfFuhrBTD\/lda8slzMqx171pRv75flsgydsNvKk9d1G5\/gbG5pM+k6DiqgGQiT98rpuqy7ZbHShPrWCuFbwaBg0mt5s2FsgGtvkHgstRaUmIraGkYicpYE57IHB03jrEnmoDa\/ybkHAxrEYA3MGBUXk0ntkkndJHGSe5LHghhU9OxmxVwABDZ2UMvAkilNNyRs3FY\/NKgfC75fQslUXwzsv6Hb6rGX9lzprHt2xKnKEJz5gjQMU4yDIgv5mb53j3WM3XhUZzZg7sXwiTQqHPDgSBsJjTEAOC5zKYTqEran1JLQbGqxvLT8dihjDWqdD6hw7BwQgHL6xQp+WQZIXd9jJeIng1tW7POV5eA4V1kcpRKV\/XescptNzvYBpvl1cVFsY3GbWMXQLGHAGiEqm7ofOA+FhX3cZeDWa8uyirUfBt7siktFW4MLPrmCS3GPJr61sbde3DMN6N+19sYhFKS2rIsqgvAYET8WJthNchmmCUYRSKvu3vetlZeQEyB71HGhab5DF6HVxjDeN4xkW2lFTl10SFlStLZngi73MpIMc3mjdQDT3RcicRyqxlWRdWdjM9EiLfxIDmpwWB5onqQ5Y\/FZoSz6ZHhRYZUlXh7iqNrj7c9ysEE7pSNZonekdubkGnfxnCKG+Vxqjh\/juCq+FJ0c\/gOxICtQKD6hJgvgK+QfkKmPj8WCEebmhNZhcJTxI1VMofK25KPrMPaBKI4ShazXqypQCiApmTHqUdjpCrCPT7ZUpzwcmlHetRU33hePi1dQDw3LO0mp1YirLGWoFB5VjFSCwyYavCltpQt\/GDWHP7IgnsgVNrqWtP3CHRKMSaACKYZ8JTIeL4VW3tpXXcg7CrEXHt0vPXQ7wJ+iN\/2AL6xsk+cKoBdKwAUqOWsPUkUZmrAOiokN4p0+9B6O3iTqoO96iHCGDBTiiOSxL2lLmBXAzp4uSeFhgGeSFU0bSEtJb+Xsj5hcI8W5MlxCCflCzknP6s6l7dC\/uJifJQ0HkQ0nF3F47bVpUqox9lpKVAGn0Odza+oLr+ygpoH26J0WvMIyLduzx1pURcpiWEZIoNwgr7rR63GaPdFGQ1EECbXF+GyYoFRjIWumER8+e5rz9lfFXfFVrQI\/TnmSRD1x6TfWPFq61Wl9ClmIyp8pPSlmzozf6smPXbRwRdK11lZQGyMF2DCW+0Q3Cgbj18r\/UvaFb7GQPmQF+CiukS\/EOsuFasO7JE+FYImlKVTSMJAUa\/ApQhzROV+1y1pffs2Hkz6otpfLlUdGIJMSBCmJKfZzlh1SE0JiCVoS0zLcR4sJ4iDiFotG0iZU24UbFmSY8fNar7EUSBd5HX+MirWjl1UJSS\/oi75LqjvRyZ2WVtVmX43FGCpSLs9VczOWnW6ByLh+s0fxuqCRtTANrDnebVg8rpV2qFsoV1S8k00oP3dWiUEbsHs9TxPf5ZDX6GUuQKkzhN5N0DFshvmyKUtH8fwEwPPVcffybmLJAARRTX2GsApubVI+d7YfwVJazB4icSxe8PNKomkdktALgK12jO7IHMG3kUYNO35rlaHQaFctjNNB8T8MIWg5wI3aLnXwOu02XYvUZIuEWX+xroOrSudiVK5MuYSLgvUFZyokNe4hySX9SZqoHbMAuo4smFxKPa9U70ghzMhRXt7+NPZDP3XXQ6g6dm0sTBnKXx4Q11uF9\/9CxJw\/XBfbiyP8lfG9\/S++LsbnnnpAnM899YBYnx\/r4fA+99QDYn7pQb4G7ve0NPBpWGPNiylvw1WjiEINOskVvd2NGXC1NjTKOPydkh8KWdfWC0H3pVGWJ1qLYr6LsF\/s58XvrZ0ldDdpOA9Guuh1Ropy443vrLn8mHPuust7vuEV5RsCrYIeJnRyy5a2wJtr0txlURQG3Rx\/lGkAmqyvc1s3K23kQyEB3NvX6++zNSN7af70Jrb\/hHbYbiV352sLJyesmWHsWxzCkG6wfNNCcZmhBAdpn10mZcxS1M1NVguiGfhm1rFynvaypsKxGNOm3PLwmQl8nwA3Bzax0hd8+UtJxmIj3LtEnBSCOkrQv8p+QuHXKYLcbZumusOlQTG3Uiuxg5s6nLG7R6ELg+z6ZAi7Pqtnbh9DUyf6sUPL3R2LJWPVvdK9LhyIHDJc3OV0O7wn\/2Ycv00Aae0kl4CGj8v1vJ1JjWs9BqU3jUsmocNQ13SietYmHlB0uKPDomARL6p54X3wiLTh+CxtIRGM+ngKhMSBSPnxngrbmmSV8sZf6DGkN0m+Ae+AQXiuvv\/jy5\/orAbfwG\/9yMURL3NPz4xdbBmobYvL6qLcAuJcFLvLnzj8i86tcjxb3DGfgLWHHfWiZmhwbMirEI5A3YwL0Tx4XWy2a4ZH1LvkYFAqp9peOq9WAvUJkG3JNVapMbT30s5xsRZwOPMcc6ln0s4+9HZkeSwVDR40jEkM+64kz13k1QUcW9lheVIocGodG0cSwrpFjJmBeP\/IE4ai0tQq9KiJ+VXOp2ajmRQJWcsLAbQTQgDJH2mfNsxpwTfQBy2yLwEpscA4W3U9maFKLOH2I1qPR+I1cjyOkfEo3BndNZzrsJND3E7gFQ61oPwvvQnf0F1wm41UBOGSqkAAzjBKdhBgytRFrFhjzToZ+iLVqlwcZSW99FVtv2Ew1oiMeZy1aFeGr1mkFJbr5yYX9bHWu4lF0FG45QqGjbKEUn97QHCzsxQSdoUUHN\/tdYaOHts4CWPh5fV9SwSMwlunfCFAjqXvFYOt5iwxKdkphMraOvSwsVSpj63ItdswMWAKs0qSaEjgy90rwHeaSOuoPugmFNhGUAe9AEmaPF\/laxkPRzBhJyhiLlwqPuuAUj+PqYV5pRUjUZ+Va1RZVeeXEi1KDU0G95oVcpVhTfkLnPaO9bU44xaMUavnJQqRCoOLPLlO3G7GatJ+IiIEzqoL5lc1hRBMgs2DNrK0nzF17Snd9Z2EU3tcfWRGpk1wJUNYdJ4C9C7++TVE4JqrFodGAA7ZTtPbrBdoTALamzxk62WNi3vtBRGXeBAo0HpUSVX9AW0vER9Jc4efRwb7qmJoqF3WW4aNdJvctWfZnU9JduXS\/pjrmmOmKGtDepGJU2SiPA1czUSTDIqnpClJ8eyGE3XFEZoNNePwTHGjJhmSv9ax86zXSWiL3E6QTOdtfkFRRKepFOB60tIbKEAtwYoLDczKDaL7tOFWdHVKemUq0m0YFfFLEBvsWtwNNw8SHJVUmbUZ4hQIcLc0tVVz+cMc0QRhRAf95Su7zmJtgSrBtmC+hDMSYTIWJt4k2tOdZS\/fXQ7yAPycRUDdPK4hbVZ4jSB0SkttI8Kpi2ScUWGK+mKxsb6VP10TZKK1GlTU9tzzxCxh11T9ahVkCQ10tD8CxjmnUCxSb8LHlY1RJI2ksA40tynApq8ufyQ9i2B1E1oYx+7XM+syZ02DJQMkUWLaB2rgqPOEWQV6MiTboz8syY4Lna8TXRvAPM8hXd7+9KxqS3rvKbepa3IrkjaKIZqReEgsMJdX\/0Ikv2sDgTq8XxkF3PPW60KA9sgD4n\/2yAOCf2GUh0P+7JEHhP3cmb1WEdVGG1lpKCHF1dK618ucjTDY8DNAZT6Rr3I1VUPiVWQGsa60jhTWaH2SxqURWy8hycW08lkbse7kWfDfY+6EBApSGy7XIqwc9QuVUUOveOHRBzMneHmC\/7Uh9klWD4vaEgwbXwSDPxTKhPoKLg8iCSCWT02L4cV4orTcEx\/fpdMjn0wFYpo9qVVW89mmrEho88q98sDiUFxeXWVVTdCkRMueEgMhY\/CtAOOzdf5mWtcrjzCOmHUB1rMuTkbdSqsnQrPL1DXohu5TsXnJO5K+nsRDB4uALDghhk5cLQbFJ\/YcQJ\/mJXrdyO+sxwW+EqBNsrqkjRtm3wZG3AZlSuf7qpMuYlGMGKAP4WrN8IcJYHU0g8rz3dbSRmdldKvUqRp0xTMkZDosdhlIV2mVVVh10pUysv3FMRxmFD2p6ASGJsEamzXL2kJ4mBBXZgD4WPky9IyZBnt64Nsl9evlzoS+Opr+OSirFMK3CHiurqzQEqChaqcYh\/c\/pFDRA8\/nyb6XUk9jOq9mSQVzekandu624KGFjvcke8W+cXbm7Uo9rWf9uthX8rTdFhelwSBk7THbjXdNsVBmwLo7IJnNSesyNOihT30ONqZ+wkrWqHO5YQxHjp38WuSwgPdsHXeauBRL1FSD\/nZmSzNm95Dd37AAjZ6LKVifdM\/povSmJgTzDOWcY0sv7Vfs+yTjcLuSl1zep1ETN1b9ed8mxLkGhgK86qHskFoMmU170Ahs9yVzcGM\/xSd0RbY1LdSF27oUIgmqgg38vkszuGdJHUtBniOuq6vdV4IcuHROLUYjFHzFydtBxzpH1BUgoRfTn3WZvTNADRNXgahVjChqPPEfto2RuPaLUjEtRq0KH9JTANCbI8RyT\/lgWBKSc5alSjIjoWpK7Tmg56703GfLgqRE2Up\/9tNwmRS1w756gADJ7SEl3cqRmQPEaGDhq4lGHHaiNV810xLYX2i5HW6AF+0BwDYtESmQ3R728EgEssyZibWjGLgaD+gqt0BbKs2eD4ULXEhgWKSKRNlWJC53MRkS\/V8EVohUC7oaRXBlvawRuvbtYI9XSvMHkyFMXRAMI8g9X9JeHin125WnE+YzNvY7ZC5ojX9lveeVcKImITolylw+a+PaSGdlaTkopyp0YQkZ1Ao3CIcR0bhG4gATFy0UScwnMRJzYy5oKHbWLLhFkCLnTqK5guxpEaGQI4+LNurXKzV21WyMDMbAt7sK0n0nABfhhATcUnuAx+nV7lHoyZOktYdKU9JM2WJGoTxZsLpCH1VYw+tAst2jn+3wWdwCqZVlBSEDHIFuxMY3OsANC+VAkiyJAEm0vqaByoUjO5DHCcnYBRMDtdrKPiDVYhLDiUo9J9X2Elo48MPGfMZwsmm1PsdJM\/J34dF3t7y42pP9ds3IeE4qyhlK3W7JXbKKSeh7mEsIUxm042IBknwSDLarOx4tb3\/6vK7y5i89N3LnxKe\/cXwCGD9KOmv8KLSKPBhO0\/Jr\/0av\/WWQmts3r4vUhAH+yljN3vdeF62JDz0gXhMfekDExo30cJhNfOgBUZvkBF8Dt3mwBwXWbgfCt62ye+STrNK2nBAEpAS6C1aPmkWpcRHl7VtzjNgGm6ZhUvlFpGRBIkB+xbwKjUwwSK59LyXDCML\/oQ4EhkWwX0nxbtflBSxSMlpqCNc6SZ77ol6UK31fXvl+zzJeTSmD\/cvzuM+CK9P0FWSEnfkSeWZAS0oDyGQxsqhyedBCEHkEyE0RdR6kXwrN8NBjQ+m0CTzvjTXI6edoJVguVlIZg6wFXwzA8Bm2Y8QuSUPRaEk37pCBWsvYSNcZOup8dug0meOYQZLn+nGGMLRtcIcsVAd2fCZd0DsjdkjAvV6Oig9oHFGt8dAIM6nUFRdNzZxyydYo+xpKO0PQFOAL3gZfOw+LxWFWRGiqfdCSKNKqXPhq1Oy4iDkgNszzrlxvQx1nHnFy0D2vjBMnpW1vFzq9Cnxgpz2GScQhkG4C3EWIif9Sf0pAJOsCHWpxJNBLl9jgvj6CHcpRMZZ7UvVZedFzZHo8RTZGHKs0gh4PGdOVAtNsZUyMNsEfjCkD7dYmF3BLqaYxE7x4J72xY\/6N9egQrJSPNIJgWkY4rRfJqQhkcqxCLUcVKTZPjtd1Un0jBN9aaQZiyNj3JLakjRXO6EUvAb2ymoX+K6VbnpkTP3L\/FZlwWBySHJjOI9JHs9fUbPxzvoxZveQiVCHsLX0jNH931JCCzNtVU8TcM3Uh35LSsTfbvK1RmaXeJGVqwo06Uvq9NuUEkvhgVoq\/N\/XAtS+n605aSDiB0UdCuApnVKhteqyML0pXn62qYYPzQuKKTRQoI68x1hFJapcMcseSwGMS9Ob6ayig4liWgdIDc1\/SsSs3Pe7yzQ7HoOJoznBdp2HIScga2yNa\/wLz9k32iMsFvaV7vC+L8hcziVuXOzcxgF3xhKKM8Kt6e0kx21DlfeHKzMUG4R5TB5KIEtaxW6w03gUeErJh0pi5DcXqy\/CpF5gr9s404goe4YEa+6oQS2z9I1DG9ydcE71VHJ+fI8eMxaXDSKN6SIM4ENOWo5m6zy7DqKxcJ4a0bF+TeJCRTVhKRWht80kb73d5XJw\/Kb1jTaDHuTm0uNwomOGcyLuN+6n9eFFA39XBaNmx3ddAR1r9vSyb1T5WkJboHbhqkZholLBAzfNZvooK26pDEAPJWl3Rk3u6rs9XSSuv9y\/7FDsmvTONTBhSw2rLJr7bDtwTrSE26nPhzYwdWsB\/X8yQ7Sq4zrJMQnWgKgbN0DKPBwZp8Toao6XmYel5lMXkGvWqBr0j7Zs0BviBe7+7mvEq4nI1xsFcV4hCyB1cyGLcIDiWyaR5HGvqmC3jK6ukJxoyKQUVWZC7hB8\/4Wohoj6TEo1TdM\/FYWqSIJNhFgLMVq43QAvLQa5ElHsSO8OlGPR9SthWSfcnJtHxYkr\/h75y5l9L84VNa\/X2hggln1u6\/tBTSaXyVNmQDSwEJd9ks7YCHlIR4jj7aqrtTdiTCNnQVwnP1BQSRioHXwMmy7a81mjxFNtYwR1ugCPJWJBOpatUygBOlJCTk+ra0U4PDUfsLgTg0\/hVsbBlr2XeHGOdD8XR1wUNeJepLTskUolzaR5n8HoiQkQmyaboloWWzXzU5HPySU4jVTJD\/G8dm6GyTQiU6qCQ0TaM4xdK8\/vjdTGjOMJfGTTa\/+LrokbuqQeEjdxTD4gb+bEeDjhyTz0gcpQe5MNBR1pKIemoIn5ECDRpWhFMimn8OzwxFsBsNAuAjP\/kdLqXYoVEVuzlTwtw\/7RmZ9Hd5XZRpjU8Y9xiyFqphQ16Sc+TOpUD+rbPEkSwsWW38hul4hpaAY1PBlPZ8hPVe5wWXIIHtKa72X55RTduPUcqjCffuOiIpiZ1SrUR8SXqeQpqpatBq5aZxbMjlSMGciZJJxYs9pWlWNXpdAMXiarmSih0EyTuu6qlczLWs2+P4uKKJz21Qo+DfaljLSTw5KXak+63BezOolknpYNsNJruPs4Z4z7V4ri4aj1geYSaRcO2UfyVhnuPVcZA6Vl7I1HLDDbJme810MFkMgQj7YgvBKBA\/EhozhqsH5ARcOZTk0+fCO9e5hxPp6SzPy2rHpyL511fBYDzGy225csxpz6t21pzkZkcC1KR2ILABycZLzqc17JKUhhR+1ksk9C+xUfi2ceryMezglkMFiiQ5DOj7NeoNu8UuFXXlZIMT6qQPgXSeygvK4dZmctIAtwqxFGk9WgnA2wz0ssevN6y0Gj20st8HzoeHUOO66Qlr+J5IISnCygbhIMgFMK0znflo4cNuk3rfCdW2Md26FVoUjMojvtUncWzKe6GYTrReao3f\/ki+kxJ4RKE8vVaF0LRqUYt8qwIlqagWJKT5Knko3ue9HHlNVtaOSBclVaOhMmacJRDCDWwSyrcVdRo3uUqD8JVQPkfGNgN+9OjFroiQnngKEM+zrlUipHW48ie67LBRTXnnUQDyikihSgmSKZ5mk9mRXGK8mhqgUcWlsvbUeGcnI6JOvpVLCTTBCKOZHTIqWmt4NW06K3flzqCQ1\/5AD1kRTX9QubsR9fuICvD+7X7x47feu3usfrIQ\/aO1UcesnOsjfKAfWP1kYfsGhvP7DUsVzPKgrAM9ehGihEyMu\/XKLH6gLxbktnzTnN8QctAaUMI1L9pvfBdKtARlguViUSxiQAux1X17+ftclrnzUwq6zPe5AibkUzbtho14FobZS5akInwRQUrSrEWjs6RaVRdFMJVFzoMp4UV2Xf4GLhulRFgFmKIxOaMwyapEmcTKfx5TyZPhuqTEHI7Ky2eWn9IdisthiPiXSsiSF7qc7XOtmvOxtactWxV5dutwJdioProltmuWrOB35LmXbpCXVoec499Oyu9GSIE6F2+1H44FTfA6RSneFE02vd+fhyMeqvnKnTrWkLAAhX1AD5\/iMFf6Yk3iNgGfEwWEREufbbWhmfAR\/wjCa8lBw1ZENUnfmqhEId5B9EnYAYf1ynD0dY1\/TLvSGFKQqRW1K9K8WrATuKTU7GFaSkHWTigAkh68pu3OExNna3zZgNTsoqmSaFAukQD2KBaaNRjorEsIVAix9diHlbII22EIcTHUUYZfMz07Fq+3xXHTsApZ5O8lDw8cZp0nyMUP2gryKePsXNwB\/lrTJz8cVlhZe1EB5c1dKVMIrMhgBe380iD2Yl7w\/E3NOAgm6ijrSKF24iwiJ4Ur\/q4MZK0+JTzFfniaQFTnLg1ebsSxEJRM36kjsRCBRdaw0D4HIACVn1z4S09br1B5xNHckiWEG40QsPH2T2pIyblQE1oWJXCdGHZxJy4XMWnhv9b4FHqgTwg0UD3UcLiiNppSrLxvM2Zlui90nVHZ4vLWEvXKCNcY\/2NUPK8I\/83FlJjQglKULJDvsbKIvaS5qgi6snbIwmpgT5uXWo1uQfc8KVES1G1ucS+81OSoCaPWPpCYPPBuF6PCAFPEGrgzUj0kjtUdizUF+NKE0k+7kbM1Mf0baEWinejVT+K1+gVZV6wzlm6zeJ+7CQdWH2jJZN8YzFcqYIZBYsPQ1kWCJJ3kcrSOB9f0GPlAgtbiY7irOnpp1IFNmc0Cg0g1VfX0urmr4v4oDPHQBLXFpVUr1B9IxUSgdN+N3tkxUFjZGEg8u9Cbwuzh4YtvB6z+mchdUFrmihfAaUglggNxrAlnwhhIsdsugtUBkDkRqg\/GpKPjXCGyetOFJPlwUaOEJnwpi3HN4+ekhVvBxEnUE42qwFpda\/5SqGtsHlo0WwxXoRdnEXBiGCFrD9wuoW46m\/vJN3e2X7NaxSB3PVBMZ8VDAsUMdWmKEqBeu8A45f2gHG4ck+zPqloM4xB5ubdJ2Ro1z0g1B5QmWb89rIYNog7E01xIVYCM+F8alMoV+nPG3NY9BIfOR2tmKLEwZRRnB6MRsVROBKRA8Go1TRfy8s8KeERnZuLwmWBz9SmFLaeZvpVMf\/Q4QzeTksgBLIJ9yCJcuLzaE3G9Pk9dqXvvGBnYabsCjQU0Ijq07oqu5obQgV2lgj3YZlfI6xos4qk57W+oFKOHAgOqFpEP40BrAdffH5EZvf56tS389HCvQqV9AcOVhXr1VHL7\/yFMtGvHasKA\/yV3fu9772ugx8fekAXPz70gE6+G+nh3Pz40AM6+skJvl6QylkW0tF0VvqI\/lvAxUTAkBxDUXTtdCc1fq0SZGhvoYELfIR5ASAGoiWnVZHDx+Slga0ATrI5e63StO6KFaWxoocSDxHLPHQSEAOorAxEVvEyEZ+RvYQv6kVr+cIAGiztWdOzPD4PxECNkgfcrVv7axXaOWAgnkVWprMUJalVflvuY0irNK45Azr1C4d0y9JrHRoO81iZsj05+hpMdN6mrpGTrzDjQOYECKA5n07aqvIdOHOIlDF0H9jhlq4K1xAdVKz36zCg5pL\/rYy3aOo8VgHoK9GQrF8EU+KSMUFFDHjge\/Ao0xtmvAditMRabX6DMKLwtM9XQtK+YJ1dKU3bci4DMgAvMTaXvaJqZwLGTFd0ULnYXIyzfPF5NK4kwV7ymhpkmLteQpuy27OSoQSEvKdf07\/WZbDjHrAxUJIu4D4I7kUhVik2aRfS2q\/CaVoERsSIDIs3rnt136JL8iT4fKEEnaSuz4rX4nBr6PDy39T7NzL7cxrwkq26V9x0pUSTgRgMuYfMvsYAIRkq95QMWWAkyToy9xbIHzSGMlwF8bPC4Q\/egcf0aMNo\/ZJFZMnQkWiM6yeBcQ0OSSjKNRz+i6JOdALFNdfyoqEOAA85ZK8pywgcfoRtH2jFsyGiKIXcha8sE7jAwZhpXAgxXK3m0IjvZl5\/rzAVMqdRwjKWZAw3l1wwsR8vf2z3VkoIdLKzSjMwlaBmB2Nertm9tfkK8Wrvkn5ekuWfxwW1Kp5f0bmZr9lpLzQyr3Eyd1C54GhlXX9ac3z5PAoSCx8n0Ruo48CWuJmtIYwWartpyfzWgcRSqzYAyXEeJ7hldKXTpIgSpWrd7ZdqU+jfG+OidpjiXYOTAX8m7uxMjxZdv+QKa1JhG2KHIsJEZcqiCq\/aRhRuRbKy\/UateF9OThTJY+THawVCS\/fAYY1lARgBkpuZiDIZaAYBGraWvWRu7lOFQvt24EmUbllUA1XPcf1AkxAXzLpD4Giw5LDHo52utvdgjSGHAtzakKcLP9A6rON1jnkeGkCEMg4xuTa4jpowwBkALjH1TNQ0R+3DPgoZW5Fd8ekvdgxkrnW9ykqzthMysM8lTls4v6tkQhuOmSyQQZ3RVfOkPwlo2OYZF1eq4AREhhf5E28ViK8X9ypmuYDWO0lKjovRB2hTIh37xJeMw7QJ345bH2bfLptBMT82ksxEAsOBLzqvdcqZTRzlAO1N9lqNEj\/STmPh5qMeQdcA8EHIyBmdVgEpCEkOtxvLKCAnUNa+IofP1ReMPjQkfM6m1CDyohiHCk8ANqaBfg4Yo7Z4WrJU0S4rvSL5YU6VYwgRjY34WNTkqfPPRh0J+3LRWSENuqyMVEavANtlMkikbVKlTtbAGKxhI3AW9iNKprYEOiq0krUUsoYPoDmHsbxDgMpMemLGgWC\/v6nGEjWj0kKeNUcaY7tu1hOaWgTHh7P6oG9PaW2rZGOVwQ2YRtwPy3B39n7St8rV3gD0F8MTcYyWAmIts3DnosSQBtWxyVG4ynoenDfkCNwiBp6t8wqGhzQts8NvIReeOQcsGgksaNM2jAzVhKrQWzEGuDSeELafb4MWINMrlhrrZP6v9DJYgRLdCGuSLahZW2rLdwk+JvWUtOgDiX0pRPJEmthJkJlOwY6US2csOuszzmIEcPA6svRkqUeu4nH2nakjiRuacPadXoJVJ9cCHtTEik47d8Zawijvk501NcmnUlWKs0cHncFwidOK99ykuSyyGBm\/X7z6atsefVPX65aBTpgvU\/Z9FTSbla9Icr1ZF3+6UTMHdF3vjl6fQnR9QsZFsyjJRrl9c\/s6u\/nJDfp8x0lb9g1DEW7e\/O+fZFMQ84\/OaW3yLRcCs\/\/6JOuK190R8LHTjBEyPOk830rShzxr9Bma2GwG5XWT\/n+LhkBfMxH4chiOcn3Ud6GdE1uld4N4vHOir+RpLIt8xn829v4pGSl0lmkDeAqcsfXPt3\/\/wR8+\/P0nmf19jv\/JMizte2GUt27zCMlhrbf0Y\/rOjU9tdHdOuuV7f+k5slogTH7W9755s4VB1ViWsX77pGvwb5vxtJ69wcz5X7Pxk2WhH5X89tlbP6OgfqvV0eDCveMrPqt7Vq96khhdTIw3Z1k9c32aTOCtOzW\/Pf9o\/oe4U7dv3v74Az2wb5vi436anXCFty\/y6TvHzkkZy5psTtVEqXH\/zq9\/XWzrFuqTvVNJ7miN3RBLkWll1WTm7zONs3NkZ4XpZJ89Ofns\/jtH9YTExKLRZiYu5et9NvNeX65nNJeYxnK\/2K7rN7ypKLX86+zjnwvuUNq+e\/\/ea0HO9mc4thn3Uai0hOPP2R8pPPwep8u3lnmf5dfGulPmkmD1Yx+LX23tY43k95\/gzxAXSXudTagQ7bqRvf8+aOGhd74zraKW\/8w7YSiwb7Lqm7D94jsSUs7ePdT99SreQwrGakM+PTFJ0o5s6J+zR5Fk8c5xPOUK29arPCFLvfOL5gonsMBV4z241pFQ87uVa9l6B05myfXS3+MQOlIBf29IzzHOB1vJP2d3EkCHFA2w6ncOhZYUZi+GQp67LvT7XKY9YV85puOLdGJ2zQksVP4PMm0tEzLxl7MXWueBj3KkAUzLFla2lm4PQeUzXrBaSKLFu9Kp92VTP0hL9GjFOU6P6QRTbxWsrwdgfcxaD2T9yjcHVXaFpBBbo\/qIjJMdcHSv4WQS9Zoaafg+KDxWcKuqzYbrLDqLrNsD0oZmxTk5hOz1VYNM82f9ek2Wzd\/6ohWmr9omtWDP5FUPf8uGijV0mA2ZN0H57hlLyHL2VAg3nIEaFxPFpBX7oS9cqbs9Wbq+N7PA3rG8j6ZBH+Mo0MLRzgLPs4CSdP+KGbySGD+eQ4yekUrc0p1KZrC\/gys\/+5XY3ZhZG7X+UWzmiu4HRRvzZr4uFlyr+o10nx0OJGnwKtzYQRNaeTSOUNrpRNF2KVExxPjEuBRFeuSCpCghEMtrr4z+7NqxhNJ9r+pGkfF9cYMxRoTF1p0Y85SqK5vR8ugecug2t0Ifka8Ye7imHWm31nQ1SSAcLEJZpe0Fh1OwdhnTop6C7OeH7ViHRmYK+msSuIcSBBjwpo3BJLEAg4IEO3XND63T+4CSw2ia1VeKgY5aAx2KgqEEaygR48ocDaOimveThsVe5E2ZV53hqL6wTkzZNNSpinzryOqGlSGktn\/5549v37r1ietAiaR2RYO9uBMMZAEmmUWmgNeNqyE47JWJoEvGfidA3QUPlDgwAmm82EdfFqxyJaQk2XaVQ1wykBMEKme2Blu0Vh3YlyIJzWQudscobykgzrDa6MTanom0l0gcgJ6Th02+4eoZq3Z\/57PjzNPXUd6A0xvBJSRF12iSZY1qFDsOnQp8KZ\/io6FQMWmTz\/PKimJkz7c5DhQ2+fIfJBz+3z\/+9\/+UJXRA0\/m6yMlemtbdMmJMH9wGxhRRn9sMcWTR7GKDi8yt+ccBaurqLX2PvtbW63JG9tcHH08\/\/mP4dZPPStKt2Uf8nGCjfSiYzl5IannbhmijAvSEgUQ06hOSdlV3xKQaGuWH\/EuW0UdCuCLj5fiD0ftufGpB4H\/JN9tPNI6iYoq09xdltWrN5Ng7iI\/fMohbH+0ZBL+UC4VbCW4B9lmK8DvvZo\/57CKOFDsP0AHnUoAY6H01BgKBgmyjlxo7a0NeRqzrZ1dl3+gZQBwCer\/H9spW0VEgdU2jjps5+2g2Lz54v2mGgu0QQ084DiZaZ6DFXpBYqLM7uQ1xRoJ6nb85JRnNT42H8Wa61LaZtz78\/fQPN\/XwMA9Q38Jrwe0a6BE39jAQ5\/l5gVK35\/XmhO76+uT2R7c+unX7g5u\/\/\/iPf7z10ccfk21NUuhN9jT\/vm7svvNdzh68phHSg9EY4NYtzWRu\/4kpWiiYBhLyRW\/xrHsIoywQO2q43u1bdkW24OecqY\/jYofLPDzoY1RQz\/wQLzNYdtpkJzTEX3NXFmQat+cbbAjvzElRnby6DSztiMsaT3tmx9AKSwz8\/\/4f+fPXPTqz+rw9ppEu+ykGSmNcFN2RmMuzE\/x59Kbum6Pv6V9V8eZkRwfiqGyP5EsGDfJEfvVTMMAS9QgoBPcb7vyeRc0FOU0WFw8A2Yreqet5pB8cQq7\/ZQ7KOpc5nZcnW4MtTzBahwf\/xmNlefi9ALbHZc1DlwtoAz7RX87LdXHisN3f4AhHOFUOr\/guSb303\/4oz4AuY9v9+ZUfH3FIj13QkwhD\/8b7v4qukGx\/e3JeV+fFtmtP3Gg9rvxf4XZZry9eZ7J4vi\/Oabz6w5M1A57dyVYr2v910ZOdEf7a\/pX5h\/XxstusHQr9mxxoB93+9kcXlbilQzPWNZb7lkS5ExnrmyPIYUYzj3zTrbo6QQ4nC2j75IJ34gTrPeshnclJSH97w5fOH9QVvXpPDr8Zjksj4iWAnR4g\/Q33yJW7spvqF9bfVg\/b\/8a31eoc8IHCmPUHdkmTKTg0\/r+AWiwEXqeh68idPKfFlayOG0NapZ1Zgbv\/Pw==\" \/><\/form> \t<div class=\"pdf24Plugin-cp-link\"> \t\t<a href=\"#\" onclick=\"var pdf24Win = window.open('about:blank', 'pdf24PopWin', 'resizable=yes,scrollbars=yes,width=600,height=250,left='+(screen.width\/2-300)+',top='+(screen.height\/3-125)+''); pdf24Win.focus(); document.pdf24Form0.submit(); if(typeof pdf24OnCreatePDF === 'function'){void(pdf24OnCreatePDF(this,pdf24Win));} return false;\">Diesen Beitrag als PDF herunterladen<\/a> \t<\/div> <\/div>","protected":false},"excerpt":{"rendered":"<p>Durchblick im DevOps-Dschungel: Von Git \u00fcber Docker und Kubernetes bis hin zu Grafana Git verwaltet den Code, Docker verpackt Anwendungen und Grafana zeigt Diagramme \u2013 so weit die Kurzfassung. Aber was bedeutet das eigentlich im Detail? Und wie wird aus dem Programmcode auf einem Entwicklerrechner eine Anwendung, die zuverl\u00e4ssig l\u00e4uft und bei Problemen rechtzeitig auf sich aufmerksam macht? Wer sich mit Softwareentwicklung oder dem Betrieb von IT-Systemen besch\u00e4ftigt, st\u00f6\u00dft schnell auf Namen wie GitHub, Jenkins, Kubernetes oder Prometheus. Vielleicht hast [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4700,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1,1061],"tags":[1416,990,1434,1435,1153,1429,1452,1436,804,1410,803,1447,1461,1432,1424,1460,1149,1411,1412,1150,1445,1421,1456,1442,1427,1448,1414,1446,1444,1413,1455,1428,1420,1430,1454,1431,1451,1422,1459,1439,1438,1458,1433,1440,1441,1453,1425,1423,1457,1426,1443,1449,1450,1437,1049],"class_list":["post-4695","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-software-tools","tag-ansible","tag-ausloeser","tag-branch","tag-branches","tag-ci-cd","tag-ci-cd-pipeline","tag-cluster","tag-commit","tag-container","tag-devops","tag-docker","tag-dockerfile","tag-elastic-stack","tag-elasticsearch","tag-elk-stack","tag-exporter","tag-git","tag-github","tag-github-actions","tag-gitlab","tag-gitlab-ci-yml","tag-grafana","tag-idempotenz","tag-image","tag-infrastructure-as-code","tag-instanz","tag-jenkins","tag-jenkinsfile","tag-job","tag-kubernetes","tag-module","tag-monitoring","tag-packer","tag-pipeline","tag-playbook","tag-playbooks","tag-pod","tag-prometheus","tag-promql","tag-pull","tag-push","tag-quality-gates","tag-repository","tag-request","tag-runner","tag-skalierung","tag-softwarequalitaet","tag-sonarqube","tag-statische-codeanalyse","tag-testautomatisierung","tag-testumgebung","tag-virtuelle-mschine","tag-vm","tag-workflow","tag-yaml"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>DevOps-Tools erkl\u00e4rt: Git, Docker, Grafana, Kubernetes &amp; Co.<\/title>\n<meta name=\"description\" content=\"DevOps-Tools erkl\u00e4rt: Erfahre, wie Git, Docker, Kubernetes, CI\/CD &amp; Monitoring zusammenspielen mit Praxisbeispiel und \u00fcbersichtlicher Tabelle\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.marcelcuvelier.de\/?p=4695\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DevOps-Tools erkl\u00e4rt: Git, Docker, Grafana, Kubernetes &amp; Co.\" \/>\n<meta property=\"og:description\" content=\"DevOps-Tools erkl\u00e4rt: Erfahre, wie Git, Docker, Kubernetes, CI\/CD &amp; Monitoring zusammenspielen mit Praxisbeispiel und \u00fcbersichtlicher Tabelle\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.marcelcuvelier.de\/?p=4695\" \/>\n<meta property=\"og:site_name\" content=\"marcelcuvelier.de\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-04T19:24:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/WP-Beitrag-DevOps.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1731\" \/>\n\t<meta property=\"og:image:height\" content=\"909\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Marcel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marcel\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"40\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695\"},\"author\":{\"name\":\"Marcel\",\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/#\\\/schema\\\/person\\\/746417d9f5f65ec1a72eaac330433844\"},\"headline\":\"Git, Docker, Kubernetes &#038; Co.: Wer macht eigentlich was?\",\"datePublished\":\"2026-10-04T19:24:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695\"},\"wordCount\":7305,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/WP-Beitrag-DevOps.png\",\"keywords\":[\"Ansible\",\"Ausl\u00f6ser\",\"Branch\",\"Branches\",\"CI\\\/CD\",\"CI\\\/CD-Pipeline\",\"cluster\",\"Commit\",\"Container\",\"DevOps\",\"Docker\",\"Dockerfile\",\"Elastic Stack\",\"Elasticsearch\",\"ELK Stack\",\"Exporter\",\"Git\",\"GitHub\",\"GitHub Actions\",\"GitLab\",\"gitlab-ci.yml\",\"Grafana\",\"Idempotenz\",\"Image\",\"Infrastructure as Code\",\"Instanz\",\"Jenkins\",\"Jenkinsfile\",\"job\",\"Kubernetes\",\"Module\",\"Monitoring\",\"Packer\",\"Pipeline\",\"Playbook\",\"Playbooks\",\"pod\",\"Prometheus\",\"PromQL\",\"Pull\",\"Push\",\"Quality-Gates\",\"Repository\",\"Request\",\"Runner\",\"Skalierung\",\"Softwarequalit\u00e4t\",\"SonarQube\",\"statische Codeanalyse\",\"Testautomatisierung\",\"Testumgebung\",\"virtuelle Mschine\",\"VM\",\"workflow\",\"YAML\"],\"articleSection\":{\"1\":\"Software &amp; Tools\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695\",\"url\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695\",\"name\":\"DevOps-Tools erkl\u00e4rt: Git, Docker, Grafana, Kubernetes & Co.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/WP-Beitrag-DevOps.png\",\"datePublished\":\"2026-10-04T19:24:32+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/#\\\/schema\\\/person\\\/746417d9f5f65ec1a72eaac330433844\"},\"description\":\"DevOps-Tools erkl\u00e4rt: Erfahre, wie Git, Docker, Kubernetes, CI\\\/CD & Monitoring zusammenspielen mit Praxisbeispiel und \u00fcbersichtlicher Tabelle\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#primaryimage\",\"url\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/WP-Beitrag-DevOps.png\",\"contentUrl\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/WP-Beitrag-DevOps.png\",\"width\":1731,\"height\":909},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?p=4695#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Start\",\"item\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git, Docker, Kubernetes &#038; Co.: Wer macht eigentlich was?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/#website\",\"url\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/\",\"name\":\"marcelcuvelier.de\",\"description\":\"Nichts \u00e4ndert sich so schnell, wie die Lage.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/#\\\/schema\\\/person\\\/746417d9f5f65ec1a72eaac330433844\",\"name\":\"Marcel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750a58762a8260c6802a7e2a3f7c88d8652f78fc2647729a6f29ec0d771ad15?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750a58762a8260c6802a7e2a3f7c88d8652f78fc2647729a6f29ec0d771ad15?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750a58762a8260c6802a7e2a3f7c88d8652f78fc2647729a6f29ec0d771ad15?s=96&d=mm&r=g\",\"caption\":\"Marcel\"},\"sameAs\":[\"https:\\\/\\\/www.marcelcuvelier.de\"],\"url\":\"https:\\\/\\\/www.marcelcuvelier.de\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DevOps-Tools erkl\u00e4rt: Git, Docker, Grafana, Kubernetes & Co.","description":"DevOps-Tools erkl\u00e4rt: Erfahre, wie Git, Docker, Kubernetes, CI\/CD & Monitoring zusammenspielen mit Praxisbeispiel und \u00fcbersichtlicher Tabelle","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.marcelcuvelier.de\/?p=4695","og_locale":"de_DE","og_type":"article","og_title":"DevOps-Tools erkl\u00e4rt: Git, Docker, Grafana, Kubernetes & Co.","og_description":"DevOps-Tools erkl\u00e4rt: Erfahre, wie Git, Docker, Kubernetes, CI\/CD & Monitoring zusammenspielen mit Praxisbeispiel und \u00fcbersichtlicher Tabelle","og_url":"https:\/\/www.marcelcuvelier.de\/?p=4695","og_site_name":"marcelcuvelier.de","article_published_time":"2026-10-04T19:24:32+00:00","og_image":[{"width":1731,"height":909,"url":"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/WP-Beitrag-DevOps.png","type":"image\/png"}],"author":"Marcel","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Marcel","Gesch\u00e4tzte Lesezeit":"40\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.marcelcuvelier.de\/?p=4695#article","isPartOf":{"@id":"https:\/\/www.marcelcuvelier.de\/?p=4695"},"author":{"name":"Marcel","@id":"https:\/\/www.marcelcuvelier.de\/#\/schema\/person\/746417d9f5f65ec1a72eaac330433844"},"headline":"Git, Docker, Kubernetes &#038; Co.: Wer macht eigentlich was?","datePublished":"2026-10-04T19:24:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.marcelcuvelier.de\/?p=4695"},"wordCount":7305,"commentCount":0,"image":{"@id":"https:\/\/www.marcelcuvelier.de\/?p=4695#primaryimage"},"thumbnailUrl":"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/WP-Beitrag-DevOps.png","keywords":["Ansible","Ausl\u00f6ser","Branch","Branches","CI\/CD","CI\/CD-Pipeline","cluster","Commit","Container","DevOps","Docker","Dockerfile","Elastic Stack","Elasticsearch","ELK Stack","Exporter","Git","GitHub","GitHub Actions","GitLab","gitlab-ci.yml","Grafana","Idempotenz","Image","Infrastructure as Code","Instanz","Jenkins","Jenkinsfile","job","Kubernetes","Module","Monitoring","Packer","Pipeline","Playbook","Playbooks","pod","Prometheus","PromQL","Pull","Push","Quality-Gates","Repository","Request","Runner","Skalierung","Softwarequalit\u00e4t","SonarQube","statische Codeanalyse","Testautomatisierung","Testumgebung","virtuelle Mschine","VM","workflow","YAML"],"articleSection":{"1":"Software &amp; Tools"},"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.marcelcuvelier.de\/?p=4695#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.marcelcuvelier.de\/?p=4695","url":"https:\/\/www.marcelcuvelier.de\/?p=4695","name":"DevOps-Tools erkl\u00e4rt: Git, Docker, Grafana, Kubernetes & Co.","isPartOf":{"@id":"https:\/\/www.marcelcuvelier.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.marcelcuvelier.de\/?p=4695#primaryimage"},"image":{"@id":"https:\/\/www.marcelcuvelier.de\/?p=4695#primaryimage"},"thumbnailUrl":"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/WP-Beitrag-DevOps.png","datePublished":"2026-10-04T19:24:32+00:00","author":{"@id":"https:\/\/www.marcelcuvelier.de\/#\/schema\/person\/746417d9f5f65ec1a72eaac330433844"},"description":"DevOps-Tools erkl\u00e4rt: Erfahre, wie Git, Docker, Kubernetes, CI\/CD & Monitoring zusammenspielen mit Praxisbeispiel und \u00fcbersichtlicher Tabelle","breadcrumb":{"@id":"https:\/\/www.marcelcuvelier.de\/?p=4695#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.marcelcuvelier.de\/?p=4695"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.marcelcuvelier.de\/?p=4695#primaryimage","url":"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/WP-Beitrag-DevOps.png","contentUrl":"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/WP-Beitrag-DevOps.png","width":1731,"height":909},{"@type":"BreadcrumbList","@id":"https:\/\/www.marcelcuvelier.de\/?p=4695#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Start","item":"https:\/\/www.marcelcuvelier.de\/"},{"@type":"ListItem","position":2,"name":"Git, Docker, Kubernetes &#038; Co.: Wer macht eigentlich was?"}]},{"@type":"WebSite","@id":"https:\/\/www.marcelcuvelier.de\/#website","url":"https:\/\/www.marcelcuvelier.de\/","name":"marcelcuvelier.de","description":"Nichts \u00e4ndert sich so schnell, wie die Lage.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.marcelcuvelier.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Person","@id":"https:\/\/www.marcelcuvelier.de\/#\/schema\/person\/746417d9f5f65ec1a72eaac330433844","name":"Marcel","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/f750a58762a8260c6802a7e2a3f7c88d8652f78fc2647729a6f29ec0d771ad15?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f750a58762a8260c6802a7e2a3f7c88d8652f78fc2647729a6f29ec0d771ad15?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f750a58762a8260c6802a7e2a3f7c88d8652f78fc2647729a6f29ec0d771ad15?s=96&d=mm&r=g","caption":"Marcel"},"sameAs":["https:\/\/www.marcelcuvelier.de"],"url":"https:\/\/www.marcelcuvelier.de\/?author=1"}]}},"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/p4qNjn-1dJ","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"https:\/\/www.marcelcuvelier.de\/wp-content\/uploads\/2026\/10\/WP-Beitrag-DevOps.png","_links":{"self":[{"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=\/wp\/v2\/posts\/4695","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4695"}],"version-history":[{"count":20,"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=\/wp\/v2\/posts\/4695\/revisions"}],"predecessor-version":[{"id":4730,"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=\/wp\/v2\/posts\/4695\/revisions\/4730"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=\/wp\/v2\/media\/4700"}],"wp:attachment":[{"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4695"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4695"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marcelcuvelier.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}