GitOps (Argo CD)¶
Declarative continuous delivery for the inference platform: git is the source of truth,
and Argo CD reconciles the cluster to match. This is the CD half of the platform's
GitOps and CI setup. The CI half (.github/workflows/ci.yml)
lints, schema-validates, and builds every change before it merges.
Applications¶
applications.yaml defines two Argo CD Applications:
| Application | Syncs | Into |
|---|---|---|
inference-serving |
vllm-2gpu.yaml + observability.yaml (Service, PodMonitor, SLO PrometheusRule, Grafana dashboard ConfigMap) |
inference ns (dashboard ConfigMap into monitoring, its own manifest-declared namespace) |
inference-scaler |
the Go external scaler Deployment/Service + its scaledobject-external.yaml ScaledObject |
inference ns |
Both use automated sync with prune and selfHeal, so drift is corrected and deletions in
git propagate. A directory include filter keeps alternative manifests — gpu-node/'s
vllm-plain.yaml, kserve-inferenceservice.yaml, and the built-in-scaler
keda-scaledobject-gpu.yaml — out of the synced set, since they're documented options, not
the running desired state. The custom Go external scaler's composite ScaledObject
(keda-inference-scaler/deploy/scaledobject-external.yaml) is the default scaling path.
Install & apply¶
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl apply -f gitops/applications.yaml
argocd app list # or the Argo CD UI
Same WSL2 caveat as KServe/KEDA
Argo CD ships admission/redis/repo-server components and (like cert-manager, KServe, and KEDA) is webhook- and in-cluster-networking-sensitive. On this broken-overlay cluster its controllers should be co-located with the API server (cordon the laptop during install), for the reasons in the troubleshooting log and architecture decisions. On a healthy CNI none of that is needed.
Status¶
The Application definitions are committed and CI-validated, and Argo CD is installed on the
DIY cluster syncing the platform (the bootstrap reconstitutes it, co-locating its controllers
with the API server per the caveat above). A Terraform/Helm IaC pass is the remaining delivery work.