July 4, 2026 : 10 min read
Architecture Stack: Helm & Application Packaging
Understanding Helm: the package manager for Kubernetes that templates, packages, and manages application deployments across environments.
- Architecture
- Kubernetes
This is a conversation between Alex (Engineering Manager) and Jordan (Senior Architect) exploring Helm and application packaging in Kubernetes.
Part 1: The YAML Explosion Problem
Alex: "Jordan, we have Kubernetes running, ArgoCD deploying. But I keep hearing 'Helm' mentioned. What's it for?"
Jordan: "Good question. Let me start with the problem Helm solves. Imagine you have Order Service. You write a Kubernetes manifest."
Alex: "One YAML file?"
Jordan: "Right. Simple. But then you need to deploy to dev, staging, and production. Each environment has different settings:
- Dev: 1 replica, 256MB memory, test database
- Staging: 3 replicas, 512MB memory, staging database
- Production: 10 replicas, 2GB memory, production database with backups
Now you have three YAML files. Almost identical, but different values."
Alex: "Why not just one file?"
Jordan: "You could. But then you hardcode the database URL. Change it for prod, git history gets messy. Or you use environment variables, but then you need a system to inject them. Messy either way."
Alex: "How many YAML files do you need?"
Jordan: "For a real application? Lots. Deployment, Service, ConfigMap, Secret, Ingress, PersistentVolumeClaim, Maybe NetworkPolicy. 10+ files per service. With 20 services in 3 environments, you're managing 600+ YAML files. Duplicate definitions everywhere."
Alex: "That's chaos."
Jordan: "Complete chaos. Helm solves this."
Part 2: What Is Helm?
Alex: "Define Helm."
Jordan: "Helm is the package manager for Kubernetes. Like apt (Ubuntu) or npm (Node.js), but for Kubernetes applications. Instead of writing static YAML, you write templates with variables. Helm renders templates to produce YAML. You package templates, configuration, and dependencies into a Chart. Charts are reusable, versionable, and shareable."
Alex: "Templates and variables?"
Jordan: "Yes. Kubernetes YAML but with placeholders. Like {{ .Values.replicas }}. Helm substitutes actual values based on environment. Dev environment has replicas: 1. Prod has replicas: 10. Same chart, different values."
Alex: "That's the benefit?"
Jordan: "Huge benefit. One chart definition. Reuse across all environments. Values differ, but logic is identical. No duplication."
Part 3: Helm Concepts
Alex: "What's the terminology?"
Jordan: "Several key concepts:
Chart: A Helm package. Contains templates, values, metadata. Like a recipe. Published to Helm repositories.
Values: Configuration parameters. Replicas, memory, image, database URL. Chart reads from Values. Different Values files for different environments.
Template: Kubernetes YAML with placeholders. Helm renders templates using Values to produce final YAML.
Release: A deployed instance of a Chart. You deploy Chart 'mysql' with Values 'prod' and get Release 'mysql-prod'. Deploy same Chart with Values 'dev' and get Release 'mysql-dev'. Different deployments, same Chart.
Repository: Collection of Charts. Like Docker Hub for containers. Public repos (Bitnami, Stable), private repos (internal)."
Alex: "So Chart is template, Release is instantiation?"
Jordan: "Exactly. Chart is definition. Release is deployed instance."
Part 4: Problems Helm Solves
Alex: "What concrete problems?"
Jordan: "Several:
YAML Duplication: Same deployment in dev/staging/prod with small variations. Helm templates eliminate duplication.
Environment Consistency: Staging should look like production (fewer replicas, same configuration structure). Helm enforces this.
Dependency Management: Order Service depends on MySQL, Redis, RabbitMQ. Helm charts can depend on other charts. Helm installs dependencies automatically.
Versioning: Helm charts are versioned. Roll back to previous chart version instantly. Track what version is deployed where.
Reusability: Create chart once, deploy multiple times. Share charts across teams or externally.
Configuration Management: Separate concerns. Chart is logic (what to deploy). Values are configuration (how to customize). Teams can use Charts without modifying them."
Alex: "This is package management?"
Jordan: "Exactly. Helm brings software package management to Kubernetes."
Part 5: Why This Matters
Alex: "Operationally?"
Jordan: "Reduces complexity dramatically. Instead of managing hundreds of YAML files, you manage Helm charts and values. Deployments become consistent. Errors drop. Onboarding new services becomes faster (use existing Chart template)."
Alex: "Cost-wise?"
Jordan: "Engineers spend less time on infrastructure YAML. More time on features. Plus fewer deployment errors means fewer production incidents."
Alex: "Agility-wise?"
Jordan: "With ArgoCD + Helm: update Values in Git, ArgoCD deploys new configuration instantly. Configuration changes without redeploying containers."
Part 6: The Traditional Approach
Alex: "How did people manage this before Helm?"
Jordan: "Copy-paste YAML. Start with dev YAML, copy to staging, change values manually. Copy staging to prod, change again. Or use sed/awk to replace values (fragile and error-prone)."
Alex: "How'd that work?"
Jordan: "Poorly. Inconsistencies between environments. Copy-paste mistakes. Hard to track what's deployed where. Upgrade is painful: you'd modify YAML files manually, risk breaking things."
Alex: "Helm is much better?"
Jordan: "Dramatically better. Helm is to YAML what Docker is to application deployment."
Part 7: Helm Chart Structure
Alex: "What does a Helm chart look like?"
Jordan: "Simple directory structure:
my-service/
Chart.yaml # Chart metadata (name, version, description)
values.yaml # Default values
templates/
deployment.yaml # Kubernetes Deployment template
service.yaml # Kubernetes Service template
configmap.yaml # ConfigMap template
ingress.yaml # Ingress template
charts/ # Dependent charts
mysql/
redis/
Chart.yaml defines the Chart itself. values.yaml has default configuration. templates/ has Kubernetes YAML with placeholders."
Alex: "How do placeholders work?"
Jordan: "Go templating syntax. {{ .Values.replicas }} renders the replicas value. {{ .Release.Name }} renders the release name. {{ if .Values.tls }} conditional rendering."
Alex: "That's Go templates?"
Jordan: "Yes. Helm uses Go templating. Also lets you loop, do arithmetic, call functions."
Part 8: Values & Environments
Alex: "How do you handle dev vs prod?"
Jordan: "Multiple values files.
values.yaml # Default, shared values
values-dev.yaml # Development overrides
values-staging.yaml # Staging overrides
values-prod.yaml # Production overrides
When deploying:
- Dev:
helm install my-service ./my-service -f values.yaml -f values-dev.yaml - Prod:
helm install my-service ./my-service -f values.yaml -f values-prod.yaml
Later files override earlier files. So prod overrides only what's different."
Alex: "That's elegant."
Jordan: "It is. Minimal duplication. Clear what's different."
Part 9: Dependencies & Charts
Alex: "You mentioned dependencies?"
Jordan: "Charts can depend on other charts. Order Service chart might depend on MySQL chart. In Chart.yaml, you declare dependencies:
dependencies:
- name: mysql
version: 9.3.4
repository: https://charts.bitnami.com/bitnami
- name: redis
version: 17.0.0
repository: https://charts.bitnami.com/bitnami
When you install Order Service chart, Helm automatically installs MySQL and Redis."
Alex: "Do you customize the dependencies?"
Jordan: "Yes. Create values overrides. You want MySQL 8.0, not default 5.7? Set it in values:
mysql:
image:
tag: "8.0"
Helm passes those values to MySQL chart."
Alex: "That's powerful."
Jordan: "It is. Entire application stack (application plus dependencies) in one command."
Part 10: Helm Integration with ArgoCD
Alex: "How does this work with ArgoCD?"
Jordan: "ArgoCD understands Helm. Instead of pointing to raw YAML in Git, you point to Helm chart directory. ArgoCD:
- Fetches Helm chart from Git (or external repository)
- Renders chart using values file
- Applies rendered YAML to cluster
Flow: Git contains Helm chart and values files. ArgoCD renders and deploys."
Alex: "So Git is source of truth for chart and values?"
Jordan: "Yes. Chart definition in Git, values in Git. ArgoCD renders. Everything reproducible from Git."
Alex: "Changes are?"
Jordan: "Git commits. Update values.yaml, push to Git. ArgoCD detects. Re-renders chart. Deploys new configuration. All tracked in Git history."
Part 11: Helm Repositories
Alex: "Can you share Helm charts?"
Jordan: "Yes. Helm repositories are collections of charts. Like Docker Hub. Bitnami hosts 500+ charts (MySQL, PostgreSQL, RabbitMQ, Nginx, etc.). You don't write those; you use them."
Alex: "How do you use external charts?"
Jordan: "Declare dependency in Chart.yaml. Helm downloads from repository. You customize with values. Deploy."
Alex: "So you can assemble applications from existing charts?"
Jordan: "Exactly. Build once, deploy everywhere. Less code to write and maintain."
Alex: "Internal repositories?"
Jordan: "Companies host private Helm repositories. Share internal charts across teams. Central platform team creates base charts (with security policies, standards). Development teams use and customize."
Part 12: Helm Lifecycle Commands
Alex: "What commands do you actually run?"
Jordan: "Common Helm operations:
helm install: Deploy a chart. Creates a release.
helm install my-release ./my-chart -f values-prod.yaml
helm upgrade: Update an existing release. If chart or values changed, update cluster.
helm upgrade my-release ./my-chart -f values-prod.yaml
helm list: Show all releases.
helm rollback: Revert to previous release version.
helm rollback my-release 1
helm uninstall: Remove a release."
Alex: "These are lifecycle management?"
Jordan: "Yes. Entire application lifecycle via Helm commands."
Alex: "But with ArgoCD, you don't run these manually?"
Jordan: "Right. ArgoCD runs Helm commands automatically when Git changes. Humans just push Git commits."
Part 13: Challenges & Best Practices
Alex: "What can go wrong?"
Jordan: "Several pitfalls:
Template Complexity: Go templating is powerful but can become unreadable. Too many conditionals, loops. Hard to understand final YAML.
Value Naming Conflicts: Two charts both have a db section. Confusion. Solution: Use nested structures with clear naming.
Chart Versioning: Chart v1 works with app v1. App v2 requires chart v2. Dependency hell. Solution: Semantic versioning discipline.
Copy-Paste Charts: Creating new chart by copying existing one. Divergence over time. Solution: Refactor common patterns into shared base chart.
Secrets in Values: Accidentally commit passwords in values.yaml to Git. Solution: Use External Secrets or Sealed Secrets, never commit secrets.
Chart Testing: Hard to test. Solution: Use helm template command to render, then validate output. Automated testing pipelines."
Alex: "These are all best practice issues?"
Jordan: "Yes. Helm is powerful but requires discipline. Poorly designed charts become unmaintainable."
Part 14: Helm vs Kustomize
Alex: "I've heard 'Kustomize' mentioned. How's that different?"
Jordan: "Kustomize is simpler templating. Instead of Go templating, you use patches and overlays. Dev/prod are different 'overlays' of base configuration."
Alex: "So Helm is more powerful?"
Jordan: "Yes. Helm is full package manager. Kustomize is overlay system. Helm is better for reusable charts. Kustomize is better for simpler one-off customization."
Alex: "Which do we use?"
Jordan: "Helm for packaged applications. Some teams use Kustomize for simple infrastructure. We're predominantly Helm."
Part 15: Helm for Different Use Cases
Alex: "When do you use Helm heavily?"
Jordan: "Several scenarios:
Platform Teams: Creating base charts for common services (web app, API, worker). Development teams use as starting point.
Microservices: Each service is a Helm chart. Deploy consistently across environments.
Third-Party Software: Installing Bitnami charts for MySQL, Redis, etc. Customize as needed.
Multi-Environment: Same application stack (dev/staging/prod) with different configs. Helm enables this elegantly.
Dependency Management: Complex applications with many interdependent services. Helm charts declare dependencies."
Alex: "So it's central to platform architecture?"
Jordan: "Absolutely. Helm is the standardization layer. Everyone writes Kubernetes YAML. Helm packages that YAML for reuse."
Part 16: Helm Versioning & Releases
Alex: "You mentioned versioning. How does it work?"
Jordan: "Each chart has version (Chart.yaml defines it). v1.0.0, v1.1.0, v2.0.0, following semantic versioning.
When you deploy, you specify chart version:
helm install my-release ./my-chart --version 1.2.3
Different releases can use different chart versions. Production uses v1.2.3, staging uses v1.3.0 (beta test). If v1.3.0 breaks, revert production to v1.2.3 instantly."
Alex: "That's version management?"
Jordan: "Yes. Every deployment is reproducible because you know exact chart version."
Alex: "Combined with Git?"
Jordan: "Git specifies chart version in values or dependencies. ArgoCD deploys exact version. Complete reproducibility."
Part 17: Helm Testing & Validation
Alex: "How do you test Helm charts?"
Jordan: "Several approaches:
helm template: Render chart, output YAML. Validate output is correct.
helm lint: Check chart for common mistakes (missing values, invalid syntax).
helm test: Deploy chart, run test pods. Verify deployment worked.
CI/CD Integration: Automated validation in pipeline. Build chart, lint, test, scan for vulnerabilities before publishing."
Alex: "Testing is important?"
Jordan: "Critical. Bad chart breaks production. Validation catches errors early."
Part 18: Bridging to DevSecOps
Alex: "We've covered packaging. What's next in L2?"
Jordan: "DevSecOps. Security automation. Helm charts contain security specifications (network policies, RBAC, secrets encryption). DevSecOps ensures these are enforced. Scanning for vulnerabilities, secrets management, compliance checks."
Alex: "So Helm defines what to deploy. DevSecOps ensures it's deployed securely?"
Jordan: "Exactly. Helm is the packaging. DevSecOps is the guardrails."
Part 19: The Bottom Line
Alex: "If I pitch this?"
Jordan: "Helm is package management for Kubernetes. Instead of managing hundreds of YAML files, you manage reusable charts. Same chart deployed to dev, staging, production with different values. Deployments become consistent, reproducible, and versionable. Changes are Git commits. Rollbacks are instant. Helm brings software engineering best practices to Kubernetes configuration."
Alex: "And the commitment?"
Jordan: "We're saying: every Kubernetes application is packaged as a Helm chart. Consistency and reusability are non-negotiable. No more hand-crafted YAML."
Key Takeaways
| Aspect | Details | | ------------------- | ----------------------------------------------------------------------------------------------- | | Core Concept | Package manager for Kubernetes using templates and values | | Primary Benefit | Eliminate YAML duplication, consistent deployments across environments, reusability | | Best For | Microservices, multi-environment deployments, dependency management | | Main Challenge | Template complexity, versioning discipline, secrets management | | Key Concepts | Charts (templates), Values (configuration), Releases (deployments), Repositories (distribution) | | Dependencies | Charts can depend on other charts (MySQL, Redis, etc.) | | Integration | Works seamlessly with ArgoCD for GitOps deployments | | Lifecycle | install, upgrade, rollback, uninstall via Helm or ArgoCD automation |
L2 Series Progress
- AWS Fundamentals ✓ (infrastructure foundation)
- Kubernetes & EKS ✓ (container orchestration)
- ArgoCD & GitOps ✓ (automated deployments)
- Helm ✓ (application packaging)
- DevSecOps (security automation)
Ready for DevSecOps and security automation? Or explore Helm deeper?