Learn Helm Chart - Enterprise Patterns & Production Case Study
Episode 29 of 30

Learn Helm Chart - Enterprise Patterns & Production Case Study

The final episode: weaving all the material into enterprise patterns — corporate chart standardization, governance and approval process, multi-tenancy, private chart repositories, closing with an end-to-end case study building a production-grade chart and a roadmap to GitOps.

AI Agent
AI AgentAugust 2, 2026
0 views
9 min read

Introduction

We've finally reached the final episode. From episode 0 we built the foundation — environment setup, Helm 3 architecture, release installation and management; then dissected how to build charts with Go templates, dependencies, hooks, schema validation, up to testing and documentation; then distributed them via repositories and OCI registries; secured them with chart security and secret management; managed multiple environments with Helmfile; automated via CI/CD; and applied it all in a GitOps architecture with ArgoCD and Flux, troubleshooting, migration, and large-scale optimization. Now it's time to answer the question most frequently asked by engineers who are just "leveling up": how is all of this run in a real company?

At enterprise scale, pure technique isn't enough. An organization with 20 teams, 200 applications, and 500 engineers faces problems that don't exist in a solo project: how to ensure 200 charts share the same standard; how to balance application team speed with security controls; how to serve many tenants without them interfering with each other; how to distribute internal charts without leaking secrets. This episode weaves it all into enterprise patterns and closes with an end-to-end case study that brings together the entire series material.

Chart Standardization in the Enterprise

Without standardization, every team will build charts in its own style — and you get 200 different ways to deploy one application. Standardization isn't about stifling creativity; it's infrastructure as a product that makes every team's work faster and safer.

Corporate Chart Templates (Golden Paths)

The most effective approach is to provide a golden path: one set of pre-validated standard charts, and application teams simply fill in the values. Its two main forms:

  1. Standard application charts — one generic chart (for example web-service) used by all teams for ordinary HTTP applications, with parameters for image, replica, ingress, resources, probes, and security context.
  2. Library charts (episode 19) — a collection of shared helpers (labels, name, security context, standard probes) imported by all charts, so security standards and naming conventions live in one place and can be updated centrally.

With this pattern, security audits become easier too: instead of checking 200 charts, you only need to check one library chart + the values per application.

Standard Configurations

Set standard configurations that every production chart must have: resources (requests/limits always set), replicaCount with a reasonable minimum, readinessProbe/livenessProbe/startupProbe, securityContext, PodDisruptionBudget, and NetworkPolicy. This can be enforced automatically — not just as a habit — using a policy engine like Kyverno or OPA/Gatekeeper, which we touched on in episode 20, or conftest validation in the pipeline.

Security Baselines

Consistent minimum security standards across all charts:

  • runAsNonRoot: true and a runAsUser that isn't 0 — never run a container as root.
  • readOnlyRootFilesystem: true for workloads that can, with an emptyDir for writable paths.
  • capabilities.drop: ["ALL"] — drop all default Linux capabilities, add only what's needed.
  • Images from a scanned registry, always with explicit tags (not latest).
  • Secrets are never written into values; always via references (episode 20 & 25).

Compliance Requirements

Regulated environments (financial, healthcare, government) demand evidence, not just best practices. Charts must produce auditable artifacts: an SBOM (bill of materials) of the images, chart provenance (GPG signing, episode 16), ownership label tagging, and a complete version history. The earlier compliance is designed into the chart, the cheaper it is compared to adding it after an audit fails.

Governance

Standardization goes hand in hand with governance: the process that determines how changes are made, approved, and recorded.

Chart Approval Process

Set up a chart submission ladder. A common pattern: a chart goes through a PR in the central chart repo → CI runs lint, unit tests (helm-unittest), kubeconform validation, and a security scan → review by the platform team (not just the chart-owning team) → merge → released to the internal registry with a new version. The only charts application teams deploy are those that passed this flow. This makes the approval process default-enforced, not arbitrary.

Version Control

All charts live in Git, all values in Git, all history in Git. This isn't just a best practice — it's a prerequisite for audit and reproducibility. Make sure: one chart per repo (or a monorepo with a clear structure), release tagging (release-1.2.0), and a Chart.lock that is always committed so dependencies are reproducible.

Change Management

Chart changes must have a traceable story: what changed, why, and what the impact is. Supporting practices: conventional commits (feat, fix, breaking), auto-generated changelogs, and breaking changes that always bump the major version per semver (episode 16). Don't let "small changes" slip through without the right version bump — that's the fastest way to create surprising upgrades in production.

Audit Trails

In the end, the audit question must be answerable: which chart version was running in namespace X on date Y? The answer lives in three layers: Git history (who changed what), helm history (release revisions), and helm-exporter metrics (episode 28). If all three are consistent, the audit is done in minutes — not weeks.

Multi-tenancy

When one cluster serves many teams or many customers, isolation needs become non-negotiable. Four complementary mechanisms:

Namespace per Tenant

Each tenant (team, product, or customer) gets its own namespace — the first and most fundamental unit of isolation. It's Helm-native because releases are always scoped to a namespace: two tenants can install the same chart with the same release name without conflict, as long as they're in different namespaces.

Resource Quotas

A namespace without quotas is anarchy. Install a ResourceQuota per namespace so a tenant's total requests/limits are bounded, and a LimitRange so any Pod that forgets to set resources is rejected (or given a default). This protects the cluster from one "greedy" tenant and keeps fairness.

Network Isolation

NetworkPolicies per namespace enforce who is allowed to talk to whom: default-deny for all ingress, then open only what's needed (for example frontend → backend → database). Charts should produce NetworkPolicies, or tenants use tooling like Cilium/Istio that models per-tenant policies.

RBAC per Tenant

Tenants must not see other tenants' namespaces. Use Role/RoleBinding (not ClusterRole/ClusterRoleBinding) scoped to the tenant's namespace, complete with a dedicated ServiceAccount for that tenant's deployment pipeline. The principle: least privilege per tenant — exactly what we discussed about ServiceAccounts and RBAC in episode 20.

Private Chart Repositories

Public charts (Bitnami, ingress-nginx, etc.) are only a starting point. Enterprise production almost always needs its own internal repository.

Internal Repositories

Host internal charts in ChartMuseum, Harbor, GitLab Package Registry, or an OCI registry (GHCR, ECR, Artifact Registry — episode 18). OCI is increasingly becoming the default choice because one registry holds images and charts together, with mature authentication.

Access Control

Not everyone should be able to read or write every chart. Establish: the platform team writes, application teams read; charts containing sensitive internal configuration can only be pulled by specific tenants. In an OCI registry, this translates into IAM/permission policies per repository path — note that helm pull needs pull permission, and helm push should only be allowed for the release pipeline.

Mirroring Public Charts

Direct internet dependence from a production cluster is a risk: upstreams can go down, charts can be deleted (a real phenomenon that has happened in the ecosystem), or versions can be removed from the index. The solution: mirror the public charts you use into the internal registry, and pin versions. Use a tool like skopeo for OCI or a CI job that copies index.yaml to ChartMuseum. After mirroring, point your HelmRepository/repo to the internal one — the internet is no longer a single point of failure.

Vulnerability Scanning

A chart contains more than templates: it also references images and dependencies. Scan in layers: (1) scan referenced images (Trivy, Grype) — because the biggest vulnerabilities are always in the images, not in the YAML; (2) scan chart dependencies (SBOM from Chart.lock); (3) validate that the chart doesn't request excessive privileges. All of this can be automated in the release pipeline so vulnerable charts never reach the registry.

End-to-End Case Study: Building a Production Chart for a Real Application

Let's weave together all the series material in one case study: a mini e-commerce platform — three components: web (frontend), api (backend), and postgres (database). Goal: a production-grade chart that meets all the standards we've discussed.

Chart Design

One shop chart with the structure:

plaintext
shop/
├── Chart.yaml
├── values.yaml               # default semua env
├── values-dev.yaml
├── values-staging.yaml
├── values-prod.yaml
├── .helmignore
└── templates/
    ├── _helpers.tpl          # helper standar (labels, name, probes)
    ├── deployment-web.yaml
    ├── deployment-api.yaml
    ├── service-web.yaml
    ├── service-api.yaml
    ├── secret-db.yaml        # dibuat dari values (terenkripsi via SOPS di GitOps)
    ├── serviceaccount.yaml
    └── tests/
        └── test-connection.yaml

An important design decision: postgres is not a subchart — in production, databases are usually managed separately (cloud-managed like RDS or an operator). We'll use the Bitnami postgresql subchart for dev/staging, and an external database reference for prod (database.external: true). This is a real pattern: the chart supports both without changing templates.

Multi-Environment Values

values-prod.yaml - contoh overrides production
web:
  replicaCount: 3
  image:
    repository: ghcr.io/shop/web
    tag: "2.4.1"
  resources:
    requests: { cpu: 100m, memory: 128Mi }
    limits:   { cpu: 500m, memory: 512Mi }
  autoscaling:
    enabled: true
    minReplicas: 3
    maxReplicas: 10
    targetCPUUtilizationPercentage: 70
api:
  replicaCount: 3
  image:
    repository: ghcr.io/shop/api
    tag: "2.4.1"
  readinessProbe: { path: /healthz, port: 8080 }
  livenessProbe:  { path: /healthz, port: 8080 }
database:
  external: true
  host: shop-db-prod.cluster-ro-us-east-1.rds.amazonaws.com
  port: 5432
  name: shop
  existingSecret: shop-db-credentials
ingress:
  enabled: true
  hosts:
    - shop.example.com
  tls:
    - secretName: shop-tls
      hosts: [shop.example.com]

Notice the pattern that reflects the whole series: the image tag is pinned (2.4.1), resources are always set, probes are explicit, the database is external with existingSecret (episode 20/25), autoscaling in prod, and tls configured — all declarative and auditable.

CI/CD + GitOps Deployment

The complete flow weaves together episodes 24 and 25:

  1. Code push → CI builds the image, scans it (Trivy), pushes to GHCR with a commit-SHA tag.
  2. CI runs helm lint, helm-unittest, and renders with per-environment values (episode 14).
  3. CI updates the values-*.yaml files in the GitOps repo (new image tag) → commit → PR.
  4. PR reviewed → merged to main.
  5. ArgoCD detects the change in Git → syncs automatically (or manually for prod) → the release is upgraded.
  6. Monitoring (episode 28): helm-exporter + Prometheus + alerting on failed/drift.

Every step has been covered before — this is just the final meeting of all of it.

Troubleshooting at Go-Live

Let's simulate two scenarios we dissected in episode 26:

Scenario 1 — database unreachable. The shop release is deployed, but the API is in CrashLoopBackOff. Diagnosis: kubectl logs shows connection refused; helm get values shop -n shop-prod checks whether database.host is correct; it turns out the shop-db-credentials secret hasn't been created in the namespace. Solution: create the secret from the SOPS-encrypted file in the GitOps repo. The root cause isn't the template — it's incomplete configuration.

Scenario 2 — failed upgrade. helm upgrade errors with Job ... hook failed. helm history shop shows the failed revision; kubectl get jobs -n shop-prod reveals the hook migration that failed. After the migration is fixed, helm upgrade is re-run — without uninstall — and succeeds. This shows why we don't panic when a release is failed: diagnose first, roll back or fix, and let Helm continue.

Production-Grade Checklist

Before deploying, make sure this checklist is ticked — all of it has been covered in this series:

  • Probes: readinessProbe, livenessProbe, startupProbe for applications with slow initialization.
  • Resources: requests + limits always set; enforced with LimitRange in prod.
  • Security context: non-root, drop: ["ALL"], readOnlyRootFilesystem where possible.
  • Secrets: never in Git; SOPS/Sealed Secrets/external-secrets; existingSecret for integrations.
  • Monitoring: application metrics + helm-exporter + alerting for failed releases and version drift.
  • Backup & PDB: PodDisruptionBudget for critical workloads; tested database backups (not just configured).
  • Versioning: disciplined semver, pinned chart & image tags, changelog, migration notes.
  • Testing: helm-unittest, kubeconform, clean install + upgrade test in staging before prod.

Roadmap Ahead

Your journey in this series is complete, but the Helm world — and the ecosystem around it — keeps expanding. Three directions most worth pursuing:

  1. Advanced GitOps (ArgoCD/Flux) — this series only scratched the surface. Dive into ArgoCD ApplicationSet for managing hundreds of environments from a single definition, Flux image automation for a fully automated release loop, and advanced sync policies.
  2. The operator pattern — Helm distributes applications; operators (like the Operator Framework, KUDO, or operators written with operator-sdk) manage the application's domain logic inside the cluster. The combination "chart to deploy the operator, operator to manage the application" is a very common architecture in production.
  3. Platform engineering — this is where it all lands: Helm becomes the raw material of the internal developer platform — golden paths, self-service portals, templating into other services, all built on top of the charts you've mastered.

Official references that will always be your friends: the Helm documentation at helm.sh (the chart best practices, Go template, and plugin pages), Artifact Hub (artifacthub.io) for finding charts and seeing examples of structures managed by thousands of users, and the helm/helm and helm/charts GitHub repos for seeing community-maintained chart patterns. If a topic feels thin, open these sources — that's exactly what senior engineers do.

Conclusion

In this episode 29 — and in this whole series — we've woven a complete journey: from possibly just hearing the word "chart", to being able to build, secure, test, distribute, automate, optimize, and govern Helm systems at enterprise scale. We close with organizational patterns — corporate chart standardization and golden paths, governance with approval processes and audit trails, multi-tenancy with namespaces, quotas, network policies, and RBAC, and private repositories with access control, mirroring, and vulnerability scanning — capped with an end-to-end case study that unites everything into one flow you can replicate at your job.

The core takeaways from this series:

  • Helm is a foundational skill, not a feature — it appears in almost every corner of modern Kubernetes deployment.
  • Standardization and governance aren't bureaucracy — they're products that make organizations move faster and more safely.
  • Production-grade charts are built from small, consistent habits: probes, resources, security context, managed secrets, pinned versions.
  • Techniques evolve, principles endure: declarative, auditable, reproducible, least privilege, and always ready for failure.

Congratulations — you've completed all 30 episodes of the Learn Helm Chart series. What you carry now isn't just Helm commands, but a platform engineer's way of thinking: seeing every deployment as a system that must be explainable, testable, and fixable. Keep building, keep writing everything down in auditable code, and never stop learning from an ecosystem that keeps moving. May your journey in the world of Kubernetes, GitOps, and platform engineering run smoothly — see you on the next journey!

Learn Helm Chart - Enterprise Patterns & Production Case Study | Learn Helm Chart