<p>We have multiple(20+) services running inside docker containers which are being managed using Kubernetes. These services include databases, streaming pipelines and custom applications. We want to make this product available as an on-premises solution so that it can be easily installed, like a <em>one-click</em> installation sort of thing, hiding all the complexity of the infrastructure.</p>

<p>What would be the best way of doing this? Currently we have scripts managing this but as we move into production there will be frequent upgrades and it will become more and more complex to manage all the dependencies.</p>

<p>I am currently looking into <strong>helm</strong> and am wondering if I am exploring in the right direction. Any guidance will be really helpful to me. Thanks.</p>

<p>Helm seems like the way to go, but what you need to think about in my opinion is more about how will you deliver updates to your software. For example, will you provide a single 'version' of your whole stack, that translates into particular composition of infra setup and microservice versions, or will you allow your customers to upgrade single microservices as they are released. You can have one huge helm chart for everything, or you can use, like I do in most cases, an "umbrella" chart. It contains subcharts for all microservices etc.</p>

<p>My usual setup contains a subchart for every service, then services names are correctly namespaced, so they can be referenced within as <code>.Release.Name-subchart[-optional]</code>. Also, when I need to upgrade, I just upgraed whole chart with something like <code>--reuse-values --set subchart.image.tag=v1.x.x</code> which gives granular control over each service version. I also gate each subcharts resources with <code>if .Values.enabled</code> so I can individualy enabe/diable each subcharts resources.</p>

<p>The ugly side of this, is that if you do want to release single service upgrade, you still need to run the whole umbrella chart, leaving more surface for some kind of error, but on the other hand it gives this capability to deploy whole solution in one command (the default tags are <code>:latest</code> so clean install will always install latest versions published, and then get updated with tagged releases)</p>
