I'm transitioning to using ArgoCD and I'm getting accustomed to working with Helm charts and Kustomize. A common challenge I encounter involves the order in which I install components. For instance, when I install an operator that adds custom resources (CRDs), I then need to configure these resources accordingly.
Here's a typical scenario:
1. Install the Envoy Operator
2. Set up the Gateway using an Envoy Object
3. Install Cert Manager
4. Set up a Certificate Request with cert-manager objects
5. Install PostgreSQL or Kafka operators
6. Create resources that use the above operators
7. Set up a web application that utilizes the database, complete with valid HTTP routes and ingress.
At this point, I find myself with around eight different ArgoCD applications just for what could potentially be managed as one WordPress app, which feels excessive. I could combine all operators into a single application, while the other manifest resources could be managed separately, but that feels awkward.
I attempted to create a Helm chart that installs the Envoy operator along with the EnvoyProxy and defines the GatewayClass simultaneously. However, this failed because it doesn't recognize the required gateway resource until the operator is installed. The only workaround I see is to extract full YAML manifests for the operator and utilize pre-install hooks, but that feels like a hack.
How can I effectively define a full application with all its dependencies or set up complex stacks that involve SSL, Networking configurations, data stores, routing, and web applications? Ideally, I want a straightforward installation process for deploying a cohesive product. Should I explore using Helmfile or even consider creating a full-fledged operator to package these components together? Is there a better tool or approach I might be overlooking?
3 Answers
You can actually go pretty far with the use of annotations in ArgoCD. I have managed projects that first install the required operators and CRDs, and then deploy the object instances in a sequence using `sync-wave` annotations. Though it does end up being multiple applications, grouping them helps in managing upgrades and keeping them somewhat hidden from view.
I'm not personally experienced with it, but have you checked out Kro? It seems tailored for these kinds of use cases! You might find it helpful for managing installations.
Managing dependencies in Helm can definitely be tricky. As you've noticed, the sequencing of custom resources isn't great right now. According to what I’ve read, they plan to address this in future Helm versions, but until then, using hooks is the common workaround, even if it feels hacky.

Thanks for the tip on sync-wave! I had stumbled upon it before but didn’t dig deeper. Your idea of grouping applications together makes sense. I appreciate it!