Kubernetes

Helm Kubernetes: Streamlined App Deployment with Package Manager

Helm Kubernetes: Streamlined App Deployment with Package Manager

Direct Answer

Helm is the de facto package manager for Kubernetes, simplifying the deployment, updating, and management of complex applications through “Charts.” These are pre-configured packages of Kubernetes resources that can be customized via a single values.yaml file.

| Key Feature | Description | Operational Benefit |

|—|—|—|

| Charts | Pre-configured Kubernetes resource packages | Deploy complex applications with a single command |

| values.yaml | Configuration file to customize Charts | Flexible and reusable deployments |

| helm upgrade --atomic | Updates with automatic rollback | Reduced downtime and error risk |

| Repositories | Public and private Chart catalogs | Access to a vast library of tested software |

| Templating | Dynamic generation of Kubernetes manifests | Standardization and boilerplate reduction |

Narrative Introduction

I still remember when every new application deployment on Kubernetes felt like an odyssey. We had an application comprising a dozen microservices, each with its own Deployment, Service, Ingress, ConfigMap, and PersistentVolumeClaim. This meant managing over 30 different YAML files, each with its specific configurations and dependencies. Every time we needed to update a single Docker image, it was a manual process of editing at least 8 YAML files. The risk of errors was extremely high, the time spent enormous, and team frustration palpable. One day, a colleague remarked, “We need something that does for Kubernetes what apt does for Debian.” That statement marked the beginning of our Helm adoption. With Helm, what once required hours of work and dozens of files now resolves with a single values.yaml and one command. It’s the difference between an infrastructure that manages you and an infrastructure that you manage, efficiently and controllably.

Prerequisites / Test Environment

To follow this guide, you will need:

  • A functional Kubernetes cluster (minikube, kind, or a cloud cluster like EKS/AKS/GKE).
  • The kubectl tool configured to communicate with your cluster.
  • A Linux or macOS environment to install Helm.

What is Helm and Why It Changes Kubernetes Management

Helm is an open-source tool that acts as a package manager for Kubernetes. Instead of manually managing dozens of YAML files to deploy a complex application, Helm allows you to bundle all necessary resources into a single package called a “Chart.” These Charts are configurable templates that define the entire application, including dependencies, services, deployments, and configurations. Helm’s primary goal is to simplify the process of installing, updating, and managing applications in your Kubernetes cluster. According to the CNCF, 85% of companies using Kubernetes with over 1,000 nodes rely on Helm for application management (CNCF Survey 2024).

This approach offers several benefits:

  • Repeatability: You can deploy the same application with different configurations across various environments (dev, staging, prod).
  • Standardization: Teams can define standards for their deployments, reducing the need to reinvent the wheel.
  • Lifecycle Management: Installing, updating, rolling back, and uninstalling applications becomes a simple and reliable process.
  • Sharing: Charts can be easily shared, both internally and via public repositories like those offered by Bitnami or Artifact Hub.

Installing Helm and Configuring Repositories

Installing Helm is a straightforward process. On Linux or macOS systems, you can use your system’s package manager or the official script.

# Install on Linux/macOS
curl -fsSL https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

# Verify installation
helm version

Once Helm is installed, the next step is to add Chart repositories. These repositories are collections of predefined Charts you can use to deploy common applications without configuring them from scratch. Bitnami offers one of the most popular repositories.

# Add the Bitnami repository
helm repo add bitnami https://charts.bitnami.com/bitnami

# Update the repository index to get the latest data
helm repo update

# Search for a Chart (e.g., Nginx)
helm search repo nginx

This gives you access to hundreds of ready-to-use applications, from databases to web servers, all configurable via values.yaml.

helm install, upgrade, rollback — The Core Workflow

The heart of Helm operations lies in three main commands, covering the entire application lifecycle.

helm install: The First Deployment

To install a new application, use helm install. This command deploys the specified Chart into your Kubernetes cluster. You can customize the deployment by providing a values.yaml file or overriding individual values directly from the command line.

# Install Nginx from Bitnami with a release name 'my-nginx'
helm install my-nginx bitnami/nginx

# Install Nginx by customizing values via a values.yaml file
# Example values.yaml:
# replicaCount: 2
# service:
#   type: LoadBalancer
#   port: 80
helm install my-app bitnami/nginx -f values.yaml

helm upgrade: Updates and Modifications

When you need to update the application — to change configuration, Docker image version, or add new features — use helm upgrade. This command applies changes to the existing deployment.

A crucial option is --atomic, which ensures that if the upgrade fails for any reason (e.g., new pods don’t start), Helm automatically rolls back to the previous working version. This significantly reduces risks during production updates.

# Perform an upgrade of the 'my-app' application with a new values.yaml
helm upgrade my-app bitnami/nginx -f new-values.yaml

# Perform an upgrade with automatic rollback in case of failure
helm upgrade my-app bitnami/nginx -f new-values.yaml --atomic --timeout 5m

The timeout is important to give Kubernetes time to start new pods and for Helm to verify their health before declaring the upgrade successful.

helm rollback: Safely Reverting

If an upgrade doesn’t go as planned or introduces unforeseen issues, helm rollback allows you to quickly revert to a previous, stable version of the application.

# View available revisions for a release
helm history my-app

# Rollback to revision 1 (replace the number with the desired revision)
helm rollback my-app 1

This rollback capability is a lifesaver in production environments, where every minute of downtime incurs a high cost. A 2025 study found that 40% of production software rollbacks are caused by misconfigurations (DevOps Institute Report 2025).

values.yaml: Parameterizing Deployments

The values.yaml file is at the core of Helm’s flexibility. It contains all the variables and parameters that can be customized for a Chart. Every Chart has a default values.yaml, but you can create your own file to override these values.

Example of a values.yaml for an Nginx application:

# Custom values.yaml for Nginx
replicaCount: 3

image:
  repository: nginx
  tag: 1.25.3
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: true
  className: nginx
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  hosts:
    - host: myapp.example.com
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []

resources:
  limits:
    cpu: 200m
    memory: 256Mi
  requests:
    cpu: 100m
    memory: 128Mi

When you run helm install or helm upgrade with the -f values.yaml option, Helm takes your file and merges it with the Chart’s default values.yaml, applying your customizations.

Creating Your Own Helm Chart from Scratch

For custom applications or to standardize internal deployments, creating your own Charts is beneficial. Helm provides a command to generate a Chart skeleton.

# Create a new Chart named 'my-custom-app'
helm create my-custom-app

# The resulting structure will be:
# my-custom-app/
#   Chart.yaml          # Chart information
#   values.yaml         # Default values for the Chart
#   charts/             # Chart dependencies (subcharts)
#   templates/          # Kubernetes YAML files with Go templates
#     _helpers.tpl      # Reusable Go template functions
#     deployment.yaml
#     service.yaml
#     ingress.yaml
#     serviceaccount.yaml
#     ... other manifests ...

In the templates/ directory, you can define your Kubernetes resources using Go template syntax. This allows you to inject values from values.yaml or other sources, making your manifests dynamic and reusable. For example, for replicaCount in deployment.yaml, you would use {{ .Values.replicaCount }}.

Helmfile: Managing Multiple Charts as Infrastructure

As your Kubernetes environment grows in complexity and you need to manage dozens or hundreds of Helm releases, Helmfile becomes an indispensable tool. Helmfile allows you to define all your Helm releases and their values.yaml in a single YAML file, managing them as “Infrastructure as Code.”

Example helmfile.yaml:

# helmfile.yaml
releases:
  - name: ingress-nginx
    namespace: ingress
    chart: ingress-nginx/ingress-nginx
    version: 4.8.3
    values:
      - ingress-nginx-values.yaml

  - name: prometheus
    namespace: monitoring
    chart: prometheus-community/prometheus
    version: 19.3.0
    values:
      - prometheus-values.yaml

  - name: my-custom-app
    namespace: default
    chart: ./charts/my-custom-app
    values:
      - my-custom-app-values.yaml

With Helmfile, you can run helmfile apply and deploy or update all your applications with a single command, ensuring consistency and reducing manual errors. This is particularly useful in enterprise environments, where managing hundreds of microservices is the norm.

Debugging: helm template, helm lint, helm diff

Debugging is a crucial part of any deployment process. Helm offers powerful tools to identify and resolve issues before they cause production outages.

helm template: Viewing Rendered Manifests

Before an helm install or helm upgrade, it’s good practice to view the final output of the Kubernetes manifests that Helm will generate. This allows you to verify that all values have been correctly substituted and that resources are configured as expected.

# View rendered manifests for the 'my-app' Chart with specified values
helm template my-app ./my-custom-app -f values.yaml

This command does not interact with the cluster but prints the YAML output to the console, making it safe for testing and verification.

helm lint: Chart Syntax Validation

helm lint analyzes your Chart to identify syntax issues, common errors, and unaddressed best practices. It’s like a linter for YAML code and Go templates, helping you write robust and standards-compliant Charts.

# Lint the 'my-custom-app' Chart
helm lint ./my-custom-app

helm diff: Comparing Changes Before Application

helm diff (often available via a plugin) is an invaluable tool that shows the differences between a release’s current state in the cluster and the result of applying a new Chart or new values.yaml. This gives you a preview of the changes that will be made, allowing you to approve or modify them before running an helm upgrade.

# Example usage (requires the helm-diff plugin)
helm diff upgrade --allow-unreleased my-app bitnami/nginx -f new-values.yaml

Common Errors and Troubleshooting

  • Error: UPGRADE FAILED: "my-app" has no deployed releases: This usually means you’re trying to upgrade a release that hasn’t been installed or has been uninstalled. Verify the release name and status with helm list.
  • RBAC permission issues: Helm needs sufficient permissions to create, modify, and delete resources in the cluster. If you encounter authorization errors, check the ServiceAccount, Role, and RoleBinding used by Helm or your kubectl user.
  • Malformed values.yaml: An indentation error or an invalid value in values.yaml can cause problems. Use a YAML editor with validation or helm lint to identify these errors.
  • Docker images not found: If your deployment fails because Kubernetes cannot pull an image, verify that the image name and tag are correct and that the cluster has access to the registry. Pull policies (Always, IfNotPresent, Never) are important for how Kubernetes handles image caching.

FAQ — Frequently Asked Questions

What is a Helm Chart?

A Helm Chart is a package containing all the Kubernetes resource definitions needed to deploy an application, including Deployments, Services, ConfigMaps, Ingress, and more. It’s a configurable template that simplifies the installation and management of complex software on Kubernetes, making deployments repeatable and standardized.

What is the difference between Helm and Kustomize?

Hem and Kustomize are both tools for managing Kubernetes configurations but with different approaches. Helm uses a “package manager” model with Go template-based Charts to deploy complete applications. Kustomize, on the other hand, focuses on “customizing” existing YAML manifests through overlays, without using templating, and is ideal for small modifications to existing deployments or integrating a common application into different environments.

Can I use Helm to deploy different applications to multiple namespaces?

Absolutely. Helm allows you to specify the namespace for each release during installation (helm install my-app bitnami/nginx --namespace my-namespace). This is fundamental for organizing your applications within the cluster and for applying namespace-based security policies.

How do I manage dependencies between Charts?

Hem supports dependencies between Charts. You can include other Charts as “subcharts” within your main Chart. This is useful when your application relies on other services (e.g., a database) that you want to deploy together. Dependencies are specified in the main Chart’s Chart.yaml file.

Conclusions with Operational Takeaways

Helm has transformed how we manage Kubernetes applications, shifting from a manual, error-prone process to an automated, reliable workflow. Adopting Helm means investing in standardization, repeatability, and ultimately, the stability of your operations. The ability to define entire applications as Charts, customize them with values.yaml, and manage them with simple commands like install, upgrade, and rollback is a game-changer for any DevOps team. In enterprise environments, where complexity is the norm, tools like Helmfile further extend this capability, allowing you to treat your entire cluster infrastructure as code.

Operational Takeaways:

  1. Start with public repositories: Leverage Charts from Bitnami or other repositories to quickly deploy standard software.
  2. Customize with values.yaml: Never directly modify downloaded Charts; always use a values.yaml file for your configurations.
  3. Adopt helm upgrade --atomic: Reduce the risk of failed production deployments thanks to automatic rollback.
  4. Use helm template and helm lint for debugging: Verify your Charts and rendered output before applying changes to the cluster.
  5. Consider Helmfile: For managing complex environments with many releases, Helmfile is indispensable for Infrastructure as Code.

Read also: Advanced Kubernetes Debugging: Containers in Crash

Read also: CI/CD Pipeline Sicura: Checklist 12 Punti per GitLab e GitHub Actions (2026)

Read also: SSH Hardening Linux: Complete Guide 2026 (10 Critical Settings)

Updated: July 2026

Share this article:

Written by

Rosario Giordano

Rosario Giordano is a system administrator and IT consultant specializing in cybersecurity and cloud, with over 20 years of experience managing enterprise Linux infrastructures. His areas of expertise include SSH hardening, Kubernetes platforms, PostgreSQL databases, VMware/ Proxmox virtualization, and compliance with NIS2 and ISO 27001 security frameworks