Helm Dependency is a critical part of understanding how Helm works as it is the way to establish relationships between different helm packages. We have talked a lot here about what Helm is, and some topics around that, and we even provided some tricks if you create your charts.
So, as commented, Helm Chart is nothing more than a package that you put around the different Kubernetes objects that need to be deployed for your application to work. The usual comparison is that it is similar to a Software Package. When you install an application that depends on several components, all of those components are packaged together, and here is the same thing.
What is a Helm Dependency?
A Helm Dependency is nothing more than the way you define that your Chart needs another chart to work. For sure, you can create a Helm Chart with everything you need to deploy your application, but something you would like to split that work into several charts just because they are easy to maintain or the most common use case because you want to leverage another Helm Chart that is already available.
One use case can be a web application that requires a database, so you can create on your Helm Chart all the YAML files to deploy your web application and your Database in Kubernetes, or you can have your YAML files for your web application (Deployment, Services, ConfigMaps,…) and then say: And I need a database and to provide it I’m going to use this chart.
This is similar to how it works with the software packages in UNIX systems; you have your package that does the job, like, for example, A, but for that job to be done, it requires the library L, and to ensure that when you are installing A, Library L is already there or if not it will be installed you declare that your application A depends on Library L, so here is the same thing. You declare that your Chart depends on another Chart to work. And that leaves us to the next point.
How do we declare a Helm Dependency?
This is the next point; now that we understand what a Helm Dependency is conceptually and we have a use case, how can we do that in our Helm Chart?
All the work is done in the Chart.yml file. If you remember, the Chart.yml file is the file where you declare all the metadata of your Helm Chart, such as the name, the version of the chart, the application version, location URL, icon, and much more. And usually has a structure like this one:
apiVersion: v2 name: MyChart description: My Chart Description type: application version: 0.2.0 appVersion: "1.16.0"
So here we can add a section
dependencies and, in that section is where we are going to define the charts that we depend on. As you can see in the snippet below:
apiVersion: v2 name: MyChart description: My Chart Description type: application version: 0.2.0 appVersion: "1.16.0" dependencies: - name: Dependency version: 1.0.0 repository: "file:///location_of_my_chart"
Here we are declaring Dependency as our Helm Dependency. We specify the version that we would like to use (similar to the version we say in our chart), and that will help us to ensure that we will provide the same version that has been tested as part of the resolution of the dependency and also the location using an URL that can be an external URL is this is pointing to a Helm Chart that is available on the internet or outside your computer or using a File Path in case you are pointing to a local resource in your machine.
That will do the job of defining the helm dependency, and this way, when you install your chart using the command
helm install, it will also provide the dependence.
How do I declare a Helm Conditional Dependency?
Until now, we learned how to declare a dependency, and each time I provision my application, it will also provide the dependence. But usually, we would like to have a fine-grained approach to that. Imagine the same scenario as above: We have our Web Application that depends on the Database, and we have two options, we can provision the database as part of the installation of the web application, or we can point to an external database and in that case, it makes no sense to provision the Helm Dependency. How can we do that?
So, easy, because one of the optional parameters you can add to your dependency is
condition and do exactly that,
condition allow you to specify a flag in your
values.yml that in the case is equal to true, it will provide the dependency but in the case is equal to
false it will skip that part similar to the snippet shown below:
apiVersion: v2 name: MyChart description: My Chart Description type: application version: 0.2.0 appVersion: "1.16.0" dependencies: - name: Dependency version: 1.0.0 repository: "file:///location_of_my_chart" condition: database.enabled
And with that, we will set the enabled parameter under database in our values.yml to true if we would like to provision it.
How do I declare a Helm Dependency With a Different version?
As shown in the snippets above, we offer that when we declare a Helm Dependency, we specify the version; that is a safe way to do it because it ensures that any change done to the helm chart will not affect your package. Still, at the same time, you cannot be aware of security fixes or patches to the chart that you would like to leverage in your deployment.
To simplify that, you have the option to define the version in a more flexible way using the operator ~ in the definition of the version, as you can see in the snippet below:
apiVersion: v2 name: MyChart description: My Chart Description type: application version: 0.2.0 appVersion: "1.16.0" dependencies: - name: Dependency version: ~1.0.0 repository: "file:///location_of_my_chart" condition: database.enabled
This means that any patch done to the chart will be accepted, so this is similar that this chart will use the latest version of 1.0.X. Still, it will not use the 1.1.0 version, so that allows to have more flexibility, but at the same time keeping things safe and secured in case of a breaking change on the Chart you depend on. This is just one way to define that, but the flexibility is enormous as the Chart versions use “Semantic Versions,” You can learn and read more about that here: https://github.com/Masterminds/semver.