Challenge, Medium,  on  Kubernetes

Render and Install Argo CD with Helm, Skipping Pre-Installed CRDs

Scenario

Your platform team manages all Argo CD CustomResourceDefinitions (Application, AppProject, ApplicationSet) centrally, applying and upgrading them outside of any Helm release so that CRD changes can be reviewed and rolled out independently of the application workloads that depend on them.

The Argo CD CRDs are already installed in this cluster. Your job is to render the rest of the Argo CD installation with Helm, without letting the chart try to install its own copies of those CRDs, which would fight with the ones the platform team already manages.


Task

Install Argo CD in the Kubernetes cluster using Helm, while ensuring the chart's bundled CRDs are not part of the generated manifest, since they are pre-installed:

  1. Add the official Argo CD Helm repository with the name argocd (https://argoproj.github.io/argo-helm).
  2. Generate a Helm template from the Argo CD chart, version 10.2.0, for the argocd namespace. Use --create-namespace to create the namespace automatically — no separate kubectl create namespace needed.
  3. Ensure that CRDs are not included in the rendered output by configuring the chart accordingly.
  4. Save the generated YAML manifest to /home/laborant/argo-helm.yaml.
  5. Install Argo CD into the cluster using helm install with the same chart version, namespace, and CRD-skip configuration.
Important

After helm install, ensure all Argo CD pods are running with kubectl get pods -n argocd — all components must be up for the task to pass.


Hint 1 - Adding the Repository

Register the Argo CD Helm repository under the name argocd and refresh the local index:

helm repo add argocd https://argoproj.github.io/argo-helm
helm repo update

Documentation

Hint 2 - Finding the Value That Controls CRD Installation

Every Helm chart documents its configurable values. Before templating, inspect what the chart exposes for version 10.2.0:

helm show values argocd/argo-cd --version 10.2.0 | less

Look near the top of the output for a section that groups CRD-related settings together. It will look something like:

crds:
  install: <true-or-false>
  keep: true
  ...

Whichever field controls whether CRDs get installed is the one you need to override to false when rendering the template.

Documentation

Hint 3 - Rendering the Template to a File

helm template only prints the rendered manifests locally without applying them. Use --create-namespace so the namespace is created automatically:

helm template argocd argocd/argo-cd \
  --version 10.2.0 \
  --namespace argocd \
  --create-namespace \
  --set crds.install=false \
  > /home/laborant/argo-helm.yaml

Once the file is generated, confirm it does not contain any CustomResourceDefinition resources:

grep "kind: CustomResourceDefinition" /home/laborant/argo-helm.yaml

This should print nothing.

Documentation

Hint 4 - Installing Argo CD with Helm

Use helm install with the same flags as your helm template command to deploy Argo CD into the cluster, skipping the CRDs that are already managed separately:

helm install argocd argocd/argo-cd \
  --version 10.2.0 \
  --namespace argocd \
  --create-namespace \
  --set crds.install=false

After installation, verify all core pods are running:

kubectl get pods -n argocd

You should see pods for argocd-server, argocd-repo-server, argocd-application-controller, argocd-dex-server, and argocd-redis.

Note: argocd-application-controller runs as a StatefulSet, not a Deployment. Use kubectl rollout status statefulset/argocd-application-controller to check it — kubectl wait deployment will fail with "not found" for it.

Documentation


⚒ Test Cases