[{"data":1,"prerenderedAt":694},["ShallowReactive",2],{"navigation":3,"\u002Fde\u002Fblog\u002Fsimplify-kubernetes-configuration":4,"\u002Fde\u002Fblog\u002Fsimplify-kubernetes-configuration-surround":683},[],{"id":5,"title":6,"authors":7,"badge":13,"body":14,"date":671,"description":672,"extension":673,"image":674,"lastUpdated":676,"meta":677,"navigation":678,"path":679,"published":678,"seo":680,"stem":681,"tags":13,"__hash__":682},"posts_de\u002Fde\u002F3.blog\u002F35.simplify-kubernetes-configuration.md","Kubernetes Konfiguration vereinfachen: Human-Readable Cloud",[8],{"name":9,"to":10,"avatar":11},"Thomas Ens","\u002Fabout\u002Fthomasens",{"src":12},"\u002Fimages\u002Fblog\u002Fauthors\u002Fthomas.jpeg",null,{"type":15,"value":16,"toc":654},"minimark",[17,27,32,35,38,43,88,91,95,98,109,112,116,119,123,141,152,252,255,259,267,270,274,277,283,449,452,456,464,467,474,478,481,507,510,514,517,523,529,535,541,547,552,563,567,575,583,586,612,615,619,631,642,650],[18,19,20,21,26],"p",{},"Wer schon mal einen ",[22,23,25],"a",{"href":24},"\u002Fde\u002Fblog\u002Fwhat-is-kubernetes","Kubernetes","-Deployment-Fehler in einer 300-Zeilen-YAML-Datei debuggt hat, weiß: Das Problem ist nicht Kubernetes selbst, sondern wie wir damit sprechen. Ein falscher Einzug, ein fehlender Bindestrich, ein Label, das irgendwo nicht übereinstimmt und der Pod startet nicht. Die Lücke zwischen dem, was eine Plattform kann, und dem, was ein Entwickler versteht, ist kein unabänderliches Schicksal. Es ist ein lösbares Engineering-Problem.",[28,29,31],"h2",{"id":30},"warum-yaml-das-problem-ist-und-nicht-kubernetes","Warum YAML das Problem ist und nicht Kubernetes",[18,33,34],{},"YAML hat sich als Konfigurationsformat in Kubernetes durchgesetzt, weil es für Menschen lesbarer ist als JSON. Das stimmt für kleine Dateien. Bei echter Kubernetes-Infrastruktur endet diese Lesbarkeit schnell.",[18,36,37],{},"Das grundlegende Problem: YAML ist ein Serialisierungsformat, kein Konfigurationssprache. Es hat keine Typen, keine Kommentarformate für Validierungen, keine eingebauten Abstraktionen. Alles, was über flache Schlüssel-Wert-Paare hinausgeht, wird unhandlich. Kubernetes macht es nicht besser: Die API ist historisch gewachsen, unterschiedliche Ressourcentypen haben inkonsistente Strukturen, und der gleiche logische Wunsch: „starte diese Anwendung mit drei Instanzen\", erfordert je nach Kontext unterschiedliche Felder und Verschachtelungsebenen.",[39,40,42],"h3",{"id":41},"die-häufigsten-yaml-fehlerklassen-in-kubernetes","Die häufigsten YAML-Fehlerklassen in Kubernetes",[44,45,46,59,73,79],"ul",{},[47,48,49,53,54,58],"li",{},[50,51,52],"strong",{},"Einrückungsfehler"," sind unsichtbar und führen zu Syntaxfehlern, die erst beim ",[55,56,57],"code",{},"kubectl apply"," auffallen",[47,60,61,64,65,68,69,72],{},[50,62,63],{},"Typfehler",": ",[55,66,67],{},"\"true\""," (String) vs. ",[55,70,71],{},"true"," (Boolean) – in YAML beide valide, in Kubernetes aber unterschiedlich interpretiert",[47,74,75,78],{},[50,76,77],{},"Copy-Paste-Fehler"," bei Namespaces, Labels oder Selector-Definitionen, die sich still durchschleichen",[47,80,81,64,84,87],{},[50,82,83],{},"Veraltete API-Versionen",[55,85,86],{},"apps\u002Fv1beta1"," ist längst deprecated, taucht aber in vielen Guides noch auf",[18,89,90],{},"Keiner dieser Fehler ist auf menschliches Versagen zurückzuführen. Sie sind strukturelle Konsequenzen eines Formats, das für diesen Anwendungsfall nicht gebaut wurde.",[28,92,94],{"id":93},"was-human-readable-konkret-bedeutet","Was „Human-Readable\" konkret bedeutet",[18,96,97],{},"„Human-Readable\" ist kein Marketingbegriff für „weniger YAML\". Es ist eine Design-Eigenschaft: Eine Konfiguration ist human-readable, wenn jemand, der die Domäne versteht (also Kubernetes, Cloud-Deployments, Microservices), die Absicht hinter einer Konfiguration auf Anhieb lesen und überprüfen kann, ohne erst das Schema nachzuschlagen.",[18,99,100,101,104,105,108],{},"Das bedeutet nicht, dass Konfiguration einfach oder kurz sein muss. Eine CRD, die einen ",[55,102,103],{},"PostgresCluster"," mit einem Feld ",[55,106,107],{},"replicas: 3"," beschreibt, ist human-readable, auch wenn darunter ein Operator steckt, der dutzende YAML-Ressourcen generiert. Der Entwickler sieht, was er will; das System weiß, wie es das umsetzt.",[18,110,111],{},"Human-readable Konfiguration ist also vor allem domänennah, sie spricht die Sprache des Problems, nicht die Sprache der Implementierung.",[28,113,115],{"id":114},"kubernetes-konfiguration-vereinfachen-die-wichtigsten-ansätze","Kubernetes Konfiguration vereinfachen. Die wichtigsten Ansätze",[18,117,118],{},"Es gibt keine universelle Antwort, aber es gibt ein Spektrum bewährter Ansätze.",[39,120,122],{"id":121},"helm-templating-mit-tücken","Helm – Templating mit Tücken",[18,124,125,131,132,135,136,140],{},[22,126,130],{"href":127,"rel":128},"https:\u002F\u002Fhelm.sh\u002Fde\u002F",[129],"nofollow","Helm"," ist der am weitesten verbreitete Package-Manager für Kubernetes. Charts erlauben es, parametrisierbare YAML-Templates zu schreiben, die mit ",[55,133,134],{},"values.yaml"," gesteuert werden. Ein konkretes Beispiel zeigt unser Guide zu ",[22,137,139],{"href":138},"\u002Fde\u002Fblog\u002Fpostgresql-helm-chart-kubernetes","PostgreSQL Helm Charts auf Kubernetes",". Für die Wiederverwendbarkeit von Deployment-Definitionen ist Helm gut geeignet.",[18,142,143,144,147,148,151],{},"Das Problem: Helm-Templates sind Go-Templates mit YAML-Inhalten. Sobald die Logik komplexer wird – Bedingungen, Schleifen, verschachtelte Werte – werden die Templates selbst unlesbar. Wer schon mal ",[55,145,146],{},"- if .Values.ingress.enabled","  mit drei Einrückungsebenen und einem ",[55,149,150],{},"- end","  irgendwo unten debuggt hat, weiß was gemeint ist.",[153,154,159],"pre",{"className":155,"code":156,"language":157,"meta":158,"style":158},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Beispiel: Ein typisches Helm-Template-Fragment\n- if .Values.autoscaling.enabled\napiVersion: autoscaling\u002Fv2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name:  include \"myapp.fullname\" .\nspec:\n  minReplicas:  .Values.autoscaling.minReplicas\n- end\n","yaml","",[55,160,161,170,181,194,205,214,225,233,244],{"__ignoreMap":158},[162,163,166],"span",{"class":164,"line":165},"line",1,[162,167,169],{"class":168},"sHwdD","# Beispiel: Ein typisches Helm-Template-Fragment\n",[162,171,173,177],{"class":164,"line":172},2,[162,174,176],{"class":175},"sMK4o","-",[162,178,180],{"class":179},"sfazB"," if .Values.autoscaling.enabled\n",[162,182,184,188,191],{"class":164,"line":183},3,[162,185,187],{"class":186},"swJcz","apiVersion",[162,189,190],{"class":175},":",[162,192,193],{"class":179}," autoscaling\u002Fv2\n",[162,195,197,200,202],{"class":164,"line":196},4,[162,198,199],{"class":186},"kind",[162,201,190],{"class":175},[162,203,204],{"class":179}," HorizontalPodAutoscaler\n",[162,206,208,211],{"class":164,"line":207},5,[162,209,210],{"class":186},"metadata",[162,212,213],{"class":175},":\n",[162,215,217,220,222],{"class":164,"line":216},6,[162,218,219],{"class":186},"  name",[162,221,190],{"class":175},[162,223,224],{"class":179},"  include \"myapp.fullname\" .\n",[162,226,228,231],{"class":164,"line":227},7,[162,229,230],{"class":186},"spec",[162,232,213],{"class":175},[162,234,236,239,241],{"class":164,"line":235},8,[162,237,238],{"class":186},"  minReplicas",[162,240,190],{"class":175},[162,242,243],{"class":179},"  .Values.autoscaling.minReplicas\n",[162,245,247,249],{"class":164,"line":246},9,[162,248,176],{"class":175},[162,250,251],{"class":179}," end\n",[18,253,254],{},"Helm löst das Verteilungsproblem, nicht das Lesarkeitsproblem.",[39,256,258],{"id":257},"kustomize-overlays-statt-templates","Kustomize – Overlays statt Templates",[18,260,261,266],{},[22,262,265],{"href":263,"rel":264},"https:\u002F\u002Fkustomize.io\u002F",[129],"Kustomize"," geht einen anderen Weg: kein Templating, sondern strukturierte Patches. Eine Basis-Konfiguration wird durch Overlays für verschiedene Umgebungen (dev, staging, prod) angepasst. Der Vorteil: die Basis bleibt valides YAML, Overlays sind chirurgische Eingriffe.",[18,268,269],{},"Kustomize funktioniert gut für überschaubare Umgebungsvariationen, stößt aber an Grenzen, wenn Konfigurationen komplexer werden oder wenn die Unterschiede zwischen Umgebungen groß sind.",[39,271,273],{"id":272},"crds-und-operators-domänenspezifische-apis","CRDs und Operators – domänenspezifische APIs",[18,275,276],{},"Custom Resource Definitions (CRDs) sind das mächtigste Mittel zur lesbaren Konfiguration. Sie erlauben es, eigene Kubernetes-Ressourcentypen zu definieren – und damit eine eigene, domänenspezifische API.",[18,278,279,280,282],{},"Ein Operator, der auf eine ",[55,281,103],{},"-Ressource reagiert, kann daraus alle notwendigen Deployments, Services, PersistentVolumeClaims und ConfigMaps generieren. Der Entwickler schreibt:",[153,284,286],{"className":155,"code":285,"language":157,"meta":158,"style":158},"apiVersion: postgres-operator.crunchydata.com\u002Fv1beta1\nkind: PostgresCluster\nmetadata:\n  name: my-database\nspec:\n  instances:\n    - replicas: 3\n  backups:\n    pgbackrest:\n      repos:\n        - name: repo1\n          volume:\n            volumeClaimSpec:\n              accessModes: [\"ReadWriteOnce\"]\n              resources:\n                requests:\n                  storage: 10Gi\n",[55,287,288,297,306,312,321,327,334,348,355,362,370,384,392,400,422,430,438],{"__ignoreMap":158},[162,289,290,292,294],{"class":164,"line":165},[162,291,187],{"class":186},[162,293,190],{"class":175},[162,295,296],{"class":179}," postgres-operator.crunchydata.com\u002Fv1beta1\n",[162,298,299,301,303],{"class":164,"line":172},[162,300,199],{"class":186},[162,302,190],{"class":175},[162,304,305],{"class":179}," PostgresCluster\n",[162,307,308,310],{"class":164,"line":183},[162,309,210],{"class":186},[162,311,213],{"class":175},[162,313,314,316,318],{"class":164,"line":196},[162,315,219],{"class":186},[162,317,190],{"class":175},[162,319,320],{"class":179}," my-database\n",[162,322,323,325],{"class":164,"line":207},[162,324,230],{"class":186},[162,326,213],{"class":175},[162,328,329,332],{"class":164,"line":216},[162,330,331],{"class":186},"  instances",[162,333,213],{"class":175},[162,335,336,339,342,344],{"class":164,"line":227},[162,337,338],{"class":175},"    -",[162,340,341],{"class":186}," replicas",[162,343,190],{"class":175},[162,345,347],{"class":346},"sbssI"," 3\n",[162,349,350,353],{"class":164,"line":235},[162,351,352],{"class":186},"  backups",[162,354,213],{"class":175},[162,356,357,360],{"class":164,"line":246},[162,358,359],{"class":186},"    pgbackrest",[162,361,213],{"class":175},[162,363,365,368],{"class":164,"line":364},10,[162,366,367],{"class":186},"      repos",[162,369,213],{"class":175},[162,371,373,376,379,381],{"class":164,"line":372},11,[162,374,375],{"class":175},"        -",[162,377,378],{"class":186}," name",[162,380,190],{"class":175},[162,382,383],{"class":179}," repo1\n",[162,385,387,390],{"class":164,"line":386},12,[162,388,389],{"class":186},"          volume",[162,391,213],{"class":175},[162,393,395,398],{"class":164,"line":394},13,[162,396,397],{"class":186},"            volumeClaimSpec",[162,399,213],{"class":175},[162,401,403,406,408,411,414,417,419],{"class":164,"line":402},14,[162,404,405],{"class":186},"              accessModes",[162,407,190],{"class":175},[162,409,410],{"class":175}," [",[162,412,413],{"class":175},"\"",[162,415,416],{"class":179},"ReadWriteOnce",[162,418,413],{"class":175},[162,420,421],{"class":175},"]\n",[162,423,425,428],{"class":164,"line":424},15,[162,426,427],{"class":186},"              resources",[162,429,213],{"class":175},[162,431,433,436],{"class":164,"line":432},16,[162,434,435],{"class":186},"                requests",[162,437,213],{"class":175},[162,439,441,444,446],{"class":164,"line":440},17,[162,442,443],{"class":186},"                  storage",[162,445,190],{"class":175},[162,447,448],{"class":179}," 10Gi\n",[18,450,451],{},"Das ist noch nicht perfekt lesbar, aber es beschreibt, was gewünscht ist nicht, wie es technisch umgesetzt wird. Der Operator übernimmt den Rest. Dieses Muster ist die Grundlage für echte Abstraktionen in Kubernetes.",[28,453,455],{"id":454},"platform-engineering-als-antwort","Platform Engineering als Antwort",[18,457,458,459,463],{},"Einzelne Tools lösen einzelne Probleme. ",[22,460,462],{"href":461},"\u002Fde\u002Fblog\u002Fplatform-engineering-vs-devops","Platform Engineering"," als Disziplin löst das übergeordnete Problem: Wie baut man eine interne Developer Platform, die Entwicklern ermöglicht, Cloud-Ressourcen zu nutzen, ohne Kubernetes-Experten zu sein?",[18,465,466],{},"Die Antwort liegt in Abstraktionsschichten. Die Platform Engineering-Teams definieren die Abstraktionen, welche Ressourcentypen existieren, welche Parameter Entwickler setzen dürfen, was standardmäßig konfiguriert ist. Die Entwicklungsteams arbeiten gegen diese Abstraktionen, nicht gegen raw Kubernetes-YAML.",[18,468,469,470,473],{},"Tools wie Crossplane gehen dabei besonders weit: Mit Composite Resources lassen sich cloud-unabhängige Abstraktionen definieren, die unter der Haube AWS, GCP oder Azure-Ressourcen provisionieren. Ein Entwickler beschreibt einen ",[55,471,472],{},"AppDatabase",", der Composite Resource Controller kümmert sich um Provider-spezifische Details.",[39,475,477],{"id":476},"was-eine-gute-abstraktion-ausmacht","Was eine gute Abstraktion ausmacht",[18,479,480],{},"Eine Abstraktion ist gut, wenn sie:",[44,482,483,489,495,501],{},[47,484,485,488],{},[50,486,487],{},"das richtige Level"," trifft – weder zu niedrig (dann ist es nur eine dünne Schicht über YAML) noch zu hoch (dann fehlen notwendige Konfigurationsmöglichkeiten)",[47,490,491,494],{},[50,492,493],{},"stabile Defaults"," hat, die für den häufigsten Use Case passen",[47,496,497,500],{},[50,498,499],{},"Escape Hatches"," bietet, wenn Standard-Defaults nicht ausreichen",[47,502,503,506],{},[50,504,505],{},"intern konsistent"," ist – gleiche Konzepte werden gleich ausgedrückt",[18,508,509],{},"Eine Abstraktion ist schlecht, wenn sie eine neue Komplexität einführt, die größer ist als die, die sie löst. Viele interne Platform-Projekte scheitern genau daran: Sie verstecken YAML hinter einer proprietären DSL, die niemand kennt und für die es keine Tooling-Unterstützung gibt.",[28,511,513],{"id":512},"kubernetes-konfiguration-vereinfachen-in-der-praxis-ein-realistischer-weg","Kubernetes Konfiguration vereinfachen in der Praxis. Ein realistischer Weg",[18,515,516],{},"Der Wechsel von raw YAML zu einer lesbaren Konfiguration passiert nicht über Nacht. Ein sinnvoller Weg:",[18,518,519,522],{},[50,520,521],{},"1. Inventar aufnehmen:"," Welche Kubernetes-Ressourcen werden aktuell manuell gepflegt? Wo entstehen die meisten Fehler? Welche Teile werden am häufigsten kopiert und angepasst?",[18,524,525,528],{},[50,526,527],{},"2. Kandidaten identifizieren:"," Ressourcen, die sich oft wiederholen und immer gleich strukturiert sind (Deployments für Microservices, ähnliche Database-Setups), sind gute Kandidaten für Abstraktion.",[18,530,531,534],{},[50,532,533],{},"3. Werkzeug wählen:"," Für Paket-Wiederverwendung: Helm. Für Umgebungsvariationen auf Basis stabiler Manifeste: Kustomize. Für echte domänenspezifische APIs: CRDs mit Operator oder Crossplane. Für eine vollständige interne Platform: Backstage als Frontend, Crossplane oder eigene Operators als Backend.",[18,536,537,540],{},[50,538,539],{},"4. Klein anfangen:"," Eine Abstraktion für ein klar abgegrenztes Problem (z.B. „wie deployen wir einen Microservice\") ist wertvoller als ein halbfertiges Platform-Framework. Iterieren ist einfacher, wenn die Basis funktioniert.",[18,542,543,546],{},[50,544,545],{},"5. Developer Feedback einbauen:"," Die Zielgruppe sind Entwickler, die täglich mit der Platform arbeiten. Ihr Feedback darüber, was sie versteht, was sie verwirrt und was ihnen fehlt, ist wichtiger als technische Eleganz.",[18,548,549],{},[50,550,551],{},"Fallstricke:",[44,553,554,557,560],{},[47,555,556],{},"Abstraktionen, die intern YAML generieren, das niemand mehr debuggen kann",[47,558,559],{},"Platform-Teams, die keine Kapazität haben, die Platform zu warten – und so ein neues Legacy-System schaffen",[47,561,562],{},"Zu frühe Generalisierung: Abstraktionen für Probleme, die noch nicht verstanden sind, werden falsch gebaut",[28,564,566],{"id":565},"wie-lowcloud-sich-positioniert-und-teams-konkret-entlastet","Wie lowcloud sich positioniert und Teams konkret entlastet",[18,568,569,570,574],{},"Viele Teams spüren das Problem, bevor sie es benennen können: Kubernetes ist mächtig, aber die ",[571,572,573],"em",{},"Bedienoberfläche"," (Manifeste, Tool-Kombis, Expertenwissen) skaliert schlecht mit Teamgröße und Alltagstrubel. Genau hier positioniert sich lowcloud: als \"digitaler DevOps\" bzw. als plattformorientierte Alternative zur klassischen \"Baut euch eure eigene Internal Developer Platform\"-Strategie.",[18,576,577,578,582],{},"lowcloud richtet sich dabei an Teams, die Kubernetes nutzen wollen (oder müssen), aber nicht die Zeit\u002FPersonen haben, dauerhaft eine Plattform zu bauen, zu betreiben und zu härten. Als ",[22,579,581],{"href":580},"\u002Fde\u002Fblog\u002Fdevops-as-a-service","DevOps-as-a-Service-Plattform"," übernimmt lowcloud genau diese Aufgaben.",[18,584,585],{},"Was das in der Praxis bedeutet:",[44,587,588,594,600,606],{},[47,589,590,593],{},[50,591,592],{},"Weniger Entscheidungs- und Tool-Chaos:"," Statt einer wachsenden Sammlung aus Helm-Charts, Kustomize-Overlays, CI-Skripten und \"so machen wir das hier\"-Wiki-Seiten gibt es einen konsistenten Pfad.",[47,595,596,599],{},[50,597,598],{},"Standardisierung ohne Lock-in-Gefühl:"," Die Plattform liefert Standards (Security, Updates, Observability, Deployments) – und lässt gleichzeitig Raum für Sonderfälle, wenn sie fachlich nötig sind.",[47,601,602,605],{},[50,603,604],{},"Geschwindigkeit im Delivery-Funnel:"," Teams kommen schneller von \"läuft lokal\" zu \"läuft stabil in der Cloud\", ohne dass jede Änderung zum Kubernetes-Debugging-Workshop wird.",[47,607,608,611],{},[50,609,610],{},"Betrieb als Produkt statt Projekt:"," Platform Engineering wird oft zum Dauerprojekt. lowcloud macht daraus ein Produkt: Standards, Guardrails und Betriebserfahrung sind eingebaut und werden laufend gepflegt.",[18,613,614],{},"Damit unterstützt lowcloud genau die Migration, die im Abschnitt oben beschrieben ist: erst Ordnung in Wiederholungen bringen, dann Abstraktionen einführen – nur eben ohne, dass jedes Team diese Plattformarbeit selbst erfinden und langfristig mittragen muss.",[28,616,618],{"id":617},"fazit","Fazit",[18,620,621,625,626,630],{},[22,622,624],{"href":623},"\u002Fde\u002Fblog\u002Fzero-config-kubernetes","Kubernetes Konfiguration vereinfachen"," ist kein One-Size-Fits-All-Problem. Es ist eine Reihe von Entscheidungen darüber, welche Komplexität man versteckt, welche man sichtbar lässt und wie man dafür sorgt, dass das Ergebnis wartbar bleibt. Wer das Thema grundsätzlicher angehen will, findet in unserem Artikel zu ",[22,627,629],{"href":628},"\u002Fde\u002Fblog\u002Fminimalist-cloud-architecture","minimalistischer Cloud-Architektur"," eine breitere Perspektive.",[18,632,633,634,637,638,641],{},"Der gemeinsame Nenner der erfolgreichen Ansätze: Sie trennen ",[571,635,636],{},"was"," von ",[571,639,640],{},"wie",". Entwickler beschreiben, was sie wollen. Plattformen und Operator übernehmen das Wie. Das ist keine neue Idee – es ist das Grundprinzip jeder guten Abstraktion. In Kubernetes braucht es nur etwas mehr Aufwand, weil die Default-Schnittstelle nun mal YAML ist.",[18,643,644,645,649],{},"Wer diesen Weg für sein Team beschreiten will, ohne von Null anfangen zu müssen: ",[22,646,648],{"href":647},"\u002Fde\u002Fdocs\u002Fgetting-started\u002Fhow-it-works","lowcloud baut genau auf diesem Prinzip auf",". Die Plattform stellt eine managed Kubernetes-Umgebung bereit, in der Entwickler über strukturierte, lesbare Schnittstellen arbeiten – ohne täglich mit Cluster-Konfiguration konfrontiert zu sein.",[651,652,653],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":158,"searchDepth":172,"depth":172,"links":655},[656,659,660,665,668,669,670],{"id":30,"depth":172,"text":31,"children":657},[658],{"id":41,"depth":183,"text":42},{"id":93,"depth":172,"text":94},{"id":114,"depth":172,"text":115,"children":661},[662,663,664],{"id":121,"depth":183,"text":122},{"id":257,"depth":183,"text":258},{"id":272,"depth":183,"text":273},{"id":454,"depth":172,"text":455,"children":666},[667],{"id":476,"depth":183,"text":477},{"id":512,"depth":172,"text":513},{"id":565,"depth":172,"text":566},{"id":617,"depth":172,"text":618},"2026-03-22","YAML ist das eigentliche Problem, nicht Kubernetes. Wie Helm, Kustomize, CRDs und Platform Engineering Cluster-Konfiguration lesbar und wartbar machen.","md",{"src":675},"\u002Fimages\u002Fblog\u002Fsimplify-kubernetes-configuration.jpg","2026-03-30",{},true,"\u002Fde\u002Fblog\u002Fsimplify-kubernetes-configuration",{"title":6,"description":672},"de\u002F3.blog\u002F35.simplify-kubernetes-configuration","_aSQcLdif00vPv-vnD8rgLBnkZv3nBzeqU-xx2o4J7Q",[684,689],{"title":685,"path":686,"stem":687,"description":688,"children":-1},"DevOps in KMU: Warum fehlende Rollen zum echten Risiko werden","\u002Fde\u002Fblog\u002Fmissing-devops-roles-smb","de\u002F3.blog\u002F34.missing-devops-roles-smb","KMU ohne dedizierte DevOps-Rolle riskieren Ausfälle, Wissensverlust und technische Schulden. Erfahre, warum das passiert und welche Ansätze helfen.",{"title":690,"path":691,"stem":692,"description":693,"children":-1},"Collaborative DevOps: Cloud-Apps gemeinsam bauen","\u002Fde\u002Fblog\u002Fcollaborative-devops-teams","de\u002F3.blog\u002F36.collaborative-devops-teams","Wie geteilte Verantwortung, GitOps und Platform Engineering dafür sorgen, dass Entwicklung und Betrieb nicht mehr getrennte Welten sind.",1775388346274]