You know that moment when your cloud infra looks perfect in theory but collapses into YAML spaghetti in practice? That is usually the gap between GitOps and resource provisioning. ArgoCD handles deployments like a pro, but it does not claim your cloud resources. Crossplane does. Together, they bridge the line between declarative apps and the infrastructure that carries them.
In short, ArgoCD manages application state, and Crossplane manages infrastructure state. Think of them as complementary halves of a DevOps brain. ArgoCD keeps your Kubernetes clusters synchronized with Git, ensuring applications deploy as intended. Crossplane extends Kubernetes itself into a control plane for any cloud resource, from RDS databases to S3 buckets, using custom resource definitions. When combined, you get one Git repository to define, deploy, and maintain the entire world your app lives in.
Once you hook ArgoCD to Crossplane, the workflow becomes simple and repeatable. Developers describe infra in YAML alongside their apps. ArgoCD detects the commit, reconciles the manifests, and Crossplane provisions the required resources using provider credentials stored in Kubernetes. No Terraform runs, no manual approvals. The cluster becomes the one source of truth.
How do you connect ArgoCD and Crossplane?
You sync Crossplane’s provider configs and compositions as regular Kubernetes manifests. ArgoCD treats them as part of the same app or parent project. When you modify resources in Git, ArgoCD applies them, Crossplane fulfills them, and your cloud accounts reflect that new desired state. It is declarative all the way down.
To keep things safe, map RBAC carefully. ArgoCD’s service account should only operate on Crossplane resources within a defined namespace. Rotate your provider secrets through external stores like AWS Secret Manager or Vault, and avoid storing static credentials in plain manifests. If you do it right, the CI/CD audit log tells the full story of who changed what and when.