Managing realistic configuration with ArgoCD: Helm charts as a source, multiple values files, Kustomize bases and overlays, Jsonnet, and even combining Helm with Kustomize and custom plugins.

So far we've managed plain manifests — great for learning, but not realistic. In the real world, applications use many environments, values change between clusters, and teams share the same chart. That's why you need to master configuration management: ArgoCD doesn't only read a folder full of YAML, it also renders Helm charts, builds Kustomize overlays, and can even evaluate Jsonnet.
Episode 8 closes the basic phase of this series by discussing how ArgoCD uses Helm, Kustomize, plain YAML, Jsonnet, and combinations of them — including Config Management Plugins for custom tooling.
If your repository contains a Helm chart, ArgoCD renders it just like running helm template. The Application looks almost the same, only the pointer to the chart is different:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/arman/helm-charts.git
path: charts/api
targetRevision: main
helm:
parameters:
- name: image.tag
value: v1.4.0
valueFiles:
- values-prod.yaml
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated: {}Instead of using --set per parameter, per-environment values are stored as files in the repository — values-prod.yaml, values-staging.yaml, etc. — and referenced via valueFiles. Because these files live in Git, every value change becomes a documented PR.
To share common values, use several files in order (later files override earlier ones):
spec:
source:
helm:
valueFiles:
- values-common.yaml
- values-production.yamlArgoCD can also fetch a chart directly from a Helm repository (not from Git) using the chart + repoURL combination pointing to a chart registry:
spec:
source:
repoURL: https://charts.example.com
chart: api
targetRevision: 2.3.0
helm:
valueFiles:
- values-prod.yamlArgoCD understands Helm annotations. Helm hooks (with helm.sh/hook: pre-install, post-install, etc. annotations) are treated by ArgoCD as resource hooks that run in the corresponding sync phase — for example a migration in the PreSync phase.
Tip
Understand the mental model difference: plain Helm manages releases (there's state in the cluster), while ArgoCD manages rendered manifests. With ArgoCD, there's no helm upgrade at runtime — every change goes through Git.
For Kustomize, ArgoCD runs kustomize build on the folder containing kustomization.yaml:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: api
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/arman/gitops-lab.git
path: overlays/production
targetRevision: main
kustomize:
images:
- ghcr.io/arman/api:v1.4.0
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated: {}This is the recommended pattern: the base stores neutral definitions, per-environment overlays contain the adjustments. ArgoCD just needs to be pointed at the overlay folder — the base/overlays structure built in episode 3 works out of the box.
Kustomize namePrefix / nameSuffix (e.g. prod-) allows one set of manifests to be used in many environments without name conflicts. ArgoCD renders the final result exactly like a local kustomize build.
With kustomize.images, you can override the image tag without changing Git files:
argocd app set api --kustomize-image ghcr.io/arman/api:v1.4.0This is equivalent to kustomize edit set image ghcr.io/arman/api:v1.4.0 — the difference is the change is made directly in the ArgoCD Application.
For a folder containing plain YAML, ArgoCD uses it as-is. Some useful options:
spec:
source:
directory:
recurse: true
exclude: "{{.Files}}"recurse: true — also reads subfolders.exclude — skips certain files (e.g. templates that aren't ready)..yaml and .yml files at the folder level are read.For teams that like Jsonnet, ArgoCD can evaluate it. Extensions and parameters are provided through the jsonnet field:
spec:
source:
path: apps/api
jsonnet:
extVars:
- name: image
value: ghcr.io/arman/api:v1.4.0
tlas:
- code: '{"replicas": 3}'
name: appConfigextVars are external variables, tlas are Top-Level Arguments passed to the Jsonnet entrypoint function.
This combination is popular: Helm produces the template, Kustomize adjusts it for each environment without changing the chart. In ArgoCD, turn on combined mode with plugin (built-in helm + kustomize):
spec:
source:
repoURL: https://github.com/arman/gitops-lab.git
path: apps/api
plugin:
name: helm-kustomize
parameters:
- name: image.tag
value: v1.4.0
- name: kustomize.args
value: overlays/productionThe needs are endless — custom templating, internal generators, team tooling. ArgoCD supports Config Management Plugins: container sidecars that render manifests with your own commands. This gives you full freedom to combine any tools in a single render pipeline.
Warning
The Helm + Kustomize pattern requires a CMP properly configured in argocd-repo-server. In the lab, verify with argocd app get api and check the repo-server render errors before assuming the configuration is wrong.
The basic phase of this series closes with complete configuration management:
parameters, valueFiles, Helm hooks.namePrefix/nameSuffix, image update without editing Git.recurse and exclude for directories.extVars and tlas.Your GitOps foundation is now complete: concepts, installation, operations, sync automation, and configuration management. In episode 9 we'll go beyond a single cluster — multi-cluster management: registering external clusters, hub-and-spoke strategies, and placing applications on many clusters at once. See you there!