Guide to deploying Helm charts with Argo CD, explaining Helm-specific options, values override mechanisms, precedence, and examples using a simple random shapes chart.
In this lesson you’ll learn how to deploy Helm charts with Argo CD and how Argo CD exposes Helm-specific options: value files, inline values, valuesObject, and Helm parameters. The examples use a simple Helm chart that renders a ConfigMap and a Deployment from chart defaults in values.yaml. You’ll also see how Argo CD merges and applies overrides and the defined order of precedence.
A typical Argo CD Application that references a Helm chart includes Helm-specific fields under spec.source.helm. The minimal Application spec looks like this:
Copy
apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata: name: guestbook # You'll usually want to add your resources to the argocd namespace. namespace: argocd # Add this finalizer ONLY if you want these to cascade delete. finalizers: # The default behaviour is foreground cascading deletion - resources-finalizer.argocd.argoproj.io labels: name: guestbookspec: # The project the application belongs to. project: default # Source of the application manifests source: repoURL: https://github.com/argoproj/argocd-example-apps.git targetRevision: HEAD # If repoURL is a Git repo, this is branch/tag/commit. If repoURL is a Helm repo, this can be the chart version. path: guestbook # Path inside the repo when using a Git source
Scroll to spec.source.helm to configure Helm-specific behavior. Argo CD accepts multiple ways to pass Helm values and options:
valueFiles: list of values files (relative to spec.source.path)
values: inline YAML block
valuesObject: native key/value map (preferred over values)
parameters: Helm name/value list (highest precedence)
Use valueFiles to reference files in the chart directory (relative to spec.source.path). You can also provide values as an inline YAML document or valuesObject as a native map. valuesObject takes precedence over values.
Copy
# The path is relative to the spec.source.path directory defined abovevalueFiles: - values-prod.yaml# Ignore locally missing valueFiles when installing Helm chart. Defaults to falseignoreMissingValueFiles: false# Values file as block (YAML). Prefer to use valuesObject if possible (see below)values: | ingress: enabled: true path: / hosts: - mydomain.example.com annotations: kubernetes.io/ingress.class: nginx kubernetes.io/tls-acme: "true" labels: {} tls: - secretName: mydomain-tls hosts: - mydomain.example.com# Values as a native object. This takes precedence over `values`valuesObject: ingress: enabled: true path: / hosts: - mydomain.example.com annotations: kubernetes.io/ingress.class: nginx kubernetes.io/tls-acme: "true" labels: {} tls: - secretName: mydomain-tls hosts: - mydomain.example.com
Argo CD supports additional Helm options that affect templating and installation:
Copy
# Skip custom resource definition installation if chart contains CRDsskipCrds: false# Skip schema validation if chart contains JSON schema validation. Defaults to falseskipSchemaValidation: false# Optional Helm version to template with. If omitted, Argo CD will decide which Helm binary to use automatically.# Valid values: 'v2' or 'v3'version: v3# You can specify the Kubernetes version to pass to Helm when templating manifests.# The value must be semver formatted.kubeVersion: "1.30.0"# You can specify additional API versions to pass to Helm when templating.# Format: [group]/version/kind (or just version/kind)apiVersions: - traefik.io/v1alpha1/TLSOption - v1/Service# Optional namespace to template with. If left empty, defaults to the app's destination.namespace: custom-namespace
Argo CD also supports other customization tools such as Kustomize. This lesson focuses on Helm, but here is a reference Kustomize block for completeness:
The demo repository contains a simple Helm chart (v1.0.0) with a values.yaml and templates that render a ConfigMap and a Deployment.Default values.yaml (chart defaults):
Copy
replicaCount: 1image: repository: siddharth67/php-random-shapes:v1 pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: ""imagePullSecrets: []nameOverride: ""fullnameOverride: ""service: type: ClusterIP port: 80 targetPort: 80color: circle: black oval: black triangle: black rectangle: black square: black
templates/configmap.yaml (reads color values from chart values):
When Argo CD detects this chart in a repo, the UI pre-populates fields from the chart’s default values.yaml. If you don’t provide any overrides, Argo CD will deploy using those chart defaults.
Create the Application in Argo CD with your desired sync options (for example, automatic sync, auto-create namespace, destination server set to in-cluster). By default the chart renders with the chart’s default values (all shapes black, service type ClusterIP, image from values.yaml). The Deployment and Pod should appear in the target namespace (for example, helm-chart).Here is the Application resource tree showing the deployed resources:
Argo CD offers multiple ways to change Helm values after the Application has been created:
Upload a values.yaml file to the Application
Edit values (YAML block)
Edit valuesObject (map form)
Edit parameters (name/value list — highest precedence)
Example inline values override added in the UI or to the Application manifest:
Copy
color: circle: redservice: type: NodePort
After saving, Argo CD re-renders the manifests and applies the updated resources. For example, the ConfigMap will change to reflect the override:
Copy
apiVersion: v1kind: ConfigMapmetadata: name: helm-random-shapes-configmap namespace: helm-chartdata: CIRCLE_COLOR: red OVAL_COLOR: black RECTANGLE_COLOR: black SQUARE_COLOR: black TRIANGLE_COLOR: black
If you change service type to NodePort, the Service manifest updates accordingly:
Updating a ConfigMap consumed by a Deployment (via envFrom) does not automatically restart running pods. To make pods pick up the new environment variables, perform a rollout restart on the Deployment, or use Argo CD reconciliation policies to trigger pod replacement.
Example command to restart the deployment so new pods pick up updated ConfigMap values:
Argo CD exposes Helm parameters (a list of name/value pairs) that take the highest precedence when templating. Parameters are useful for single-value overrides or when you prefer a flat list.Example parameters entry:
Copy
parameters: - name: "color.circle" value: "green"
If the same key is present in both values (or valuesObject) and parameters, the value from parameters will be used. For example:
values sets color.circle: red
parameters sets color.circle: green
Result in rendered manifests: CIRCLE_COLOR: green
Precedence summary: when multiple Helm override mechanisms are used, Argo CD applies them in a defined order — last overrides win. Use the precedence table below to decide where to place your overrides.
If values-file-1.yaml contains param1: value1 and values-file-2.yaml contains param1: value2, the effective value is value2.parameters duplicate example:
This walkthrough covered deploying a Helm chart with Argo CD, how to update Helm values via UI or manifests, and how Argo CD determines which override mechanism wins during templating.