You push a merge request, the pipeline kicks off, and yet your infrastructure changes still wait for a human to click “apply.” It feels wrong because it is. You already trust your CI/CD. What’s missing is the bridge between versioned infrastructure definitions and automated provisioning. That bridge is Crossplane GitLab.
Crossplane turns Kubernetes into a control plane for cloud resources. GitLab adds identity, pipelines, and policy enforcement at commit speed. Together they let teams manage infrastructure as code with actual runtime reconciliation instead of a pile of Terraform state files waiting for a runner. GitLab keeps the history; Crossplane maintains the truth.
Integrating them is surprisingly simple once you align the layers. GitLab’s runner executes your pipeline jobs, pushing configuration updates to a Crossplane control cluster. Crossplane watches Git commits as YAMLs defining managed resources, then uses Kubernetes service accounts and cloud credentials to make those definitions real in AWS, GCP, or Azure. The result is a living infrastructure map that GitLab can test, approve, and record.
A clean setup starts with identity and permissions. Map your GitLab CI credentials to Kubernetes service accounts that match the least privilege principle. Rotate those secrets automatically, ideally through GitLab’s Protected Variables or an OIDC trust relationship. Keep Crossplane out of your pipeline env vars; instead, let the cluster reference credentials from a secure secret store. That avoids drift and human leaks.
Quick answer: To connect Crossplane and GitLab, point your GitLab pipeline output (usually configuration YAML) at a Crossplane-managed Kubernetes cluster with proper OIDC or token-based authentication. Crossplane reads those manifests and provisions cloud resources based on them, ensuring Git commits directly control real infrastructure.