[{"data":1,"prerenderedAt":1536},["ShallowReactive",2],{"navigation":3,"\u002Fde\u002Fblog\u002Fwhat-is-a-helm-chart":354,"\u002Fde\u002Fblog\u002Fwhat-is-a-helm-chart-surround":1531},[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":213,"authors":356,"badge":362,"body":363,"date":1522,"description":1523,"extension":1524,"image":1525,"lastUpdated":1527,"meta":1528,"navigation":544,"path":214,"published":544,"seo":1529,"stem":215,"tags":362,"__hash__":1530},"posts_de\u002Fde\u002F3.blog\u002F57.what-is-a-helm-chart.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":1508},"minimark",[366,375,378,383,392,395,398,402,405,416,421,424,510,518,522,525,622,625,629,632,784,799,803,806,809,873,876,979,990,997,1001,1004,1192,1195,1199,1212,1215,1256,1263,1267,1270,1284,1287,1293,1359,1366,1370,1373,1379,1382,1385,1401,1408,1412,1419,1476,1483,1486,1489,1496,1504],[367,368,369,370,374],"p",{},"Wer ",[371,372,373],"a",{"href":226},"Kubernetes"," ernsthaft betreibt, kennt das Problem: Eine Applikation besteht aus einem Deployment, einem Service, einer ConfigMap, vielleicht einem HorizontalPodAutoscaler und einem Ingress. Macht fünf YAML-Dateien, pro Umgebung. Und schon hat man ein Verwaltungsproblem. Helm Charts sind die Standardantwort auf diese Komplexität. Sie bündeln alle Kubernetes-Ressourcen einer Anwendung in ein versioniertes, konfigurierbares Paket.",[367,376,377],{},"Dieser Artikel erklärt, wie Helm Charts aufgebaut sind, wie das Templating funktioniert und wann du sie sinnvoll einsetzen kannst.",[379,380,382],"h2",{"id":381},"was-ist-helm-und-was-ist-ein-chart","Was ist Helm und was ist ein Chart?",[367,384,385,391],{},[371,386,390],{"href":387,"rel":388},"https:\u002F\u002Fhelm.sh\u002Fde\u002F",[389],"nofollow","Helm"," ist der Paketmanager für Kubernetes. Wenn du dir apt für Debian, Homebrew für macOS oder npm für Node.js vorstellst, bist du konzeptionell nah dran. Helm installiert, aktualisiert und deinstalliert Anwendungen auf einem Kubernetes-Cluster und hält dabei den Zustand der Installationen im Blick.",[367,393,394],{},"Ein Helm Chart ist das Paketformat, das Helm verwendet. Es ist im Kern eine Sammlung von Dateien in einer definierten Verzeichnisstruktur, die zusammen beschreiben, was auf dem Cluster deployt werden soll, parametrisiert über eine zentrale Konfigurationsdatei.",[367,396,397],{},"Der entscheidende Vorteil gegenüber rohem YAML: Statt für jede Umgebung eigene Kopien zu pflegen, definierst du einmal die Struktur und passt per Werte-Datei oder CLI-Parameter an, was sich unterscheidet.",[379,399,401],{"id":400},"aufbau-eines-helm-charts","Aufbau eines Helm Charts",[367,403,404],{},"Ein frisch erstellter Chart sieht so aus:",[406,407,412],"pre",{"className":408,"code":410,"language":411},[409],"language-text","my-app\u002F\n├── Chart.yaml\n├── values.yaml\n├── charts\u002F\n└── templates\u002F\n    ├── deployment.yaml\n    ├── service.yaml\n    ├── _helpers.tpl\n    └── NOTES.txt\n","text",[413,414,410],"code",{"__ignoreMap":415},"",[417,418,420],"h3",{"id":419},"chartyaml","Chart.yaml",[367,422,423],{},"Diese Datei enthält die Metadaten des Charts:",[406,425,429],{"className":426,"code":427,"language":428,"meta":415,"style":415},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","apiVersion: v2\nname: my-app\ndescription: A Helm chart for my application\ntype: application\nversion: 0.1.0\nappVersion: \"1.2.3\"\n","yaml",[413,430,431,448,459,470,481,493],{"__ignoreMap":415},[432,433,436,440,444],"span",{"class":434,"line":435},"line",1,[432,437,439],{"class":438},"swJcz","apiVersion",[432,441,443],{"class":442},"sMK4o",":",[432,445,447],{"class":446},"sfazB"," v2\n",[432,449,451,454,456],{"class":434,"line":450},2,[432,452,453],{"class":438},"name",[432,455,443],{"class":442},[432,457,458],{"class":446}," my-app\n",[432,460,462,465,467],{"class":434,"line":461},3,[432,463,464],{"class":438},"description",[432,466,443],{"class":442},[432,468,469],{"class":446}," A Helm chart for my application\n",[432,471,473,476,478],{"class":434,"line":472},4,[432,474,475],{"class":438},"type",[432,477,443],{"class":442},[432,479,480],{"class":446}," application\n",[432,482,484,487,489],{"class":434,"line":483},5,[432,485,486],{"class":438},"version",[432,488,443],{"class":442},[432,490,492],{"class":491},"sbssI"," 0.1.0\n",[432,494,496,499,501,504,507],{"class":434,"line":495},6,[432,497,498],{"class":438},"appVersion",[432,500,443],{"class":442},[432,502,503],{"class":442}," \"",[432,505,506],{"class":446},"1.2.3",[432,508,509],{"class":442},"\"\n",[367,511,512,514,515,517],{},[413,513,486],{}," ist die Version des Charts selbst – also des Pakets. ",[413,516,498],{}," beschreibt die Version der Anwendung, die deployt wird. Beide sind unabhängig voneinander und sollten getrennt versioniert werden.",[417,519,521],{"id":520},"valuesyaml","values.yaml",[367,523,524],{},"Hier liegen die Standardwerte für alle konfigurierbaren Parameter:",[406,526,528],{"className":426,"code":527,"language":428,"meta":415,"style":415},"replicaCount: 2\n\nimage:\n  repository: my-registry\u002Fmy-app\n  tag: \"1.2.3\"\n  pullPolicy: IfNotPresent\n\nservice:\n  type: ClusterIP\n  port: 80\n",[413,529,530,540,546,554,564,577,587,592,600,611],{"__ignoreMap":415},[432,531,532,535,537],{"class":434,"line":435},[432,533,534],{"class":438},"replicaCount",[432,536,443],{"class":442},[432,538,539],{"class":491}," 2\n",[432,541,542],{"class":434,"line":450},[432,543,545],{"emptyLinePlaceholder":544},true,"\n",[432,547,548,551],{"class":434,"line":461},[432,549,550],{"class":438},"image",[432,552,553],{"class":442},":\n",[432,555,556,559,561],{"class":434,"line":472},[432,557,558],{"class":438},"  repository",[432,560,443],{"class":442},[432,562,563],{"class":446}," my-registry\u002Fmy-app\n",[432,565,566,569,571,573,575],{"class":434,"line":483},[432,567,568],{"class":438},"  tag",[432,570,443],{"class":442},[432,572,503],{"class":442},[432,574,506],{"class":446},[432,576,509],{"class":442},[432,578,579,582,584],{"class":434,"line":495},[432,580,581],{"class":438},"  pullPolicy",[432,583,443],{"class":442},[432,585,586],{"class":446}," IfNotPresent\n",[432,588,590],{"class":434,"line":589},7,[432,591,545],{"emptyLinePlaceholder":544},[432,593,595,598],{"class":434,"line":594},8,[432,596,597],{"class":438},"service",[432,599,553],{"class":442},[432,601,603,606,608],{"class":434,"line":602},9,[432,604,605],{"class":438},"  type",[432,607,443],{"class":442},[432,609,610],{"class":446}," ClusterIP\n",[432,612,614,617,619],{"class":434,"line":613},10,[432,615,616],{"class":438},"  port",[432,618,443],{"class":442},[432,620,621],{"class":491}," 80\n",[367,623,624],{},"Diese Werte sind der Kontrollpunkt für alles, was sich zwischen Umgebungen unterscheidet. Wer für Produktion andere Replikazahlen oder ein anderes Image-Tag braucht, überschreibt nur diese Datei, die Templates bleiben unverändert.",[417,626,628],{"id":627},"das-templates-verzeichnis","Das templates\u002F-Verzeichnis",[367,630,631],{},"Hier liegen die eigentlichen Kubernetes-Manifeste, allerdings mit Platzhaltern statt fester Werte:",[406,633,635],{"className":426,"code":634,"language":428,"meta":415,"style":415},"apiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n      {{- include \"my-app.selectorLabels\" . | nindent 6 }}\n  template:\n    spec:\n      containers:\n        - name: {{ .Chart.Name }}\n          image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n",[413,636,637,646,656,663,679,686,700,707,714,728,735,743,751,769],{"__ignoreMap":415},[432,638,639,641,643],{"class":434,"line":435},[432,640,439],{"class":438},[432,642,443],{"class":442},[432,644,645],{"class":446}," apps\u002Fv1\n",[432,647,648,651,653],{"class":434,"line":450},[432,649,650],{"class":438},"kind",[432,652,443],{"class":442},[432,654,655],{"class":446}," Deployment\n",[432,657,658,661],{"class":434,"line":461},[432,659,660],{"class":438},"metadata",[432,662,553],{"class":442},[432,664,665,668,670,673,676],{"class":434,"line":472},[432,666,667],{"class":438},"  name",[432,669,443],{"class":442},[432,671,672],{"class":442}," {{",[432,674,675],{"class":446}," include \"my-app.fullname\" .",[432,677,678],{"class":442}," }}\n",[432,680,681,684],{"class":434,"line":483},[432,682,683],{"class":438},"spec",[432,685,553],{"class":442},[432,687,688,691,693,695,698],{"class":434,"line":495},[432,689,690],{"class":438},"  replicas",[432,692,443],{"class":442},[432,694,672],{"class":442},[432,696,697],{"class":446}," .Values.replicaCount",[432,699,678],{"class":442},[432,701,702,705],{"class":434,"line":589},[432,703,704],{"class":438},"  selector",[432,706,553],{"class":442},[432,708,709,712],{"class":434,"line":594},[432,710,711],{"class":438},"    matchLabels",[432,713,553],{"class":442},[432,715,716,719,723,726],{"class":434,"line":602},[432,717,718],{"class":442},"      {{",[432,720,722],{"class":721},"sTEyZ","- ",[432,724,725],{"class":446},"include \"my-app.selectorLabels\" . | nindent 6",[432,727,678],{"class":442},[432,729,730,733],{"class":434,"line":613},[432,731,732],{"class":438},"  template",[432,734,553],{"class":442},[432,736,738,741],{"class":434,"line":737},11,[432,739,740],{"class":438},"    spec",[432,742,553],{"class":442},[432,744,746,749],{"class":434,"line":745},12,[432,747,748],{"class":438},"      containers",[432,750,553],{"class":442},[432,752,754,757,760,762,764,767],{"class":434,"line":753},13,[432,755,756],{"class":442},"        -",[432,758,759],{"class":438}," name",[432,761,443],{"class":442},[432,763,672],{"class":442},[432,765,766],{"class":446}," .Chart.Name",[432,768,678],{"class":442},[432,770,772,775,777,779,782],{"class":434,"line":771},14,[432,773,774],{"class":438},"          image",[432,776,443],{"class":442},[432,778,503],{"class":442},[432,780,781],{"class":446},"{{ .Values.image.repository }}:{{ .Values.image.tag }}",[432,783,509],{"class":442},[367,785,786,787,790,791,794,795,798],{},"Die doppelten geschwungenen Klammern ",[413,788,789],{},"{{ }}"," sind Go-Template-Syntax. ",[413,792,793],{},".Values"," greift auf values.yaml zu, ",[413,796,797],{},".Chart"," auf Chart.yaml.",[379,800,802],{"id":801},"wie-helm-templating-funktioniert","Wie Helm-Templating funktioniert",[367,804,805],{},"Helm nutzt die Go-Template-Engine, ergänzt um eine Reihe von Zusatzfunktionen aus der Sprig-Bibliothek. Das gibt dir Möglichkeiten wie Bedingungen, Schleifen, String-Manipulationen und eigene Hilfsfunktionen.",[367,807,808],{},"Ein einfaches Beispiel mit einer Bedingung:",[406,810,812],{"className":426,"code":811,"language":428,"meta":415,"style":415},"{{- if .Values.ingress.enabled }}\napiVersion: networking.k8s.io\u002Fv1\nkind: Ingress\nmetadata:\n  name: {{ include \"my-app.fullname\" . }}\n{{- end }}\n",[413,813,814,826,835,844,850,862],{"__ignoreMap":415},[432,815,816,819,821,824],{"class":434,"line":435},[432,817,818],{"class":442},"{{",[432,820,722],{"class":721},[432,822,823],{"class":446},"if .Values.ingress.enabled",[432,825,678],{"class":442},[432,827,828,830,832],{"class":434,"line":450},[432,829,439],{"class":438},[432,831,443],{"class":442},[432,833,834],{"class":446}," networking.k8s.io\u002Fv1\n",[432,836,837,839,841],{"class":434,"line":461},[432,838,650],{"class":438},[432,840,443],{"class":442},[432,842,843],{"class":446}," Ingress\n",[432,845,846,848],{"class":434,"line":472},[432,847,660],{"class":438},[432,849,553],{"class":442},[432,851,852,854,856,858,860],{"class":434,"line":483},[432,853,667],{"class":438},[432,855,443],{"class":442},[432,857,672],{"class":442},[432,859,675],{"class":446},[432,861,678],{"class":442},[432,863,864,866,868,871],{"class":434,"line":495},[432,865,818],{"class":442},[432,867,722],{"class":721},[432,869,870],{"class":446},"end",[432,872,678],{"class":442},[367,874,875],{},"Oder eine Schleife über mehrere Hosts:",[406,877,879],{"className":426,"code":878,"language":428,"meta":415,"style":415},"rules:\n  {{- range .Values.ingress.hosts }}\n  - host: {{ .host | quote }}\n    http:\n      paths:\n        {{- range .paths }}\n        - path: {{ .path }}\n        {{- end }}\n  {{- end }}\n",[413,880,881,888,900,917,924,931,943,959,969],{"__ignoreMap":415},[432,882,883,886],{"class":434,"line":435},[432,884,885],{"class":438},"rules",[432,887,553],{"class":442},[432,889,890,893,895,898],{"class":434,"line":450},[432,891,892],{"class":442},"  {{",[432,894,722],{"class":721},[432,896,897],{"class":446},"range .Values.ingress.hosts",[432,899,678],{"class":442},[432,901,902,905,908,910,912,915],{"class":434,"line":461},[432,903,904],{"class":442},"  -",[432,906,907],{"class":438}," host",[432,909,443],{"class":442},[432,911,672],{"class":442},[432,913,914],{"class":446}," .host | quote",[432,916,678],{"class":442},[432,918,919,922],{"class":434,"line":472},[432,920,921],{"class":438},"    http",[432,923,553],{"class":442},[432,925,926,929],{"class":434,"line":483},[432,927,928],{"class":438},"      paths",[432,930,553],{"class":442},[432,932,933,936,938,941],{"class":434,"line":495},[432,934,935],{"class":442},"        {{",[432,937,722],{"class":721},[432,939,940],{"class":446},"range .paths",[432,942,678],{"class":442},[432,944,945,947,950,952,954,957],{"class":434,"line":589},[432,946,756],{"class":442},[432,948,949],{"class":438}," path",[432,951,443],{"class":442},[432,953,672],{"class":442},[432,955,956],{"class":446}," .path",[432,958,678],{"class":442},[432,960,961,963,965,967],{"class":434,"line":594},[432,962,935],{"class":442},[432,964,722],{"class":721},[432,966,870],{"class":446},[432,968,678],{"class":442},[432,970,971,973,975,977],{"class":434,"line":602},[432,972,892],{"class":442},[432,974,722],{"class":721},[432,976,870],{"class":446},[432,978,678],{"class":442},[367,980,981,982,985,986,989],{},"Eigene Hilfsfunktionen landen in ",[413,983,984],{},"_helpers.tpl",". Die Datei beginnt mit einem Unterstrich, damit Helm sie nicht als eigenständiges Manifest behandelt. Dort definierst du benannte Templates, die du in den anderen Dateien per ",[413,987,988],{},"include"," einbindest.",[367,991,992,993,996],{},"Mit ",[413,994,995],{},"helm template my-app .\u002Fmy-app"," kannst du dir das fertig gerenderte YAML lokal ausgeben lassen, nützlich zum Debuggen, bevor du etwas auf den Cluster loslässt.",[379,998,1000],{"id":999},"helm-befehle-im-alltag","Helm-Befehle im Alltag",[367,1002,1003],{},"Die wichtigsten Operationen:",[406,1005,1009],{"className":1006,"code":1007,"language":1008,"meta":415,"style":415},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Chart installieren\nhelm install my-release .\u002Fmy-app\n\n# Mit eigenen Werten überschreiben\nhelm install my-release .\u002Fmy-app -f production-values.yaml\n\n# Upgrade einer bestehenden Installation\nhelm upgrade my-release .\u002Fmy-app --set image.tag=1.3.0\n\n# Installieren oder upgraden (idempotent, gut für CI)\nhelm upgrade --install my-release .\u002Fmy-app\n\n# Status einer Installation anzeigen\nhelm status my-release\n\n# Alle Releases auflisten\nhelm list\n\n# Rollback auf eine frühere Version\nhelm rollback my-release 1\n\n# Deinstallieren\nhelm uninstall my-release\n","bash",[413,1010,1011,1017,1032,1036,1041,1058,1062,1067,1087,1091,1096,1109,1113,1118,1128,1133,1139,1147,1152,1158,1171,1176,1182],{"__ignoreMap":415},[432,1012,1013],{"class":434,"line":435},[432,1014,1016],{"class":1015},"sHwdD","# Chart installieren\n",[432,1018,1019,1023,1026,1029],{"class":434,"line":450},[432,1020,1022],{"class":1021},"sBMFI","helm",[432,1024,1025],{"class":446}," install",[432,1027,1028],{"class":446}," my-release",[432,1030,1031],{"class":446}," .\u002Fmy-app\n",[432,1033,1034],{"class":434,"line":461},[432,1035,545],{"emptyLinePlaceholder":544},[432,1037,1038],{"class":434,"line":472},[432,1039,1040],{"class":1015},"# Mit eigenen Werten überschreiben\n",[432,1042,1043,1045,1047,1049,1052,1055],{"class":434,"line":483},[432,1044,1022],{"class":1021},[432,1046,1025],{"class":446},[432,1048,1028],{"class":446},[432,1050,1051],{"class":446}," .\u002Fmy-app",[432,1053,1054],{"class":446}," -f",[432,1056,1057],{"class":446}," production-values.yaml\n",[432,1059,1060],{"class":434,"line":495},[432,1061,545],{"emptyLinePlaceholder":544},[432,1063,1064],{"class":434,"line":589},[432,1065,1066],{"class":1015},"# Upgrade einer bestehenden Installation\n",[432,1068,1069,1071,1074,1076,1078,1081,1084],{"class":434,"line":594},[432,1070,1022],{"class":1021},[432,1072,1073],{"class":446}," upgrade",[432,1075,1028],{"class":446},[432,1077,1051],{"class":446},[432,1079,1080],{"class":446}," --set",[432,1082,1083],{"class":446}," image.tag=",[432,1085,1086],{"class":491},"1.3.0\n",[432,1088,1089],{"class":434,"line":602},[432,1090,545],{"emptyLinePlaceholder":544},[432,1092,1093],{"class":434,"line":613},[432,1094,1095],{"class":1015},"# Installieren oder upgraden (idempotent, gut für CI)\n",[432,1097,1098,1100,1102,1105,1107],{"class":434,"line":737},[432,1099,1022],{"class":1021},[432,1101,1073],{"class":446},[432,1103,1104],{"class":446}," --install",[432,1106,1028],{"class":446},[432,1108,1031],{"class":446},[432,1110,1111],{"class":434,"line":745},[432,1112,545],{"emptyLinePlaceholder":544},[432,1114,1115],{"class":434,"line":753},[432,1116,1117],{"class":1015},"# Status einer Installation anzeigen\n",[432,1119,1120,1122,1125],{"class":434,"line":771},[432,1121,1022],{"class":1021},[432,1123,1124],{"class":446}," status",[432,1126,1127],{"class":446}," my-release\n",[432,1129,1131],{"class":434,"line":1130},15,[432,1132,545],{"emptyLinePlaceholder":544},[432,1134,1136],{"class":434,"line":1135},16,[432,1137,1138],{"class":1015},"# Alle Releases auflisten\n",[432,1140,1142,1144],{"class":434,"line":1141},17,[432,1143,1022],{"class":1021},[432,1145,1146],{"class":446}," list\n",[432,1148,1150],{"class":434,"line":1149},18,[432,1151,545],{"emptyLinePlaceholder":544},[432,1153,1155],{"class":434,"line":1154},19,[432,1156,1157],{"class":1015},"# Rollback auf eine frühere Version\n",[432,1159,1161,1163,1166,1168],{"class":434,"line":1160},20,[432,1162,1022],{"class":1021},[432,1164,1165],{"class":446}," rollback",[432,1167,1028],{"class":446},[432,1169,1170],{"class":491}," 1\n",[432,1172,1174],{"class":434,"line":1173},21,[432,1175,545],{"emptyLinePlaceholder":544},[432,1177,1179],{"class":434,"line":1178},22,[432,1180,1181],{"class":1015},"# Deinstallieren\n",[432,1183,1185,1187,1190],{"class":434,"line":1184},23,[432,1186,1022],{"class":1021},[432,1188,1189],{"class":446}," uninstall",[432,1191,1127],{"class":446},[367,1193,1194],{},"Helm speichert den Zustand jeder Installation als Release im Cluster (als Secret oder ConfigMap) und verwaltet Revisionen. Das ermöglicht das Rollback auf eine frühere Version mit einem einzigen Befehl.",[379,1196,1198],{"id":1197},"chart-repositories-und-artifact-hub","Chart-Repositories und Artifact Hub",[367,1200,1201,1202,1207,1208,1211],{},"Fertige Charts für gängige Software findest du auf ",[371,1203,1206],{"href":1204,"rel":1205},"https:\u002F\u002Fartifacthub.io",[389],"Artifact Hub",", dem zentralen Verzeichnis für öffentliche Helm Charts. Dort gibt es Charts für cert-manager, ingress-nginx, Prometheus, ",[371,1209,1210],{"href":58},"PostgreSQL mit Helm"," und Hunderte weitere Pakete.",[367,1213,1214],{},"Ein Repository hinzufügen und daraus installieren:",[406,1216,1218],{"className":1006,"code":1217,"language":1008,"meta":415,"style":415},"helm repo add ingress-nginx https:\u002F\u002Fkubernetes.github.io\u002Fingress-nginx\nhelm repo update\nhelm install ingress-nginx ingress-nginx\u002Fingress-nginx\n",[413,1219,1220,1236,1245],{"__ignoreMap":415},[432,1221,1222,1224,1227,1230,1233],{"class":434,"line":435},[432,1223,1022],{"class":1021},[432,1225,1226],{"class":446}," repo",[432,1228,1229],{"class":446}," add",[432,1231,1232],{"class":446}," ingress-nginx",[432,1234,1235],{"class":446}," https:\u002F\u002Fkubernetes.github.io\u002Fingress-nginx\n",[432,1237,1238,1240,1242],{"class":434,"line":450},[432,1239,1022],{"class":1021},[432,1241,1226],{"class":446},[432,1243,1244],{"class":446}," update\n",[432,1246,1247,1249,1251,1253],{"class":434,"line":461},[432,1248,1022],{"class":1021},[432,1250,1025],{"class":446},[432,1252,1232],{"class":446},[432,1254,1255],{"class":446}," ingress-nginx\u002Fingress-nginx\n",[367,1257,1258,1259,1262],{},"Für eigene Charts kannst du ein privates Repository betreiben, klassisch als statischer HTTP-Server mit einem ",[413,1260,1261],{},"index.yaml",", oder moderner als OCI-Registry. Seit Helm 3.8 ist OCI-Support stabil, und viele Teams nutzen ihre bestehende Container-Registry gleichzeitig für Charts und Images.",[379,1264,1266],{"id":1265},"helm-chart-erstellen-eigene-anwendung-deployen","Helm Chart erstellen. Eigene Anwendung deployen",[367,1268,1269],{},"Einen neuen Chart anlegen:",[406,1271,1273],{"className":1006,"code":1272,"language":1008,"meta":415,"style":415},"helm create my-app\n",[413,1274,1275],{"__ignoreMap":415},[432,1276,1277,1279,1282],{"class":434,"line":435},[432,1278,1022],{"class":1021},[432,1280,1281],{"class":446}," create",[432,1283,458],{"class":446},[367,1285,1286],{},"Das erzeugt die vollständige Verzeichnisstruktur mit Beispiel-Templates für ein Deployment inkl. Service, Ingress, HPA und ServiceAccount. Der generierte Code ist funktional und ein guter Ausgangspunkt.",[367,1288,1289,1290,1292],{},"Danach passt du ",[413,1291,521],{}," an deine Anwendung an und bereinigst die Templates um alles, was du nicht brauchst. Testen lässt sich das mit:",[406,1294,1296],{"className":1006,"code":1295,"language":1008,"meta":415,"style":415},"# Rendering prüfen\nhelm template my-release .\u002Fmy-app -f my-values.yaml\n\n# Lint-Check\nhelm lint .\u002Fmy-app\n\n# Dry-run gegen den Cluster\nhelm install my-release .\u002Fmy-app --dry-run\n",[413,1297,1298,1303,1319,1323,1328,1337,1341,1346],{"__ignoreMap":415},[432,1299,1300],{"class":434,"line":435},[432,1301,1302],{"class":1015},"# Rendering prüfen\n",[432,1304,1305,1307,1310,1312,1314,1316],{"class":434,"line":450},[432,1306,1022],{"class":1021},[432,1308,1309],{"class":446}," template",[432,1311,1028],{"class":446},[432,1313,1051],{"class":446},[432,1315,1054],{"class":446},[432,1317,1318],{"class":446}," my-values.yaml\n",[432,1320,1321],{"class":434,"line":461},[432,1322,545],{"emptyLinePlaceholder":544},[432,1324,1325],{"class":434,"line":472},[432,1326,1327],{"class":1015},"# Lint-Check\n",[432,1329,1330,1332,1335],{"class":434,"line":483},[432,1331,1022],{"class":1021},[432,1333,1334],{"class":446}," lint",[432,1336,1031],{"class":446},[432,1338,1339],{"class":434,"line":495},[432,1340,545],{"emptyLinePlaceholder":544},[432,1342,1343],{"class":434,"line":589},[432,1344,1345],{"class":1015},"# Dry-run gegen den Cluster\n",[432,1347,1348,1350,1352,1354,1356],{"class":434,"line":594},[432,1349,1022],{"class":1021},[432,1351,1025],{"class":446},[432,1353,1028],{"class":446},[432,1355,1051],{"class":446},[432,1357,1358],{"class":446}," --dry-run\n",[367,1360,1361,1362,1365],{},"Bevor du einen Chart produktiv einsetzt, lohnt sich ein Blick auf ",[413,1363,1364],{},"helm lint",", der prüft auf häufige Fehler in Chart-Struktur und Templates.",[379,1367,1369],{"id":1368},"helm-vs-kustomize-wann-was","Helm vs. Kustomize. Wann was?",[367,1371,1372],{},"Beide Werkzeuge lösen das Problem der YAML-Verwaltung in Kubernetes, aber mit unterschiedlichem Ansatz.",[367,1374,1375,1378],{},[371,1376,1377],{"href":222},"Kustomize"," arbeitet mit Overlays: Du hast eine Basis-Konfiguration und überlagerst sie umgebungsspezifisch, ohne Templates oder Variablen. Es ist näher an purem YAML und kommt ohne eigene DSL aus. Seit kubectl 1.14 ist es direkt integriert.",[367,1380,1381],{},"Helm setzt auf Templating und Paketierung. Es ist mächtiger für komplexe Konfigurationen, hat aber eine steilere Lernkurve und mehr Moving Parts.",[367,1383,1384],{},"Faustregeln aus der Praxis:",[1386,1387,1388,1392,1395,1398],"ul",{},[1389,1390,1391],"li",{},"Du deployest fremde Software (cert-manager, Prometheus, etc.)? Helm, weil die Maintainer das als Chart liefern.",[1389,1393,1394],{},"Du verwaltest eigene Apps mit vielen Umgebungen und Konfigurationsunterschieden? Helm funktioniert gut, Kustomize ist aber oft übersichtlicher.",[1389,1396,1397],{},"Du willst GitOps-kompatibel bleiben und Plain-YAML bevorzugen? Kustomize.",[1389,1399,1400],{},"Du brauchst Rollback-Funktionalität und Release-Tracking? Helm.",[367,1402,1403,1404,1407],{},"Viele Teams kombinieren beides: Helm zum Installieren externer Charts, Kustomize für die eigene Applikationskonfiguration. Beide Werkzeuge sind Teil eines größeren Themas, das wir im Artikel zu ",[371,1405,1406],{"href":118},"lesbarer Kubernetes-Konfiguration"," aufgreifen.",[379,1409,1411],{"id":1410},"helm-in-cicd-und-gitops","Helm in CI\u002FCD und GitOps",[367,1413,1414,1415,1418],{},"In CI\u002FCD-Pipelines ist ",[413,1416,1417],{},"helm upgrade --install"," der Standardbefehl, er installiert, wenn noch nichts da ist, und upgradet sonst. Das macht Pipelines idempotent:",[406,1420,1422],{"className":1006,"code":1421,"language":1008,"meta":415,"style":415},"helm upgrade --install my-app .\u002Fchart \\\n  --namespace production \\\n  --create-namespace \\\n  --set image.tag=$CI_COMMIT_SHA \\\n  -f environments\u002Fproduction\u002Fvalues.yaml\n",[413,1423,1424,1441,1451,1458,1468],{"__ignoreMap":415},[432,1425,1426,1428,1430,1432,1435,1438],{"class":434,"line":435},[432,1427,1022],{"class":1021},[432,1429,1073],{"class":446},[432,1431,1104],{"class":446},[432,1433,1434],{"class":446}," my-app",[432,1436,1437],{"class":446}," .\u002Fchart",[432,1439,1440],{"class":721}," \\\n",[432,1442,1443,1446,1449],{"class":434,"line":450},[432,1444,1445],{"class":446},"  --namespace",[432,1447,1448],{"class":446}," production",[432,1450,1440],{"class":721},[432,1452,1453,1456],{"class":434,"line":461},[432,1454,1455],{"class":446},"  --create-namespace",[432,1457,1440],{"class":721},[432,1459,1460,1463,1465],{"class":434,"line":472},[432,1461,1462],{"class":446},"  --set",[432,1464,1083],{"class":446},[432,1466,1467],{"class":721},"$CI_COMMIT_SHA \\\n",[432,1469,1470,1473],{"class":434,"line":483},[432,1471,1472],{"class":446},"  -f",[432,1474,1475],{"class":446}," environments\u002Fproduction\u002Fvalues.yaml\n",[367,1477,1478,1479,1482],{},"In GitOps-Setups mit ArgoCD oder Flux wird Helm nativ unterstützt. ArgoCD kann direkt auf Chart-Repositories zeigen und Helm-Releases als Application-Ressourcen verwalten. Flux bringt dafür den ",[413,1480,1481],{},"HelmRelease","-Custom-Resource-Typ mit. Der Vorteil: Der gewünschte Zustand liegt im Git-Repository, der Cluster gleicht sich automatisch ab.",[367,1484,1485],{},"Für Secrets in Helm gibt es verschiedene Ansätze: das Helm Secrets Plugin (arbeitet mit SOPS oder Vault), External Secrets Operator oder direkt mit einem Secret-Store-CSI-Driver. Werte mit Passwörtern oder API-Keys gehören nicht unverschlüsselt in values.yaml, das ist einer der häufigsten Sicherheitsfehler beim Helm-Einsatz.",[1487,1488],"hr",{},[367,1490,1491,1492,1495],{},"Helm Charts sind heute der De-facto-Standard für strukturierte Kubernetes-Deployments – sowohl für Standardsoftware als auch für eigene Anwendungen. Der Einstieg ist überschaubar: ",[413,1493,1494],{},"helm create"," erzeugt einen funktionalen Chart in Sekunden, und die Konzepte von Templating und Releases erschließen sich schnell in der Praxis.",[367,1497,1498,1499,1503],{},"Wer Kubernetes auf einer Plattform betreibt, die Helm nativ unterstützt, profitiert zusätzlich: ",[1500,1501,1502],"strong",{},"lowcloud"," bietet eine Kubernetes-Umgebung, in der Helm-Deployments direkt funktionieren, ohne Infrastrukturaufwand drumherum. Das lässt Teams sich auf den eigentlichen Chart-Inhalt konzentrieren, statt auf Cluster-Management.",[1505,1506,1507],"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 pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":415,"searchDepth":450,"depth":450,"links":1509},[1510,1511,1516,1517,1518,1519,1520,1521],{"id":381,"depth":450,"text":382},{"id":400,"depth":450,"text":401,"children":1512},[1513,1514,1515],{"id":419,"depth":461,"text":420},{"id":520,"depth":461,"text":521},{"id":627,"depth":461,"text":628},{"id":801,"depth":450,"text":802},{"id":999,"depth":450,"text":1000},{"id":1197,"depth":450,"text":1198},{"id":1265,"depth":450,"text":1266},{"id":1368,"depth":450,"text":1369},{"id":1410,"depth":450,"text":1411},"2026-04-08","Helm Charts bündeln Kubernetes-Ressourcen in ein versioniertes Paket. So sind sie aufgebaut, so funktioniert das Templating und so setzt du sie sinnvoll ein.","md",{"src":1526},"\u002Fimages\u002Fblog\u002Fwhat-is-a-helm-chart.jpg","2026-04-13",{},{"title":213,"description":1523},"w_mSNRTn4FeRJlfKPwJgg-uCUzzxl7WpqjBhLxly8K8",[1532,1534],{"title":209,"path":210,"stem":211,"description":1533,"children":-1},"Docker Swarm erklärt: Cluster, Services, Overlay-Netzwerke und der Vergleich mit Kubernetes. Wann Swarm die richtige Wahl für Container-Orchestrierung ist.",{"title":217,"path":218,"stem":219,"description":1535,"children":-1},"Docker, Docker Compose, Docker Swarm und Kubernetes im direkten Vergleich: Welches Tool passt zu welchem Problem und wann lohnt sich der Umstieg?",1776079527806]