From YAML Chaos to Helm Charts: A DevOps Survival Guide
Part -10
So far, in our Kubernetes journey, we have written many manifest files for resources like Deployments, Services, HPA, DaemonSets, and more in Kubernetes.
But let’s be honest for a moment.
Managing one or two YAML files is easy. But what happens in real-world projects?
In production environments, we usually work with multiple microservices, and each service may have several manifest files — deployments, services, configmaps, secrets, autoscalers, and more.
Very quickly, this turns into something like:
service-a-deployment.yaml
service-a-service.yaml
service-a-hpa.yaml
service-b-deployment.yaml
service-b-service.yaml
service-b-configmap.yaml
Managing all these YAML files manually becomes messy, repetitive, and hard to maintain.
This is where Helm comes to the rescue.
Helm helps us package, manage, and deploy Kubernetes applications easily using reusable templates called Helm Charts.
In this article, we will learn how Helm simplifies Kubernetes deployments and saves us from YAML chaos.
What is HELM?
Helm is a powerful package manager for Kubernetes that bundles multiple manifest files together and simplifies the application deployment process.
Helm simplifies the process of deploying, updating, and managing application lifecycles by packaging them into Helm Charts. These charts include all the necessary configuration files and settings, making it easy to deploy and manage even complex applications in Kubernetes.
There are mainly of two components in helm v3
Helm Client
The Helm Client is the command-line tool (CLI) that users interact with. It helps you work with Helm and Kubernetes.
It is responsible for:
Managing Charts Locally – Creating and managing Helm charts on your local system.
Finding Charts – Searching and downloading charts from Helm repositories.
Application Lifecycle – Installing, upgrading, and uninstalling applications in a Kubernetes cluster.
Managing Repositories – Adding, removing, and updating Helm repositories.
Helm Library
The Helm Library works in the background and performs the main tasks needed to deploy applications in Kubernetes.
It is responsible for:
Kubernetes API Communication – Interacts with the Kubernetes API to deploy and manage applications.
Template Rendering – Combines Helm chart templates with values from the values.yaml file to generate Kubernetes manifests.
State Management – Stores the application state inside Kubernetes itself, so no external database is needed.
As mentioned earlier, managing multiple Kubernetes manifest files can quickly become complicated. Helm helps solve this problem by packaging all the required resources into a single unit.
Let’s now see how Helm achieves this and understand the key components involved in it.
1. Templates
Purpose:
Templates define the Kubernetes resources required for the application, such as Deployments, Services, ConfigMaps, etc.
Dynamic Configuration:
Templates use the Go templating language, which allows us to dynamically configure Kubernetes objects.
For example, we can dynamically set:
Number of replicas
Container images
Resource limits
These values are taken from the values.yaml file during installation.
2. Values (values.yaml)
Purpose:
The values.yaml file contains the default configuration values for the application.
Centralized Configuration:
It acts as a single place to define all configurable parameters.
Overrides:
During installation, these default values can be overridden to customize deployments for different environments like dev, test, or production.
3. Chart.yaml
Purpose:
This file contains the metadata information about the chart.
Information included:
Name – Name of the chart
Version – Chart version for tracking updates
Description – Short description of the chart
Dependencies – Other charts required for this chart to work
This helps in version management and dependency management.
4. values.schema.json (Optional)
Purpose:
This file is used to validate the values provided in values.yaml.
Validation:
It ensures the values passed during installation are correct in structure and data type, helping prevent deployment errors.
Install HELM
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
helm version
Lets' Deploy a application using HELM
helm create rama
Go into rama folder, Now we can see rama folder will gets created.
Enter into the folder and open values.yml file
Change the service type from ClusterIP to NodePort on line 55
Change the image name from nginx to your-docker-image
Change the appVersion: “1.16.0” to “latest” on Chart.yaml file (this represents that image tag")
To install helm
helm install rama .
--atomic: Automatically rolls back the installation if any part fails, preventing partial installations.--dependency-update: Updates chart dependencies before installation.--dry-run: Simulates the installation without deploying, showing what will happen.--namespace <namespace>: Installs the chart into a specified namespace.--set <key>=<value>: Overrides a specific value in thevalues.yamlfile.--values <values.yaml>: Uses an alternative values file for the installation.
To get helm release list
helm ls
Now update anything in values.yaml like image or replicas
helm upgrade rama .
To rollback to prev revision
helm rollback rama 1
To uninstall helm
helm uninstall rama
To see the history
helm history rama
To add a repo
helm repo add [REPO_NAME] [REPO_URL]
To update repo
helm repo update
Helm Rollback Real Scenario
Example:
If a new deployment causes application failure, we check the Helm history and rollback to the previous stable revision.
helm history myapp
helm rollback myapp 5
Conclusion
In short, Helm turns the chaos of dozens (or hundreds) of raw Kubernetes YAMLs into manageable, reusable packages. By grouping resources into charts, parameterizing configuration with values.yaml, and providing lifecycle commands (install, upgrade, rollback), Helm makes deployments predictable, repeatable, and easier to maintain. Adopted properly, it reduces duplication, enforces consistency across environments, and streamlines CI/CD workflows.
Key takeaways and next steps:
Use charts to encapsulate each microservice and share common patterns via chart dependencies or umbrella charts.
Keep templates clean and minimal; move environment-specific values to values files and avoid hard-coding.
Validate charts early with linting (helm lint), testing (helm test), and local dry-runs (helm install --dry-run --debug).
Store and version charts in a chart repository (e.g., ChartMuseum, OCI registries) and apply semantic versioning for releases.
Handle secrets and sensitive values securely (SOPS, sealed-secrets, external secret stores), and integrate Helm into your CI/CD pipeline for automated, auditable deployments.
Start small: create a chart with helm create, iterate on templates and values, test in staging, then roll out to production.
Helm won’t remove all operational complexity, but it gives you the tools to tame YAML sprawl and build a more maintainable, scalable deployment process.
If you found this guide useful, please like ❤️, comment, and share your thoughts or questions. Stay tuned for the next part, where we'll explore advanced Docker concepts and practices.
Thank you,
Yours, Rama Grandhi