DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

Cover image for Cluster Specific Template Overrides in ArgoCD ApplicationSets Using Cluster Generators
Abel Varga
Abel Varga

Posted on

Cluster Specific Template Overrides in ArgoCD ApplicationSets Using Cluster Generators

Introduction

Creating ApplicationSets is a great tool dry up application templates in ArgoCD. You can generate similar applications where the only difference is the namespace for staging and production, or the labeling for tracks like canary and stable. So consider this use-case:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: example-application
  namespace: argocd
spec:
  syncPolicy:
    preserveResourcesOnDeletion: true
  generators:
    - clusters:
        selector:
          matchLabels: #...
        values:
          env: staging
          track: stable
    - clusters:
        selector:
          matchLabels: #...
        values:
          env: production
          track: stable
    - clusters:
        selector:
          matchLabels: #...
        values:
          env: production
          track: canary
template:
  #...
Enter fullscreen mode Exit fullscreen mode

These values are easy to set as they are mere strings. You can use simple interpolation to use these. In our case, we use several different values files based on these values in the template specs.

valueFiles:
  - values.yaml
  - 'values.{{values.env}}.yaml'
  - 'values.{{values.track}}.yaml'
  - 'secrets.{{values.env}}.yaml'
Enter fullscreen mode Exit fullscreen mode

The Problem

This is all fine and dandy until you need something more complex. Imagine the case where you would like to set only one of these clusters to do automatic syncing. In our case, whenever we change the version in the helm chart, we'd like staging to be synced right away. We can set the syncPolicy, but its interface is an object, and you cannot interpolate that in a cluster specific way. To enable this we need to use the following:

syncPolicy:
  automated: {}
Enter fullscreen mode Exit fullscreen mode

Where do you set these overrides if you want it to be merged only for staging for example?

The Solution

You can set template overrides in the cluster object. This will be merged with the template defined in this chart.

- clusters:
    selector:
      matchLabels: #...
    values:
      env: staging
      track: stable
    template:
      spec:
        syncPolicy:
          automated: {}
Enter fullscreen mode Exit fullscreen mode

But one does not simply set template override, for some reason there are mandatory keys to be set, even if they are just placeholders. This means there is a minimal shape that you need to set to set anything for the cluster in hand. That looks like this:

  template:
+   metadata: {}
    spec:
+     project: app
+     destination: {}
+     source:
+       repoURL: http://github.com/example/helm-charts
      syncPolicy:
        automated: {}
Enter fullscreen mode Exit fullscreen mode

So the staging cluster should look like this to be valid:

- clusters:
    selector:
      matchLabels: #...
    values:
      env: staging
      track: stable
    template:
      metadata: {}
      spec:
        project: web
        destination: {}
        source:
          repoURL: http://github.com/example/helm-charts
        syncPolicy:
          automated: {}
Enter fullscreen mode Exit fullscreen mode

So there you go, if you're using cluster generators and would like a cluster specific override of the sync policy, now you know how to do that.

Top comments (0)

🌚 Browsing with dark mode makes you a better developer.

It's a scientific fact.