[{"data":1,"prerenderedAt":1008},["ShallowReactive",2],{"navigation":3,"\u002Fde\u002Fblog\u002Fwhat-is-kustomize":354,"\u002Fde\u002Fblog\u002Fwhat-is-kustomize-surround":1003},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,263,275,306,347],{"title":5,"path":6,"stem":7},"Moderne Website in 5 Minuten erstellen und deployen","\u002Fde\u002Fblog\u002Fbuild-with-loveable","de\u002F3.blog\u002F1.build-with-loveable",{"title":9,"path":10,"stem":11},"Die souveräne Vercel-Alternative für den Mittelstand: Souveränes Hosting auf Hetzner mit lowcloud","\u002Fde\u002Fblog\u002Fdigital-sovereignty-lowcloud-vs-vercel-b2b","de\u002F3.blog\u002F10.digital-sovereignty-lowcloud-vs-vercel-b2b",{"title":13,"path":14,"stem":15},"Cloud Exit Strategie: Warum Unabhängigkeit kein Notfallplan ist","\u002Fde\u002Fblog\u002Fcloud-exit-strategie","de\u002F3.blog\u002F11.cloud-exit-strategie",{"title":17,"path":18,"stem":19},"Cloud Sovereignty Framework: Wie die EU Cloud-Souveränität endlich messbar macht","\u002Fde\u002Fblog\u002Fcloud-sovereignty-framework","de\u002F3.blog\u002F12.cloud-sovereignty-framework",{"title":21,"path":22,"stem":23},"Cloud Vendor Lock-in vermeiden: Was echte Souveränität technisch bedeutet","\u002Fde\u002Fblog\u002Fcloud-vendor-lock-in","de\u002F3.blog\u002F13.cloud-vendor-lock-in",{"title":25,"path":26,"stem":27},"Digitale Souveränität mit Kubernetes: Wann ist Open Source wirklich souverän?","\u002Fde\u002Fblog\u002Fkubernetes-digital-sovereignty","de\u002F3.blog\u002F14.kubernetes-digital-sovereignty",{"title":29,"path":30,"stem":31},"Was ist DevOps as a Service und wann macht es wirklich Sinn?","\u002Fde\u002Fblog\u002Fdevops-as-a-service","de\u002F3.blog\u002F15.devops-as-a-service",{"title":33,"path":34,"stem":35},"Cloud-Souveränität Governance: Warum das Thema aus der IT-Abteilung ins Führungsteam gehört","\u002Fde\u002Fblog\u002Fcloud-souveraenitaet-governance","de\u002F3.blog\u002F16.cloud-souveraenitaet-governance",{"title":37,"path":38,"stem":39},"PaaS vs. DaaS: Was ist der Unterschied und welches Modell passt zu dir?","\u002Fde\u002Fblog\u002Fpaas-vs-daas","de\u002F3.blog\u002F17.paas-vs-daas",{"title":41,"path":42,"stem":43},"Souveräne Cloud: Kann SaaS wirklich die Kontrolle über eure Daten wahren?","\u002Fde\u002Fblog\u002Fsovereign-cloud-saas-data-control","de\u002F3.blog\u002F18.sovereign-cloud-saas-data-control",{"title":45,"path":46,"stem":47},"DevOps vs. DevOps as a Service – Was passt zu deinem Team?","\u002Fde\u002Fblog\u002Fdevops-vs-devops-as-a-service","de\u002F3.blog\u002F19.devops-vs-devops-as-a-service",{"title":49,"path":50,"stem":51},"Docker Grundlagen: Wie Container-Virtualisierung funktioniert","\u002Fde\u002Fblog\u002Fhow-docker-works","de\u002F3.blog\u002F2.how-docker-works",{"title":53,"path":54,"stem":55},"Die 7 größten DevOps-Probleme in KMU – und wie du sie löst","\u002Fde\u002Fblog\u002Fdevops-problems-smb","de\u002F3.blog\u002F20.devops-problems-smb",{"title":57,"path":58,"stem":59},"PostgreSQL Helm Chart: So deployst du Postgres auf Kubernetes","\u002Fde\u002Fblog\u002Fpostgresql-helm-chart-kubernetes","de\u002F3.blog\u002F21.postgresql-helm-chart-kubernetes",{"title":61,"path":62,"stem":63},"Platform Engineering vs. DevOps – Wo liegt der Unterschied?","\u002Fde\u002Fblog\u002Fplatform-engineering-vs-devops","de\u002F3.blog\u002F22.platform-engineering-vs-devops",{"title":65,"path":66,"stem":67},"Cloud Act vs. DSGVO: Das Risiko für EU-Unternehmen","\u002Fde\u002Fblog\u002Fcloud-act-vs-gdpr","de\u002F3.blog\u002F23.cloud-act-vs-gdpr",{"title":69,"path":70,"stem":71},"IT-Kosten senken durch Automatisierung: Der größte Hebel","\u002Fde\u002Fblog\u002Freduce-it-costs-automation","de\u002F3.blog\u002F24.reduce-it-costs-automation",{"title":73,"path":74,"stem":75},"NIS2 Compliance für DevOps-Teams: Was jetzt zu tun ist","\u002Fde\u002Fblog\u002Fnis2-compliance-devops","de\u002F3.blog\u002F25.nis2-compliance-devops",{"title":77,"path":78,"stem":79},"Self-Hosted EU Alternativen: LibreOffice & Co. hosten","\u002Fde\u002Fblog\u002Fself-hosted-eu-alternatives","de\u002F3.blog\u002F26.self-hosted-eu-alternatives",{"title":81,"path":82,"stem":83},"DORA Compliance für DevOps: Was der EU-Resilienz-Act bedeutet","\u002Fde\u002Fblog\u002Fdora-compliance-devops","de\u002F3.blog\u002F27.dora-compliance-devops",{"title":85,"path":86,"stem":87},"Cloud TCO: Versteckte Kosten, die AWS, Azure & GCP nicht zeigen","\u002Fde\u002Fblog\u002Fcloud-tco-hidden-costs","de\u002F3.blog\u002F28.cloud-tco-hidden-costs",{"title":89,"path":90,"stem":91},"Datenresidenz vs. Datensouveränität: Wo der Unterschied liegt","\u002Fde\u002Fblog\u002Fdata-residency-vs-data-sovereignty","de\u002F3.blog\u002F29.data-residency-vs-data-sovereignty",{"title":93,"path":94,"stem":95},"n8n selbst hosten auf Hetzner: Komplette Docker-Anleitung","\u002Fde\u002Fblog\u002Fself-hosted-n8n-on-hetzner","de\u002F3.blog\u002F3.self-hosted-n8n-on-hetzner",{"title":97,"path":98,"stem":99},"Manuelle Deployments: Unterschätztes Risiko im Mittelstand","\u002Fde\u002Fblog\u002Fmanual-deployment-risks","de\u002F3.blog\u002F30.manual-deployment-risks",{"title":101,"path":102,"stem":103},"DevOps Tool-Chaos: So entsteht und stoppst du Tool-Sprawl","\u002Fde\u002Fblog\u002Fdevops-tool-sprawl","de\u002F3.blog\u002F31.devops-tool-sprawl",{"title":105,"path":106,"stem":107},"Kubernetes Monitoring: Logs und Metriken richtig einsetzen","\u002Fde\u002Fblog\u002Fkubernetes-monitoring-logs-metrics","de\u002F3.blog\u002F32.kubernetes-monitoring-logs-metrics",{"title":109,"path":110,"stem":111},"OB7 Case Study: Website-Deployment ohne Infrastruktur-Aufwand","\u002Fde\u002Fblog\u002Fob7-case-study-lowcloud-deployment","de\u002F3.blog\u002F33.ob7-case-study-lowcloud-deployment",{"title":113,"path":114,"stem":115},"DevOps in KMU: Warum fehlende Rollen zum echten Risiko werden","\u002Fde\u002Fblog\u002Fmissing-devops-roles-smb","de\u002F3.blog\u002F34.missing-devops-roles-smb",{"title":117,"path":118,"stem":119},"Kubernetes Konfiguration vereinfachen: Human-Readable Cloud","\u002Fde\u002Fblog\u002Fsimplify-kubernetes-configuration","de\u002F3.blog\u002F35.simplify-kubernetes-configuration",{"title":121,"path":122,"stem":123},"Collaborative DevOps: Cloud-Apps gemeinsam bauen","\u002Fde\u002Fblog\u002Fcollaborative-devops-teams","de\u002F3.blog\u002F36.collaborative-devops-teams",{"title":125,"path":126,"stem":127},"Wissensdokumentation in DevOps-Teams: Bus-Faktor senken","\u002Fde\u002Fblog\u002Fdevops-knowledge-documentation-bus-factor","de\u002F3.blog\u002F37.devops-knowledge-documentation-bus-factor",{"title":129,"path":130,"stem":131},"Was ist PaaS? Platform as a Service einfach erklärt","\u002Fde\u002Fblog\u002Fwhat-is-paas","de\u002F3.blog\u002F38.what-is-paas",{"title":133,"path":134,"stem":135},"EU AI Act Hosting: Was sich für KI-Workloads ändert","\u002Fde\u002Fblog\u002Feu-ai-act-hosting","de\u002F3.blog\u002F39.eu-ai-act-hosting",{"title":137,"path":138,"stem":139},"Docker Compose Tutorial: Multi-Container-Apps einfach verwalten","\u002Fde\u002Fblog\u002Fdocker-compose-for-beginners","de\u002F3.blog\u002F4.docker-compose-for-beginners",{"title":141,"path":142,"stem":143},"Full-Stack Developer: Was der Begriff wirklich bedeutet","\u002Fde\u002Fblog\u002Ffull-stack-developer-reality","de\u002F3.blog\u002F40.full-stack-developer-reality",{"title":145,"path":146,"stem":147},"Cloud Egress Fees im Vergleich: AWS vs. Azure vs. GCP Preise","\u002Fde\u002Fblog\u002Fcloud-egress-fees","de\u002F3.blog\u002F41.cloud-egress-fees",{"title":149,"path":150,"stem":151},"Bring Your Own Cloud: Was das Modell bedeutet und warum es Fahrt aufnimmt","\u002Fde\u002Fblog\u002Fbring-your-own-cloud","de\u002F3.blog\u002F42.bring-your-own-cloud",{"title":153,"path":154,"stem":155},"Zero-Config Kubernetes: Warum Einfachheit gewinnt","\u002Fde\u002Fblog\u002Fzero-config-kubernetes","de\u002F3.blog\u002F43.zero-config-kubernetes",{"title":157,"path":158,"stem":159},"Minimalistische Cloud-Architektur: Weniger ist stabiler","\u002Fde\u002Fblog\u002Fminimalist-cloud-architecture","de\u002F3.blog\u002F44.minimalist-cloud-architecture",{"title":161,"path":162,"stem":163},"Software Deployment KMU: Schneller und sicherer ausrollen","\u002Fde\u002Fblog\u002Fsmb-software-deployment","de\u002F3.blog\u002F45.smb-software-deployment",{"title":165,"path":166,"stem":167},"EU Data Act: Was Unternehmen und DevOps-Teams wissen müssen","\u002Fde\u002Fblog\u002Feu-data-act-business-devops","de\u002F3.blog\u002F46.eu-data-act-business-devops",{"title":169,"path":170,"stem":171},"Data Governance Act: Was KMU und DevOps-Teams wissen müssen","\u002Fde\u002Fblog\u002Fdata-governance-act-devops-guide","de\u002F3.blog\u002F47.data-governance-act-devops-guide",{"title":173,"path":174,"stem":175},"Cloud agnostisch: Bedeutung und praktische Umsetzung","\u002Fde\u002Fblog\u002Fcloud-agnostic-architecture","de\u002F3.blog\u002F48.cloud-agnostic-architecture",{"title":177,"path":178,"stem":179},"Kubernetes Migration: Was du wissen musst, bevor du anfängst","\u002Fde\u002Fblog\u002Fkubernetes-migration-guide","de\u002F3.blog\u002F49.kubernetes-migration-guide",{"title":181,"path":182,"stem":183},"Docmost selbst hosten mit Docker Compose und Traefik: Komplette Anleitung","\u002Fde\u002Fblog\u002Fself-host-docmost-with-docker-and-traefik","de\u002F3.blog\u002F5.self-host-docmost-with-docker-and-traefik",{"title":185,"path":186,"stem":187},"AI Agenten Infrastruktur: Was du für Produktion brauchst","\u002Fde\u002Fblog\u002Fai-agent-infrastructure","de\u002F3.blog\u002F50.ai-agent-infrastructure",{"title":189,"path":190,"stem":191},"ROI von Managed Services: Warum Eigenbetrieb oft teurer ist","\u002Fde\u002Fblog\u002Fmanaged-services-roi","de\u002F3.blog\u002F51.managed-services-roi",{"title":193,"path":194,"stem":195},"lowcloud vs. DevOps-as-a-Service-Anbieter im Vergleich","\u002Fde\u002Fblog\u002Flowcloud-vs-devops-service-providers","de\u002F3.blog\u002F52.lowcloud-vs-devops-service-providers",{"title":197,"path":198,"stem":199},"Kubernetes vs. Docker Swarm: Unterschiede und warum K8s gewonnen hat","\u002Fde\u002Fblog\u002Fkubernetes-vs-docker-swarm","de\u002F3.blog\u002F53.kubernetes-vs-docker-swarm",{"title":201,"path":202,"stem":203},"Hetzner Kubernetes Hosting mit lowcloud","\u002Fde\u002Fblog\u002Fhetzner-kubernetes-hosting","de\u002F3.blog\u002F54.hetzner-kubernetes-hosting",{"title":205,"path":206,"stem":207},"MinIO Alternativen im Vergleich: RustFS, SeaweedFS und Garage","\u002Fde\u002Fblog\u002Fminio-alternatives","de\u002F3.blog\u002F55.minio-alternatives",{"title":209,"path":210,"stem":211},"Was ist Docker Swarm? Container-Orchestrierung mit Bordmitteln","\u002Fde\u002Fblog\u002Fwhat-is-docker-swarm","de\u002F3.blog\u002F56.what-is-docker-swarm",{"title":213,"path":214,"stem":215},"Was ist ein Helm Chart? Der Paketmanager für Kubernetes","\u002Fde\u002Fblog\u002Fwhat-is-a-helm-chart","de\u002F3.blog\u002F57.what-is-a-helm-chart",{"title":217,"path":218,"stem":219},"Docker vs Kubernetes: Compose, Swarm und K8s im Vergleich","\u002Fde\u002Fblog\u002Fdocker-vs-kubernetes","de\u002F3.blog\u002F58.docker-vs-kubernetes",{"title":221,"path":222,"stem":223},"Was ist Kustomize? Kubernetes-Configs sauber verwalten","\u002Fde\u002Fblog\u002Fwhat-is-kustomize","de\u002F3.blog\u002F59.what-is-kustomize",{"title":225,"path":226,"stem":227},"Was ist Kubernetes? Container-Orchestrierung verständlich erklärt","\u002Fde\u002Fblog\u002Fwhat-is-kubernetes","de\u002F3.blog\u002F6.what-is-kubernetes",{"title":229,"path":230,"stem":231},"Die besten Heroku-Alternativen 2026","\u002Fde\u002Fblog\u002Fheroku-alternatives","de\u002F3.blog\u002F60.heroku-alternatives",{"title":233,"path":234,"stem":235},"Die Cloud-Illusion: Warum ein Serverstandort in Deutschland noch keine digitale Souveränität macht","\u002Fde\u002Fblog\u002Fcloud-illusion-digitale-souveraenitaet","de\u002F3.blog\u002F7.cloud-illusion-digitale-souveraenitaet",{"title":237,"path":238,"stem":239},"S3-kompatibler Objektspeicher: Die besten Anbieter im Vergleich (2026)","\u002Fde\u002Fblog\u002Fs3-compatible-object-storage","de\u002F3.blog\u002F8.s3-compatible-object-storage",{"title":241,"path":242,"stem":243},"Deployment als Bottleneck: Wenn KI schneller coden kann als du deployen kannst","\u002Fde\u002Fblog\u002Fdeployment-bottleneck","de\u002F3.blog\u002F9.deployment-bottleneck",{"title":245,"path":246,"stem":247,"children":248,"icon":262},"Getting Started","\u002Fde\u002Fdocs\u002Fgetting-started","de\u002F1.docs\u002F1.getting-started\u002F1.index",[249,252,257],{"title":250,"path":246,"stem":247,"icon":251},"Einführung","i-lucide-house",{"title":253,"path":254,"stem":255,"icon":256},"Erste Schritte","\u002Fde\u002Fdocs\u002Fgetting-started\u002Fget-started","de\u002F1.docs\u002F1.getting-started\u002F2.get-started","i-lucide-rocket",{"title":258,"path":259,"stem":260,"icon":261},"Funktionsweise","\u002Fde\u002Fdocs\u002Fgetting-started\u002Fhow-it-works","de\u002F1.docs\u002F1.getting-started\u002F3.how-it-works","i-lucide-lightbulb",false,{"title":264,"path":265,"stem":266,"children":267,"icon":262},"Guides","\u002Fde\u002Fdocs\u002Fguides","de\u002F1.docs\u002F2.guides\u002F1.index",[268,270],{"title":264,"path":265,"stem":266,"icon":269},"i-lucide-book-open",{"title":271,"path":272,"stem":273,"icon":274},"Container Registry verbinden","\u002Fde\u002Fdocs\u002Fguides\u002Fcontainer-registries","de\u002F1.docs\u002F2.guides\u002F2.container-registries","i-lucide-container",{"title":276,"path":277,"stem":278,"children":279,"icon":262},"App Services","\u002Fde\u002Fdocs\u002Fapp-services","de\u002F1.docs\u002F3.app-services\u002F1.index",[280,281,286,291,296,301],{"title":276,"path":277,"stem":278,"icon":256},{"title":282,"path":283,"stem":284,"icon":285},"Build Settings","\u002Fde\u002Fdocs\u002Fapp-services\u002Fbuild-settings","de\u002F1.docs\u002F3.app-services\u002F2.build-settings","i-lucide-settings",{"title":287,"path":288,"stem":289,"icon":290},"Env Variables","\u002Fde\u002Fdocs\u002Fapp-services\u002Fenvironment-variables","de\u002F1.docs\u002F3.app-services\u002F3.environment-variables","i-lucide-key",{"title":292,"path":293,"stem":294,"icon":295},"Custom Domains","\u002Fde\u002Fdocs\u002Fapp-services\u002Fcustom-domains","de\u002F1.docs\u002F3.app-services\u002F4.custom-domains","i-lucide-globe",{"title":297,"path":298,"stem":299,"icon":300},"Health Checks","\u002Fde\u002Fdocs\u002Fapp-services\u002Fhealth-checks","de\u002F1.docs\u002F3.app-services\u002F5.health-checks","i-lucide-heart-pulse",{"title":302,"path":303,"stem":304,"icon":305},"Autoscaling","\u002Fde\u002Fdocs\u002Fapp-services\u002Fautoscaling","de\u002F1.docs\u002F3.app-services\u002F6.autoscaling","i-lucide-scaling",{"title":307,"path":308,"stem":309,"children":310,"icon":262},"Helm Releases","\u002Fde\u002Fdocs\u002Fhelm-releases","de\u002F1.docs\u002F4.helm-releases\u002F1.index",[311,313,318,323,327,332,337,342],{"title":307,"path":308,"stem":309,"icon":312},"i-lucide-package",{"title":314,"path":315,"stem":316,"icon":317},"PostgreSQL deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-postgresql","de\u002F1.docs\u002F4.helm-releases\u002F2.deploy-postgresql","i-lucide-database",{"title":319,"path":320,"stem":321,"icon":322},"Redis deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-redis","de\u002F1.docs\u002F4.helm-releases\u002F3.deploy-redis","i-lucide-zap",{"title":324,"path":325,"stem":326,"icon":322},"Valkey deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-valkey","de\u002F1.docs\u002F4.helm-releases\u002F3.deploy-valkey",{"title":328,"path":329,"stem":330,"icon":331},"n8n deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-n8n","de\u002F1.docs\u002F4.helm-releases\u002F4.deploy-n8n","i-lucide-workflow",{"title":333,"path":334,"stem":335,"icon":336},"RustFS deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-rustfs","de\u002F1.docs\u002F4.helm-releases\u002F5.deploy-rustfs","i-lucide-hard-drive",{"title":338,"path":339,"stem":340,"icon":341},"OpenSearch deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-opensearch","de\u002F1.docs\u002F4.helm-releases\u002F6.deploy-opensearch","i-lucide-search",{"title":343,"path":344,"stem":345,"icon":346},"Keycloak deployen","\u002Fde\u002Fdocs\u002Fhelm-releases\u002Fdeploy-keycloak","de\u002F1.docs\u002F4.helm-releases\u002F7.deploy-keycloak","i-lucide-shield-check",{"title":348,"path":349,"stem":350,"children":351,"icon":262},"Glossar","\u002Fde\u002Fdocs\u002Fglossary","de\u002F1.docs\u002F5.glossary\u002F1.index",[352],{"title":348,"path":349,"stem":350,"icon":353},"i-lucide-book-a",{"id":355,"title":221,"authors":356,"badge":362,"body":363,"date":995,"description":996,"extension":997,"image":998,"lastUpdated":362,"meta":1000,"navigation":470,"path":222,"published":470,"seo":1001,"stem":223,"tags":362,"__hash__":1002},"posts_de\u002Fde\u002F3.blog\u002F59.what-is-kustomize.md",[357],{"name":358,"to":359,"avatar":360},"Thomas Ens","\u002Fabout\u002Fthomasens",{"src":361},"\u002Fimages\u002Fblog\u002Fauthors\u002Fthomas.jpeg",null,{"type":364,"value":365,"toc":982},"minimark",[366,382,387,390,393,397,405,416,421,428,538,541,545,548,556,566,607,610,614,617,620,678,693,705,709,712,769,776,782,786,797,818,829,836,877,881,884,890,893,900,904,907,910,952,955,962,965,969,972,975,978],[367,368,369,370,374,375,381],"p",{},"Wer mehrere Umgebungen in ",[371,372,373],"a",{"href":226},"Kubernetes"," betreibt, kennt das Problem: Dieselben Manifeste leicht angepasst für Dev, Staging und Prod und irgendwann stimmt irgendetwas nicht mehr. ",[371,376,380],{"href":377,"rel":378},"https:\u002F\u002Fkustomize.io\u002F",[379],"nofollow","Kustomize"," löst genau dieses Problem, ohne auf eine Template-Sprache zurückzugreifen. Das Ergebnis sind YAML-Dateien, die immer valides Kubernetes-YAML bleiben und sich trotzdem flexibel anpassen lassen.",[383,384,386],"h2",{"id":385},"das-problem-mit-copy-paste-konfigurationen","Das Problem mit Copy-Paste-Konfigurationen",[367,388,389],{},"Ein typisches Kubernetes-Projekt beginnt harmlos: ein Deployment, ein Service, vielleicht ein Ingress. Dann kommt die zweite Umgebung, und man kopiert die Dateien und ändert ein paar Werte. Dann die dritte. Irgendwann hat man sechs Verzeichnisse mit 90 % identischem Inhalt und keine vernünftige Möglichkeit mehr, eine Änderung konsistent durchzuziehen.",[367,391,392],{},"Das ist kein seltenes Edge-Case-Szenario, das ist der Normalzustand in wachsenden Teams, die schnell deployments aufgebaut haben ohne bewusste Struktur. Kustomize setzt genau dort an: Statt Dateien zu duplizieren, beschreibt man Unterschiede relativ zu einer Basis.",[383,394,396],{"id":395},"was-ist-kustomize-und-wie-funktioniert-es","Was ist Kustomize und wie funktioniert es",[367,398,399,400,404],{},"Kustomize ist ein Open-Source-Tool zur deklarativen Verwaltung von Kubernetes-Konfigurationen. Es wurde von Google entwickelt und ist seit Kubernetes 1.14 direkt in ",[401,402,403],"code",{},"kubectl"," integriert. Das Kernprinzip: Es gibt eine Base, also eine Grundkonfiguration, und Overlays, die diese Basis für unterschiedliche Kontexte anpassen.",[367,406,407,408,411,412,415],{},"Wichtig: Kustomize verwendet keine Template-Sprache. Alle Dateien bleiben zu jedem Zeitpunkt gültiges Kubernetes-YAML – kein  ",[401,409,410],{},".Values.image"," , keine Logik, keine Schleifen. Das macht die ",[371,413,414],{"href":118},"Kubernetes-Konfiguration deutlich lesbarer"," und reduziert die kognitive Last beim Reviewen von Änderungen.",[417,418,420],"h3",{"id":419},"die-kustomizationyaml-das-herzstück","Die kustomization.yaml – das Herzstück",[367,422,423,424,427],{},"Jede Kustomize-Struktur dreht sich um die Datei ",[401,425,426],{},"kustomization.yaml",". Sie beschreibt, welche Ressourcen zusammengeführt werden sollen und welche Modifikationen anzuwenden sind:",[429,430,435],"pre",{"className":431,"code":432,"language":433,"meta":434,"style":434},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","apiVersion: kustomize.config.k8s.io\u002Fv1beta1\nkind: Kustomization\n\nresources:\n  - deployment.yaml\n  - service.yaml\n\nnamePrefix: dev-\n\ncommonLabels:\n  environment: development\n","yaml","",[401,436,437,454,465,472,481,490,498,503,514,519,527],{"__ignoreMap":434},[438,439,442,446,450],"span",{"class":440,"line":441},"line",1,[438,443,445],{"class":444},"swJcz","apiVersion",[438,447,449],{"class":448},"sMK4o",":",[438,451,453],{"class":452},"sfazB"," kustomize.config.k8s.io\u002Fv1beta1\n",[438,455,457,460,462],{"class":440,"line":456},2,[438,458,459],{"class":444},"kind",[438,461,449],{"class":448},[438,463,464],{"class":452}," Kustomization\n",[438,466,468],{"class":440,"line":467},3,[438,469,471],{"emptyLinePlaceholder":470},true,"\n",[438,473,475,478],{"class":440,"line":474},4,[438,476,477],{"class":444},"resources",[438,479,480],{"class":448},":\n",[438,482,484,487],{"class":440,"line":483},5,[438,485,486],{"class":448},"  -",[438,488,489],{"class":452}," deployment.yaml\n",[438,491,493,495],{"class":440,"line":492},6,[438,494,486],{"class":448},[438,496,497],{"class":452}," service.yaml\n",[438,499,501],{"class":440,"line":500},7,[438,502,471],{"emptyLinePlaceholder":470},[438,504,506,509,511],{"class":440,"line":505},8,[438,507,508],{"class":444},"namePrefix",[438,510,449],{"class":448},[438,512,513],{"class":452}," dev-\n",[438,515,517],{"class":440,"line":516},9,[438,518,471],{"emptyLinePlaceholder":470},[438,520,522,525],{"class":440,"line":521},10,[438,523,524],{"class":444},"commonLabels",[438,526,480],{"class":448},[438,528,530,533,535],{"class":440,"line":529},11,[438,531,532],{"class":444},"  environment",[438,534,449],{"class":448},[438,536,537],{"class":452}," development\n",[367,539,540],{},"Diese Datei ist der einzige Ort, an dem Kustomize \"weiß\", was mit den Ressourcen passieren soll. Alle anderen Dateien bleiben unverändert.",[417,542,544],{"id":543},"bases-und-overlays-in-der-praxis","Bases und Overlays in der Praxis",[367,546,547],{},"Die typische Verzeichnisstruktur sieht so aus:",[429,549,554],{"className":550,"code":552,"language":553},[551],"language-text","k8s\u002F\n├── base\u002F\n│   ├── deployment.yaml\n│   ├── service.yaml\n│   └── kustomization.yaml\n└── overlays\u002F\n    ├── dev\u002F\n    │   └── kustomization.yaml\n    ├── staging\u002F\n    │   └── kustomization.yaml\n    └── prod\u002F\n        ├── kustomization.yaml\n        └── replica-patch.yaml\n","text",[401,555,552],{"__ignoreMap":434},[367,557,558,559,561,562,565],{},"Die ",[401,560,426],{}," im ",[401,563,564],{},"prod","-Overlay referenziert die Base und fügt einen Patch hinzu:",[429,567,569],{"className":431,"code":568,"language":433,"meta":434,"style":434},"resources:\n  - ..\u002F..\u002Fbase\n\npatches:\n  - path: replica-patch.yaml\n",[401,570,571,577,584,588,595],{"__ignoreMap":434},[438,572,573,575],{"class":440,"line":441},[438,574,477],{"class":444},[438,576,480],{"class":448},[438,578,579,581],{"class":440,"line":456},[438,580,486],{"class":448},[438,582,583],{"class":452}," ..\u002F..\u002Fbase\n",[438,585,586],{"class":440,"line":467},[438,587,471],{"emptyLinePlaceholder":470},[438,589,590,593],{"class":440,"line":474},[438,591,592],{"class":444},"patches",[438,594,480],{"class":448},[438,596,597,599,602,604],{"class":440,"line":483},[438,598,486],{"class":448},[438,600,601],{"class":444}," path",[438,603,449],{"class":448},[438,605,606],{"class":452}," replica-patch.yaml\n",[367,608,609],{},"Der Patch selbst ist wieder valides YAML und überschreibt nur die Felder, die sich in Produktion unterscheiden, zum Beispiel die Anzahl der Replicas.",[383,611,613],{"id":612},"patches-und-transformationen","Patches und Transformationen",[367,615,616],{},"Kustomize unterstützt zwei Arten von Patches, die sich für unterschiedliche Anwendungsfälle eignen.",[367,618,619],{},"Strategic Merge Patch funktioniert so, als würde man ein YAML-Fragment über das Original legen. Man gibt nur die Felder an, die sich ändern sollen, und der Rest bleibt erhalten:",[429,621,623],{"className":431,"code":622,"language":433,"meta":434,"style":434},"apiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: my-app\nspec:\n  replicas: 3\n",[401,624,625,634,643,650,660,667],{"__ignoreMap":434},[438,626,627,629,631],{"class":440,"line":441},[438,628,445],{"class":444},[438,630,449],{"class":448},[438,632,633],{"class":452}," apps\u002Fv1\n",[438,635,636,638,640],{"class":440,"line":456},[438,637,459],{"class":444},[438,639,449],{"class":448},[438,641,642],{"class":452}," Deployment\n",[438,644,645,648],{"class":440,"line":467},[438,646,647],{"class":444},"metadata",[438,649,480],{"class":448},[438,651,652,655,657],{"class":440,"line":474},[438,653,654],{"class":444},"  name",[438,656,449],{"class":448},[438,658,659],{"class":452}," my-app\n",[438,661,662,665],{"class":440,"line":483},[438,663,664],{"class":444},"spec",[438,666,480],{"class":448},[438,668,669,672,674],{"class":440,"line":492},[438,670,671],{"class":444},"  replicas",[438,673,449],{"class":448},[438,675,677],{"class":676},"sbssI"," 3\n",[367,679,680,681,684,685,688,689,692],{},"JSON Patch ist präziser und erlaubt gezielte Operationen wie ",[401,682,683],{},"add",", ",[401,686,687],{},"remove"," oder ",[401,690,691],{},"replace"," auf einzelne Felder über JSONPath-Syntax. Für die meisten Anwendungsfälle reicht der Strategic Merge Patch, JSON Patch ist dann sinnvoll, wenn man z. B. ein einzelnes Element aus einer Liste entfernen oder an einer bestimmten Position einfügen muss.",[367,694,695,696,684,698,701,702,704],{},"Zusätzlich bietet Kustomize Transformationen wie ",[401,697,508],{},[401,699,700],{},"nameSuffix"," und ",[401,703,524],{},", die global auf alle Ressourcen angewendet werden. Das ist besonders nützlich, um Ressourcen in verschiedenen Overlays eindeutig zu benennen und Verwechslungen zu vermeiden.",[383,706,708],{"id":707},"configmap-und-secret-generatoren","ConfigMap- und Secret-Generatoren",[367,710,711],{},"Ein häufiges Problem in Kubernetes-Projekten: ConfigMaps und Secrets werden manuell aktualisiert, aber Pods bekommen das nicht mit und laufen weiter mit den alten Werten, bis zum nächsten Restart. Kustomize löst das mit Generatoren.",[429,713,715],{"className":431,"code":714,"language":433,"meta":434,"style":434},"configMapGenerator:\n  - name: app-config\n    files:\n      - config\u002Fapp.properties\n    options:\n      disableNameSuffixHash: false\n",[401,716,717,724,736,743,751,758],{"__ignoreMap":434},[438,718,719,722],{"class":440,"line":441},[438,720,721],{"class":444},"configMapGenerator",[438,723,480],{"class":448},[438,725,726,728,731,733],{"class":440,"line":456},[438,727,486],{"class":448},[438,729,730],{"class":444}," name",[438,732,449],{"class":448},[438,734,735],{"class":452}," app-config\n",[438,737,738,741],{"class":440,"line":467},[438,739,740],{"class":444},"    files",[438,742,480],{"class":448},[438,744,745,748],{"class":440,"line":474},[438,746,747],{"class":448},"      -",[438,749,750],{"class":452}," config\u002Fapp.properties\n",[438,752,753,756],{"class":440,"line":483},[438,754,755],{"class":444},"    options",[438,757,480],{"class":448},[438,759,760,763,765],{"class":440,"line":492},[438,761,762],{"class":444},"      disableNameSuffixHash",[438,764,449],{"class":448},[438,766,768],{"class":767},"sfNiH"," false\n",[367,770,771,772,775],{},"Kustomize berechnet einen Hash aus dem Inhalt der referenzierten Dateien und hängt ihn an den Namen der ConfigMap. Ändert sich der Inhalt, ändert sich der Name – und Kubernetes rollt den Deployment automatisch neu aus. Wer das Verhalten nicht möchte, kann es mit ",[401,773,774],{},"disableNameSuffixHash: true"," abschalten.",[367,777,778,779,781],{},"Für Secrets funktioniert das Prinzip identisch, mit dem Unterschied, dass die Werte base64-kodiert werden. Sensible Daten sollten dabei natürlich nicht direkt in der ",[401,780,426],{}," liegen, sondern über externe Secret-Management-Lösungen eingespielt werden. Kustomize ist dafür kein Ersatz.",[383,783,785],{"id":784},"kubectl-kustomize-direkt-integriert","kubectl kustomize – direkt integriert",[367,787,788,789,792,793,796],{},"Seit Kubernetes 1.14 ist Kustomize ohne separate Installation verwendbar. Statt ",[401,790,791],{},"kustomize build"," und manuelles Pipen in ",[401,794,795],{},"kubectl apply"," reicht ein einzelner Befehl:",[429,798,802],{"className":799,"code":800,"language":801,"meta":434,"style":434},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","kubectl apply -k overlays\u002Fprod\u002F\n","bash",[401,803,804],{"__ignoreMap":434},[438,805,806,809,812,815],{"class":440,"line":441},[438,807,403],{"class":808},"sBMFI",[438,810,811],{"class":452}," apply",[438,813,814],{"class":452}," -k",[438,816,817],{"class":452}," overlays\u002Fprod\u002F\n",[367,819,820,821,824,825,828],{},"Das ",[401,822,823],{},"-k"," Flag weist kubectl an, das Verzeichnis als Kustomize-Struktur zu interpretieren. Wer die generierten Manifeste vor dem Apply inspizieren möchte, kann sie mit ",[401,826,827],{},"kubectl kustomize overlays\u002Fprod\u002F"," auf stdout ausgeben lassen.",[367,830,831,832,835],{},"Die direkt in kubectl integrierte Version hinkt allerdings leicht hinter dem separaten ",[401,833,834],{},"kustomize","-Binary hinterher. Wer aktuelle Features oder Bug-Fixes benötigt, installiert Kustomize am besten separat:",[429,837,839],{"className":799,"code":838,"language":801,"meta":434,"style":434},"# Mit brew (macOS\u002FLinux)\nbrew install kustomize\n\n# Oder direkt via Go\ngo install sigs.k8s.io\u002Fkustomize\u002Fkustomize\u002Fv5@latest\n",[401,840,841,847,858,862,867],{"__ignoreMap":434},[438,842,843],{"class":440,"line":441},[438,844,846],{"class":845},"sHwdD","# Mit brew (macOS\u002FLinux)\n",[438,848,849,852,855],{"class":440,"line":456},[438,850,851],{"class":808},"brew",[438,853,854],{"class":452}," install",[438,856,857],{"class":452}," kustomize\n",[438,859,860],{"class":440,"line":467},[438,861,471],{"emptyLinePlaceholder":470},[438,863,864],{"class":440,"line":474},[438,865,866],{"class":845},"# Oder direkt via Go\n",[438,868,869,872,874],{"class":440,"line":483},[438,870,871],{"class":808},"go",[438,873,854],{"class":452},[438,875,876],{"class":452}," sigs.k8s.io\u002Fkustomize\u002Fkustomize\u002Fv5@latest\n",[383,878,880],{"id":879},"kustomize-vs-helm-wann-welches-tool","Kustomize vs. Helm. Wann welches Tool?",[367,882,883],{},"Das ist eine der Fragen, die in Kubernetes-Teams regelmäßig aufkommt und die keine universelle Antwort hat.",[367,885,886,889],{},[371,887,888],{"href":214},"Helm"," ist ein vollständiger Paketmanager mit Template-Engine. Es erlaubt Logik in Konfigurationen, verwaltet Release-History und unterstützt Rollbacks. Helm ist die richtige Wahl, wenn man Pakete verteilt, also fertige, wiederverwendbare Applikations-Charts, die von anderen Teams oder Organisationen installiert werden sollen.",[367,891,892],{},"Kustomize ist kein Paketmanager, sondern ein Konfigurationsüberlagerer. Es ist die bessere Wahl, wenn man eigene Deployments in verschiedene Umgebungen bringen möchte, ohne Template-Logik zu brauchen. Die Konfiguration bleibt einfacher, die Dateien bleiben lesbar, und es gibt keine zusätzliche Abstraktionsebene.",[367,894,895,896,899],{},"In der Praxis schließen sich beide nicht aus. Ein verbreitetes Muster ist, Helm für das initiale Rendering von Charts zu verwenden (",[401,897,898],{},"helm template",") und die generierten Manifeste dann via Kustomize zu überlagern. Das kombiniert die Paketierungsfähigkeiten von Helm mit der Einfachheit von Kustomize für umgebungsspezifische Anpassungen.",[383,901,903],{"id":902},"kustomize-in-gitops-workflows","Kustomize in GitOps-Workflows",[367,905,906],{},"Kustomize und GitOps passen gut zusammen, weil beide auf dem Prinzip \"Git als einzige Quelle der Wahrheit\" aufbauen. Tools wie ArgoCD und Flux haben native Kustomize-Unterstützung eingebaut.",[367,908,909],{},"Bei ArgoCD reicht es, in der Application-Ressource das Overlay-Verzeichnis anzugeben:",[429,911,913],{"className":431,"code":912,"language":433,"meta":434,"style":434},"source:\n  repoURL: https:\u002F\u002Fgithub.com\u002Fexample\u002Fk8s-config\n  targetRevision: HEAD\n  path: overlays\u002Fprod\n",[401,914,915,922,932,942],{"__ignoreMap":434},[438,916,917,920],{"class":440,"line":441},[438,918,919],{"class":444},"source",[438,921,480],{"class":448},[438,923,924,927,929],{"class":440,"line":456},[438,925,926],{"class":444},"  repoURL",[438,928,449],{"class":448},[438,930,931],{"class":452}," https:\u002F\u002Fgithub.com\u002Fexample\u002Fk8s-config\n",[438,933,934,937,939],{"class":440,"line":467},[438,935,936],{"class":444},"  targetRevision",[438,938,449],{"class":448},[438,940,941],{"class":452}," HEAD\n",[438,943,944,947,949],{"class":440,"line":474},[438,945,946],{"class":444},"  path",[438,948,449],{"class":448},[438,950,951],{"class":452}," overlays\u002Fprod\n",[367,953,954],{},"ArgoCD erkennt automatisch, dass es sich um eine Kustomize-Struktur handelt, und rendert die Manifeste entsprechend. Änderungen an der Base oder einem Overlay triggern einen Sync-Vorgang – der Cluster hält sich immer an den Stand im Repository.",[367,956,957,958,961],{},"Flux funktioniert ähnlich über die ",[401,959,960],{},"Kustomization","-CRD, die auf ein Verzeichnis im Repository zeigt und regelmäßig oder event-gesteuert synchronisiert wird.",[367,963,964],{},"Das Ergebnis ist ein nachvollziehbarer, auditierter Deploymentprozess: Jede Konfigurationsänderung ist ein Git-Commit mit Autor, Zeitstempel und Diff.",[383,966,968],{"id":967},"fazit","Fazit",[367,970,971],{},"Kustomize ist eine pragmatische Antwort auf ein sehr reales Kubernetes-Problem: gleiche Ressourcen, aber unterschiedliche Umgebungen. Statt Copy-Paste-YAML oder komplexer Template-Logik bekommst du mit Base + Overlays eine saubere, gut reviewbare Struktur und bleibst dabei vollständig in validem Kubernetes-YAML.",[367,973,974],{},"Wenn du eigene Workloads betreibst und vor allem Varianten managen willst (Dev\u002FStaging\u002FProd, Kunden-\u002FTenant-spezifische Anpassungen, Feature-Toggles über Patches), ist Kustomize oft die einfachste und robusteste Wahl. Helm bleibt stark, wenn du paketieren, verteilen und Releases managen willst, in vielen Teams funktionieren beide Tools sogar kombiniert.",[367,976,977],{},"Unterm Strich: Kustomize reduziert Reibung, minimiert Fehlerquellen und macht GitOps-Workflows deutlich angenehmer, gerade dann, wenn deine Infrastruktur wächst und du trotzdem Kontrolle behalten willst.",[979,980,981],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}",{"title":434,"searchDepth":456,"depth":456,"links":983},[984,985,989,990,991,992,993,994],{"id":385,"depth":456,"text":386},{"id":395,"depth":456,"text":396,"children":986},[987,988],{"id":419,"depth":467,"text":420},{"id":543,"depth":467,"text":544},{"id":612,"depth":456,"text":613},{"id":707,"depth":456,"text":708},{"id":784,"depth":456,"text":785},{"id":879,"depth":456,"text":880},{"id":902,"depth":456,"text":903},{"id":967,"depth":456,"text":968},"2026-04-10","Kustomize verwaltet Kubernetes-Konfigurationen über Bases und Overlays – ohne Templates. So bleiben YAML-Dateien lesbar, valide und flexibel anpassbar.","md",{"src":999},"\u002Fimages\u002Fblog\u002Fwhat-is-kustomize.jpg",{},{"title":221,"description":996},"Iio6kJf7Q71RtOAZDWqUHvWhCAk6y6T3T0MEQ_HU-to",[1004,1006],{"title":217,"path":218,"stem":219,"description":1005,"children":-1},"Docker, Docker Compose, Docker Swarm und Kubernetes im direkten Vergleich: Welches Tool passt zu welchem Problem und wann lohnt sich der Umstieg?",{"title":225,"path":226,"stem":227,"description":1007,"children":-1},"Was ist Kubernetes? Container-Orchestrierung verständlich erklärt: Architektur, Pods, Services, Auto-Scaling und wann sich K8s für Ihr Projekt wirklich lohnt.",1776079527772]