Removes the cause of the diff failures that ServerSideDiff worked around: v2.13.8 diffs against a Kubernetes schema compiled into its own binary, and this cluster is newer than that schema. Three things needed real changes, none of them mechanical: - applicationSet.enabled no longer exists, and there is no replacement gate — unlike dex and notifications, the ApplicationSet controller's Deployment carries no conditional at all. Helm ignores unknown keys, so carrying the old value forward would have quietly started a controller nothing here uses. replicas: 0 is the only lever. - The image tag pin is dropped rather than moved to v3.5.2. The chart's appVersion governs, so image and chart cannot drift; a pin outliving its chart is close to the failure being fixed here. - server.insecure moved from server.extraArgs to configs.params, which is what the chart renders into argocd-cmd-params-cm. Caught by rendering: an earlier version of this commit deleted the extra arg on the strength of a comment claiming configs.params already set it, which it did not — Argo CD would have served its own TLS behind Contour and produced a redirect loop. Verified in the rendered output: image v3.5.2 and no v2.13.8 anywhere, server.insecure true, dex and notifications absent, ApplicationSet at zero replicas, both HPAs intact with replicas omitted, ingress on Contour, repo Secrets on cluster DNS. Behaviour changes in v3 that apply here, none needing a values change: logs RBAC is now enforced (jenkins-ci only syncs), update/delete no longer inherit to sub-resources, and resource tracking moves from labels to annotations, so the first sync re-stamps every managed resource. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LEsTefWWifp4ikvhHF5s6N
argo-cd — bootstrap runbook
Thin wrapper chart (see Chart.yaml — dependency on argo/argo-cd). This
README covers a full reset and clean bootstrap of ArgoCD itself on the
homelab VM (cluster k8s-admin-prd-ase1, namespace argocd), end to end.
ArgoCD is the one thing in this repo that can't bootstrap itself via
GitOps — it has to exist before it can manage anything, including itself —
so every step here is a manual, imperative command run once.
0. Full uninstall (only if resetting)
helm uninstall argocd-admin-prd -n argocd
kubectl delete namespace argocd
helm uninstall removes everything the release owns, including the
Application/AppProject/ApplicationSet CRDs (this chart installs them
as plain templates, not as a separate hook that survives uninstall).
Deleting the namespace on top cleans up anything left behind (PVCs for the
bundled Redis, stray ConfigMaps/Secrets created outside the Helm release,
etc.). Confirm it's actually clean before moving on:
kubectl get all -n argocd # should error "not found" once the ns is gone
kubectl get crd | grep argoproj.io # should return nothing
1. Pull the real chart
This wrapper's Chart.yaml only declares a dependency — the actual
argo-cd chart isn't vendored, so pull it first:
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm dependency update helm-templates/argo-cd # run from the repo root
2. Install
kubectl create namespace argocd --dry-run=client -o yaml | kubectl apply -f -
helm upgrade --install argocd-admin-prd helm-templates/argo-cd \
--namespace argocd \
-f helm-overrides/k8s-admin-prd-ase1/argocd-admin-prd/custom-values.yaml
kubectl -n argocd rollout status deploy -l app.kubernetes.io/component=server --timeout=180s
argocd-admin-prd is the release name — it has to match the nameOverride
in devops-infra-argo-config's
values/incubator-infra-k8s-admin-prd-ase1-values.yaml appSpec entry for
argocd, since once GitOps sync takes over, Argo renders using that same
name.
3. Get in
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath='{.data.password}' | base64 -d; echo
Username is always admin. This secret only gets created by a
first-install Helm hook — it won't reappear on a later helm upgrade
against an existing release, only right after step 2 on a genuinely fresh
install (which is why step 0's full uninstall matters if you're trying to
get back to a known state rather than just patching forward).
If it's missing later and you're locked out:
kubectl -n argocd exec -it deploy/argocd-server -- argocd admin initial-password -n argocd
# or, as a last resort, set it directly:
kubectl -n argocd exec -it deploy/argocd-server -- argocd account bcrypt --password '<new-password>'
kubectl -n argocd patch secret argocd-secret \
-p '{"stringData": {"admin.password": "<hash-from-above>", "admin.passwordMtime": "'$(date +%FT%T%Z)'"}}'
Reach the UI at argocd.192.168.1.7.nip.io (Contour ingress, plain HTTP —
--insecure is set in custom-values.yaml on purpose, see that file).
4. Give it repos to sync from
Push devops-infra-argo-config and devops-infra-helm-charts to Gitea. If
either repo isn't anonymous-read, ArgoCD needs a credential for both —
the incubator Application sources devops-infra-argo-config directly, and
every child Application's $values ref sources devops-infra-helm-charts.
See devops-infra-argo-config/gitea-repo-credentials.example.yaml for the
Secret template (copy it, fill in a real Gitea access token, kubectl apply, never commit the filled-in version).
5. Hand control to GitOps
From devops-infra-argo-config:
kubectl apply -f app-of-projects.yaml # creates the "devops" AppProject
kubectl apply -f incubator/incubator-infra-k8s-admin-prd-ase1.yaml # renders argocd + gitea Applications
Check it landed:
kubectl -n argocd get applications
Expect to see app-of-projects, incubator-infra-k8s-admin-prd-ase1,
argocd-admin-prd, and gitea. Everything in this repo is manual-sync
only on purpose (no app has an automated: syncPolicy) — click Sync in
the UI (or argocd app sync <name> via CLI) rather than expecting anything
to reconcile on its own. argocd-admin-prd going green means ArgoCD is now
managing its own Helm release via Git instead of the imperative commands
above — from here on, values changes go through
helm-overrides/k8s-admin-prd-ase1/argocd-admin-prd/custom-values.yaml,
not a manual helm upgrade.
Gotchas hit getting here (don't relitigate these)
spec.project: devopson child Applications requires thedevopsAppProject to exist first — that's what step 5'sapp-of-projects.yamlapply is for. Skipping it meansgitea's (and any future app's) Application object exists in Git/gets rendered but fails to validate.- Deleting a ConfigMap this chart owns doesn't self-heal — same
manual-sync-only reasoning as above. Re-running step 2's
helm upgrade --installrecreates anything missing from the release; it just won't regenerateargocd-initial-admin-secret(see step 3). - Gitea-specific adoption issues (the
value→valueFromenv var migration, the single-nodeRollingUpdateLevelDB lock collision) are documented inhelm-overrides/k8s-admin-prd-ase1/gitea/custom-values.yamlinstead — not an ArgoCD problem, don't duplicate the notes here.