Helm (helm.sh) defines itself as The package manager for Kubernetes, at first I thought that was a bold statement, but after thinking about it for a moment, I don’t think I know any other real package manager.
Let’s look together at the functionalities that make Helm a package manager.
During my Adventures in Kubeland video series, I’m going through the CNCF landscape tools; in one of the last episodes (full video below) I looked at Helm and was surprised to see the above definition on their website.
Artifacthub is the central hub where one can find most Charts.
Everyone can virtually publish charts to the registry, search charts, see which ORG published the Chart, and even get more information with the labels at the bottom of each chart. eg. “Verified Publisher”
But that’s just a Hub, the Charts are hosted in their registries. eg.
argocd: https://argoproj.github.io/argo-helm cert-manager: https://charts.jetstack.io dex: https://charts.dexidp.io istio: https://istio-release.storage.googleapis.com/charts prometheus: https://prometheus-community.github.io/helm-charts opentelemetry: https://open-telemetry.github.io/opentelemetry-helm-charts zot: https://zotregistry.io/helm-charts/
Helm allows you to define dependencies between charts, the dependencies can be listed in the
Chart.yaml file, and you can manage them via
helm dependecy <command> .
The dependencies follow semantic release and can reference different registries.
# Chart.yaml dependencies: - name: nginx version: "1.2.3" repository: "https://example.com/charts" - name: memcached version: "3.2.1" repository: "https://another.example.com/charts"
I like to use this functionality to wrap external charts when using ArgoCD. For this particular use case, it’s useful to know that an alias can be defined for the dependencies.
Each Chart Must have a version specified in the
Chart.yaml file, the version is verified when using packages as defined in the official documentation 👇
versionfield inside of the
Chart.yamlis used by many of the Helm tools, including the CLI. When generating a package, the
helm packagecommand will use the version that it finds in the
Chart.yamlas a token in the package name. The system assumes that the version number in the chart package name matches the version number in the
Chart.yaml. Failure to meet this assumption will cause an error.
appVersion should not be confused with the
version field above.
appVersionrefers to the version of the application the chart is installing, suppose you are installing the nginx Chart in the image above, you can see that the
appVersionand so nginx version is
Helm IS more than a package manager
Given the above seems fair to me to say that Helm IS a package manager, but we can also say that Helm is way more than JUST a package manager since it also offers functionalities like:
Helm allows you to template your Kubernetes resources and via the go templates engine implement complex logic to manipulate values and resources using the embedded functions (https://helm.sh/docs/chart_template_guide/function_list/).
Helm supports tests (https://helm.sh/docs/topics/chart_tests/) to validate that your chart works as expected when it is installed.
Hooks (https://helm.sh/docs/topics/charts_hooks/) are a mechanism to allow chart developers to intervene at certain points in a release’s life cycle.
Library Charts: https://helm.sh/docs/topics/library_charts/
Helm Provenance and Integrity: https://helm.sh/docs/topics/provenance/
Storage Backends: https://helm.sh/docs/topics/advanced/#storage-backends
Best Practices: https://helm.sh/docs/chart_best_practices/