Skip to main content

Command Palette

Search for a command to run...

Understanding Helm: Simplifying Kubernetes Application Management

Updated
7 min read

Introduction: Setting the Stage with Kubernetes

Kubernetes has become the de facto standard for orchestrating containerized applications. However, as powerful as Kubernetes is, managing its complex configurations—like YAML manifests for deployments, services, and ingresses—can be overwhelming. This is where Helm, the Kubernetes package manager, steps in. Helm provides a way to package, deploy, and manage Kubernetes applications efficiently, making it an essential tool for developers and DevOps engineers.


What is Helm?

Helm is a package manager for Kubernetes. It helps you define, install, and upgrade even the most complex Kubernetes applications. Think of it as npm or pip but for Kubernetes clusters.

At its core, Helm uses Charts - a collection of files that describe a related set of Kubernetes resources. A chart is a packaged application containing:

  • Kubernetes manifests (YAML files)

  • Templates for dynamic configuration

  • Metadata about the package


Why Use Helm?

  1. Simplified Application Management
    Helm abstracts away the complexity of managing multiple Kubernetes resources. With a single Helm command, you can deploy an entire application stack.

  2. Reusability
    Charts can be reused across environments or shared with the community. This reduces duplication and speeds up development.

  3. Configuration Management
    Helm uses a templating engine, allowing you to parameterize configurations. This means you can use the same chart for development, staging, and production with different values.

  4. Rollbacks and Upgrades
    Helm maintains a history of your deployments, enabling you to roll back to a previous version with ease.

  5. Community Ecosystem
    Helm has an extensive ecosystem of pre-built charts for popular applications like MySQL, Nginx, and Prometheus. You don’t have to reinvent the wheel—just customize an existing chart.


How Helm Works

Helm Components

  • Helm CLI: The command-line tool that you interact with to manage your applications.

  • Helm Chart: A package containing Kubernetes YAML manifests and templates.

  • Helm Repository: A central location where charts are stored and shared.

Basic Workflow

  1. Install Helm CLI

     brew install helm  # For macOS
     apt-get install helm  # For Ubuntu
    
  2. Add a Chart Repository

     helm repo add stable https://charts.helm.sh/stable
     helm repo update
    
  3. Search for a Chart

     helm search repo nginx
    
  4. Install a Chart

     helm install my-nginx stable/nginx-ingress
    
  5. Upgrade or Update

     helm upgrade my-nginx stable/nginx-ingress --set controller.replicaCount=2
    
  6. Rollback

     helm rollback my-nginx 1
    

Anatomy of a Helm Chart

A Helm chart is structured as follows:

mychart/
  Chart.yaml      # Metadata about the chart
  values.yaml     # Default configuration values
  templates/      # Kubernetes manifests with placeholders
  README.md       # Documentation for the chart

Example Chart.yaml

apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
version: 0.1.0

Example values.yaml

replicaCount: 3
image:
  repository: nginx
  tag: stable

Template Example (templates/deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-nginx
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
      - name: nginx
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}

You can reference variables from values.yaml using {{ .Values.<key> }} syntax.


Visualizing Helm’s Workflow

Below is a simplified diagram of Helm’s deployment process:

+--------------------+
|    Helm Chart      |
+--------------------+
         |
         v
+--------------------+        +----------------------+
|  Helm Templating   | -----> | Kubernetes Manifests |
+--------------------+        +----------------------+
         |
         v
+--------------------+        +----------------------+
|    Helm Release    | -----> |   Kubernetes Cluster |
+--------------------+        +----------------------+

Real-World Use Cases

Deploying a Microservices Architecture

Using Helm, you can package each microservice as a chart and manage its lifecycle independently:

  • Chart for service A:

    • Deployment, Service, ConfigMap.
  • Chart for service B:

    • Deployment, Service, Secrets.

Install services independently:

helm install service-a ./charts/service-a
helm install service-b ./charts/service-b

Managing a CI/CD Pipeline

Integrate Helm with Jenkins or GitLab CI to automate deployments:

  • Build container images.

  • Update values.yaml with the new image tag.

  • Use helm upgrade to deploy changes:

      helm upgrade my-app ./chart --set image.tag=new-version
    

Best Practices

  1. Version Control for Charts

    • Store your Helm charts in a Git repository alongside your application code.
  2. Use Values Files

    • Define separate values.yaml files for each environment (e.g., values-dev.yaml, values-prod.yaml).
  3. Chart Linting

    • Use helm lint to validate your chart structure before deploying.
  4. Secure Secrets

    • Avoid hardcoding sensitive information in values.yaml. Use Kubernetes secrets or external secret management tools.

How Helm Templates Work

Helm’s core strength lies in its templating engine. Helm templates use the Go templating language, which allows for dynamic configuration of Kubernetes manifests. By leveraging templates, you can create reusable charts that adapt to different scenarios.

Key Features of Helm Templates:

  1. Conditionals and Loops:

    • Use if, else, and range to control the rendering of templates dynamically.

    • Example:

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: {{ .Release.Name }}-nginx
        spec:
          replicas: {{ .Values.replicaCount }}
          template:
            spec:
              containers:
              {{- range .Values.containers }}
              - name: {{ .name }}
                image: {{ .image }}
              {{- end }}
      
  2. Helpers:

    • Encapsulate commonly used template code in _helpers.tpl files for reusability.

    • Example:

        {{- define "app.fullname" -}}
        {{ .Release.Name }}-{{ .Chart.Name }}
        {{- end }}
      
  3. Pipeline Operations:

    • Apply functions in a pipeline to manipulate data within templates.

    • Example:

        metadata:
          labels:
            app: {{ .Chart.Name | lower }}
      

Values and Overrides

Helm’s values.yaml file contains default configuration values for a chart. These values can be overridden using:

  • Command-line flags:

      helm install my-app ./mychart --set replicaCount=5
    
  • Custom values files:

      helm install my-app ./mychart -f custom-values.yaml
    

This layering of values ensures flexibility and allows teams to maintain environment-specific configurations without modifying the base chart.


Releases and Rollbacks

Helm tracks the state of each deployment as a release, stored in the Kubernetes cluster. Releases offer:

  1. Versioning:

    • Each update to a release creates a new revision.

    • Use helm list to view all releases and their statuses.

  2. Rollback:

    • Revert to a previous release if an update fails or introduces issues.

    • Example:

        helm rollback my-release 2
      
  3. Release History:

    • Inspect past deployments with helm history for better auditing.

Helm Plugins

Helm supports a plugin system that extends its functionality. Plugins are community-developed tools that can be installed directly using helm plugin install.

  1. Secrets Plugin:

    • Helps encrypt secrets in Helm charts using tools like SOPS.

    • Example:

        helm secrets enc values.yaml
      
  2. Diff Plugin:

    • Displays differences between the current state of the cluster and the proposed changes.

    • Example:

        helm diff upgrade my-release ./mychart
      
  3. Helmfile Integration:

    • Manages multiple Helm releases declaratively using a single helmfile.yaml.

Best Practices for Using Helm

To get the most out of Helm, follow these best practices:

  1. Use Subcharts for Modularization:

    • Break down complex charts into smaller, reusable subcharts stored in the charts/ directory.
  2. Automate Linting and Testing:

    • Validate charts with helm lint and test installations using helm test.
  3. Handle Secrets Securely:

    • Avoid storing secrets in values.yaml files. Use Kubernetes secrets or encrypted files.
  4. Chart Repositories:

    • Host and share your charts using tools like ChartMuseum or GitHub Pages.

Debugging with Helm

Troubleshooting Helm deployments is made easier with its built-in debugging tools:

  1. Dry Run:

    • Preview a chart installation without applying changes to the cluster.

    • Example:

        helm install my-release ./mychart --dry-run --debug
      
  2. Inspect Resources:

    • Use kubectl get and kubectl describe to inspect the resources created by Helm.
  3. Logs and Events:

    • Examine logs for errors or warnings using:

        kubectl logs <pod-name>
        kubectl get events
      

Helm Ecosystem and Chart Repositories

Helm has a rich ecosystem of publicly available charts hosted in repositories like:

  • ArtifactHub: A central hub for discovering Helm charts.

  • Bitnami: A trusted source for production-ready charts for popular applications.

  • Stable Repo (deprecated): Formerly hosted by Helm, now maintained by individual projects.

Creating a Custom Repository:

You can host your own Helm repository:

  1. Package the chart:

     helm package ./mychart
    
  2. Generate an index.yaml file:

     helm repo index ./charts
    
  3. Host it on a web server or static site like GitHub Pages.


Helm’s Future

Helm continues to evolve as the Kubernetes ecosystem matures. Upcoming features include:

  • OCI Support: Helm now supports OCI (Open Container Initiative) registries for storing and distributing charts.

  • Enhanced Security: With tools like TUF (The Update Framework) for verified chart signatures.


Conclusion

Helm is not just a tool—it’s a paradigm shift for managing Kubernetes resources. By abstracting the complexity of resource management, Helm empowers software engineers to focus on building and deploying applications efficiently.

Whether you’re working on a microservices architecture, deploying CI/CD pipelines, or managing third-party applications, Helm provides a robust and scalable solution tailored to modern Kubernetes workloads.

Take the plunge, explore the Helm ecosystem, and bring your Kubernetes workflows to the next level!

More from this blog

T

The Code Console by Himanshu Nikhare | Software Development, Automation, and Tech Insights

25 posts

A curious builder on a journey to turn ideas into code. Learning by doing, debugging through chaos, and crafting solutions one experiment at a time—because every build starts with a console.log.