Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Cover image for My Love-Hate Relationship with Helm
Cyclops UI profile imageJuraj
Juraj forCyclops UI

Posted on

     

My Love-Hate Relationship with Helm

If you have been looking for a tool to deploy your applications into a Kubernetes cluster, you have definitely stumbled uponHelm. Its the most common Kubernetes configuration management tool out there.

Helm is a package manager for Kubernetes. This means you can group your deployments, services, ingresses, and all other Kubernetes resources into meaningful units. This means that a software vendor (for example, Grafana) can create a single Helm chart, and all users can simply installa gazillion of resources with a single command, knowing it’s going to work.

I think some parts of Helm are awesome, and some are often misused and introduce complications without much benefit.

If you have some running Helm releases in your Kubernetes cluster, this one is for you!

Support us 🙏

We know that Kubernetes can be difficult. That is why we created Cyclops, an open-source framework for building developer platforms on Kubernetes. Abstract the complexities of Kubernetes, and deploy and manage your applications through a customizable UI that you can fit to your needs.

We're developing Cyclops as an open-source project. If you're keen to give it a try, here's a quick start guide available on ourrepository. If you like what you see, consider showing your support by giving us a star ⭐

⭐ Star Cyclops on GitHub

support us with GH stars

What is Helm?

An application deployed to a Kubernetes cluster is usually not just a Deployment but a list of other Kubernetes resources like Configmaps, Secrets, Ingress, and many others. Instead of manually creating all of them time and time again, you could create aHelm chart that would define all of these resources in a single place, and then you can reproduce them when needed.

AHelm chart is a single Helm package. Grafana has its own Helm chart which defines all the resources you need to run it, MySQL has its own chart, and so on.

If you want to run a MySQL in your cluster you can simplyinstall the chart to your cluster and not think about specific resources. With that installation, you just created aHelm release. Releases track what has been installed in the cluster so you can check what Helm charts you installed later on.

In a Helm chart, Kubernetes resources are defined as templates that allow users to customize them without having to dive into each one. You can customize your releases using the values files that contain configuration, which would be injected into the resource templates to create Kubernetes manifests. And this is where the trouble with Helm begins.

Cons

I love the way Helm implemented their package management, but there are some things I’m not the biggest fan of.

A lot of YAML

YAML Configuration

Helm’s templating engine is great for abstracting and reusing configuration. But each time you encounter a new Helm chart, you will need to spend some time figuring out what you can and can’t configure.

values.yaml is usually a good place to start since there you can find the default configuration. But, not all configuration needs to be defined invalues.yaml, and you will need to dig through the docs (if there even is any) or, God forbid, the Helm templates to see how things map between values and templates.

There is no type safety, and you could easily make a typo in your configuration, resulting in an outage.

Configuration Persistence

When you install a Helm release, Helm will, by default, use values from thevalues.yaml. You can inject any values from a file or directly with the--set flag while runninghelm install, but that then begs the question ofwhat is actually deployed. Each time you want to upgrade your Helm release, you need to know exactly what is currently deployed to not override something by accident.

For example, you and your colleague are working on the same application deployed as a Helm release. Your colleague wants to set the number of replicas to 5:

helm upgrade my-release <helm repo>--setreplicas=5
Enter fullscreen modeExit fullscreen mode

After that, you want to bump the version of your application tolatest with the following command:

helm upgrade my-release <helm repo>--set image.tag=latest
Enter fullscreen modeExit fullscreen mode

You deployed a new version, but without knowing it,you have just overridden your colleague's changes and you are back to a single replica. Unless you check for the currently deployed values, you can’t be sure if you are overriding something deployed by somebody else(or even yourself a month ago).

Resource Overview

Once a release has been installed, you will likely want to check what resources have been deployed and whether they are running as expected. Helm solved it with thehelm status command that can list all the resources.

This is more a personal preference, but I find it strange to list deployed resources with thehelm cli and then dig deeper withkubectl. Ideally, I could check my resources from a single pane of glass.

Managing Helm Releases with Cyclops

Cyclops natively supports Helm charts and their deployment. It addresses the problems listed above and provides you with a custom UI for all of your Helm charts.

Instead of configuring your Helm charts via YAML, Cyclops will generate a UI based specifically on the Helm chart values. Since you are configuring your app through a form, you can now see all of the fields you can configure and be sure the values you provided are validated.

Instead of relying on Helm releases, Cyclops implements its ownCustom Kubernetes Resources called Modules, which reference Helm charts and keep all of your values persisted.

Since versionv0.17.0, Cyclops allows you to migrate your existing Helm releases to Cyclops Modules in a non-invasive fashion. It will just create a new Module for your application and delete the release without deleting or redeploying your applications.

hate YAML

Migrate to Cyclops

Cyclops can automatically pick up on all of your Helm releases currently running in the cluster and offers you the ability to migrate them toCyclops Modules. A Cyclops Module is a custom Kubernetes resource thatreferences a Helm chart andcontains all the values used to configure that chart.

With such an approach, you don’t have to worry about what value files you need to use, how those overlap… Instead, everything is in a single place defined declaratively. If you want to change any of the values, feel free to do it via Module YAML, in the Cyclops UI, or any other way you want.

Let’s migrate those releases!

Install Cyclops

First of all, you will need to install Cyclops into your running Kubernetes cluster. You can install Cyclops with the command below:

kubectl apply-f https://raw.githubusercontent.com/cyclops-ui/cyclops/v0.17.1/install/cyclops-install.yaml&& kubectl apply-f https://raw.githubusercontent.com/cyclops-ui/cyclops/v0.17.1/install/demo-templates.yaml
Enter fullscreen modeExit fullscreen mode

To access the cyclops-ui you can just port-forward its service, but for production usage you can expose it via an ingress or a load balancer.

kubectl port-forward svc/cyclops-ui-n cyclops 3000:3000
Enter fullscreen modeExit fullscreen mode

You can now access Cyclops athttp://localhost:3000/.

Migrating Helm releases

For the sake of the tutorial, I installed three Helm charts. If you don’t have any Helm releases installed to try the migration, you can install the official PostgreSQL chart with the following command:

helminstallmy-api-database oci://registry-1.docker.io/bitnamicharts/postgresql
Enter fullscreen modeExit fullscreen mode

When you open Cyclops, you can navigate toHelm releases in the sidebar to list what is currently deployed in your cluster.

Release list

From there, you can select any of your Helm releases and check Kubernetes resources deployed with that specific release.

Release details

When you are ready to migrate your release and use Cyclops modules, click theMigrate to Cyclops Module, which will open a pop-up where you can input the Helm chart reference. In this case, it would be the Bitnami git repo and itsPostgreSQL chart on themain branch.

Chart reference can also be a Helm repository or an OCI Helm chart.

Input template

Once you confirm the chart reference, Cyclops will pull it to verify it, and if the reference is valid, redirect you to a page where you can tweak the configuration before migrating to a Cyclops module.

Don’t worry; Cyclops will retain the configuration you previously had for your Helm release; this step only allows you to change it if needed.

Migration config

Once you are happy with your configuration, you can hitDeploy, and Cyclops will create a new Module with your template reference and all of the values you provided.

All previously deployed resources will remain unchanged, and none will be destroyed in the process. The only change that happened is that you now have a Module managing your resources.

With Cyclops, you now have a centralized place for your app configuration and can now view all of your resources and their status in a single place. Also, you and your colleagues are not stepping on each other's toes!

Future work

We at Cyclops plan to expand beyond supporting Helm and want to make our Modules support any kind of configuration language. Let us know what you are using (Kustomize, KPT, Cue…), and we would be happy to support it next!

If you enjoyed this article or found it helpful, join our Discord server, where we always let you know about the latest content, new developments, and news from our team!

⭐ Star Cyclops on GitHub

Top comments(19)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss
CollapseExpand
 
jineshnagori profile image
Jinesh Nagori
  • Joined
• Edited on• Edited

The Cyclops might be a good tool for managing the helm charts but here is my insights:

While it’s true that Helm uses values.yaml by default, and you can override values using a file or the --set flag, this is not necessarily a drawback. The --set flag is particularly useful for managing different environments without modifying the base chart.

Moreover, Helm provides ways to track deployed configurations. Commands like helm get values and helm history allow you to inspect the currently deployed values, reducing the risk of accidental overrides. Best practices, such as maintaining separate values.yaml files per environment, further mitigate this concern. Hence, this is not a fundamental limitation of Helm but rather a matter of managing configurations effectively.

Additionally, Helm provides validation mechanisms, such as helm lint, which can catch syntax errors and misconfigurations before deployment.

CollapseExpand
 
petarcvit profile image
Petar Cvitanović
Building Cyclops UI, passionate about Kubernetes and cloud technologies
  • Location
    Zagreb, Croatia
  • Work
    CTO @ Cyclops UI
  • Joined

I completely agree that what the tool does and how you use it are equally important.
However, will all developers be proficient with Helm (to understand and use the commands you mentioned) and will onboarding them to Helm (on top of Kubernetes) have a positive ROI?
Helm should be a part of your deployment process but not the only tool you use.

CollapseExpand
 
jineshnagori profile image
Jinesh Nagori
  • Joined

That’s a great point! While not all developers may be proficient with Helm initially, providing proper onboarding and best practices can help teams use it effectively. The learning curve is a valid consideration, but the automation and consistency Helm brings to Kubernetes deployments often justify the investment.

Additionally, integrating Helm with other tools, such as GitOps workflows (e.g., ArgoCD or Flux), can further streamline deployments and reduce the need for direct Helm interactions. Helm works best as part of a well-designed deployment strategy rather than a standalone solution.

CollapseExpand
 
ahoehma profile image
Andreas Höhmann
Ich entwickle mit Herzblut :D
  • Location
    Leipzig
  • Work
    Awesome iceman at Siemens AG
  • Joined

More of this please

CollapseExpand
 
karadza profile image
Juraj
CEO and co-founder of Cyclops

🫡

CollapseExpand
 
shane_solnosky_d992c7d197 profile image
Shane Solnosky
  • Joined

You do know that there's an additional argument to help with your configuration issues?--reuse-existing-values

CollapseExpand
 
petarcvit profile image
Petar Cvitanović
Building Cyclops UI, passionate about Kubernetes and cloud technologies
  • Location
    Zagreb, Croatia
  • Work
    CTO @ Cyclops UI
  • Joined

The question here is, will you remember the flag every time you upgrade a chart? The point on the configuration persistence is not really "Is the config saved?" because it is in the release secret, but how transparent is it for developers, and how reliably can they change releases? In my opinion, developers should focus on what they are good at, which is coding and shipping products, and leave deployment to developers proficient in the topic.

CollapseExpand
 
jmilic1 profile image
Jura Milić
  • Joined

Insightful post keep it up!

CollapseExpand
 
karadza profile image
Juraj
CEO and co-founder of Cyclops

💪💪

CollapseExpand
 
lmercep profile image
Luka
  • Joined

Very cool

CollapseExpand
 
karadza profile image
Juraj
CEO and co-founder of Cyclops

thanks! 🙌

CollapseExpand
 
tmnt-12 profile image
Théo Marceau
  • Joined

Dope

CollapseExpand
 
karadza profile image
Juraj
CEO and co-founder of Cyclops

😎

CollapseExpand
 
talbalash profile image
Tal Balash
  • Work
    Devops and fullstack engineer
  • Joined

cool, but isn't that argocd with extra crd?

CollapseExpand
 
petarcvit profile image
Petar Cvitanović
Building Cyclops UI, passionate about Kubernetes and cloud technologies
  • Location
    Zagreb, Croatia
  • Work
    CTO @ Cyclops UI
  • Joined

ArgoCD also has a CRD to manage deployments. The difference here is that you get a custom UI based on the helm chart for developers to use on top of their applications. With argocd you still need to configure all your apps through YAML

CollapseExpand
 
petarcvit profile image
Petar Cvitanović
Building Cyclops UI, passionate about Kubernetes and cloud technologies
  • Location
    Zagreb, Croatia
  • Work
    CTO @ Cyclops UI
  • Joined

Love the YAML meme 😄

CollapseExpand
 
karadza profile image
Juraj
CEO and co-founder of Cyclops

🔮 😂

CollapseExpand
 
schollii profile image
schollii
Apple IIe -> Distributed computing (C/C++, Python, Lua, Java, C#, Javascript) -> DevOps (Docker, Kubernetes, Helm, Terraform, Spinnaker, AWS)
  • Location
    Ontario, Canada
  • Education
    PhD in Physics
  • Work
    Independent Contractor via Sentian Cloud Computing Inc at Self-employed (Toptal, AIM Group, direct, etc)
  • Joined

Check out nelm, seems very promising to solve these and several other helm 2 limitations:github.com/werf/nelm

CollapseExpand
 
shurup profile image
Dmitry Shurupov
Open Source geek.
  • Work
    Co-founder @ Palark
  • Joined

Thanks for highlighting this project! It has seen a lot of progress lately, with the big news coming soon :)

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Developer friendly Kubernetes UI

We'd be thrilled if you could take a peek at our GitHub repository and give us a boost by starring it. Your support means a lot to us! ⭐

More fromCyclops UI

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp