Screenshot from the article

Introduction

As cloud-native applications continue to evolve, managing multi-cloud and hybrid environments efficiently becomes critical. CrossPlane is an open-source Kubernetes-native control plane that enables organizations to manage cloud infrastructure declaratively using Kubernetes APIs.

This guide will explore:

  • What CrossPlane is and its use cases
  • Setting up CrossPlane on Kubernetes
  • Creating and managing cloud resources with CrossPlane
  • Best practices and troubleshooting common issues
  • Advanced automation techniques
  • FAQs and real-world scenarios

1. Understanding CrossPlane and Its Use Cases

CrossPlane extends Kubernetes’ API to provision and manage cloud resources declaratively. Instead of using cloud-specific APIs (like AWS CloudFormation, Terraform, or Azure ARM templates), you define infrastructure using Kubernetes manifests.

Key Features:

  • Multi-cloud management: Supports AWS, Azure, GCP, and more.
  • Declarative infrastructure management: Uses YAML manifests to define cloud resources.
  • RBAC and GitOps compatibility: Works seamlessly with Kubernetes RBAC and CI/CD workflows.
  • Composability: Enables organizations to create their own Infrastructure as Code (IaC) abstractions.

Use Cases:

  • Multi-cloud automation using Kubernetes.
  • Self-service cloud provisioning for DevOps teams.
  • Policy-driven infrastructure governance.
  • CI/CD workflows integrating infrastructure and application deployment.

2. Setting Up CrossPlane on Kubernetes

Step 1: Install CrossPlane

Ensure you have a running Kubernetes cluster (EKS, GKE, AKS, or Minikube). Install CrossPlane via Helm:

kubectl create namespace crossplane-system
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm install crossplane crossplane-stable/crossplane --namespace crossplane-system

Verify the installation:

kubectl get pods -n crossplane-system

Step 2: Install a Cloud Provider Package

For AWS:

kubectl apply -f https://raw.githubusercontent.com/crossplane/provider-aws/main/package/crds/provider-aws.crds.yaml
kubectl apply -f https://raw.githubusercontent.com/crossplane/provider-aws/main/package/default/provider.yaml

For GCP:

kubectl apply -f https://raw.githubusercontent.com/crossplane/provider-gcp/main/package/crds/provider-gcp.crds.yaml
kubectl apply -f https://raw.githubusercontent.com/crossplane/provider-gcp/main/package/default/provider.yaml

Step 3: Create Cloud Credentials Secret

For AWS:

kubectl create secret generic aws-creds -n crossplane-system \
  --from-file=credentials=$HOME/.aws/credentials

For GCP:

kubectl create secret generic gcp-creds -n crossplane-system \
  --from-file=credentials=$HOME/.gcp/credentials.json

3. Managing Cloud Resources with CrossPlane

Example: Provision an AWS RDS Database

Create an AWS ProviderConfig:

apiVersion: aws.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: aws-provider
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds
      key: credentials

Deploy an RDS Database instance:

apiVersion: database.aws.crossplane.io/v1beta1
kind: RDSInstance
metadata:
  name: example-db
spec:
  forProvider:
    region: us-east-1
    dbInstanceClass: db.t3.micro
    masterUsername: admin
    masterPasswordSecretRef:
      namespace: default
      name: db-password
      key: password
  providerConfigRef:
    name: aws-provider

Apply the configuration:

kubectl apply -f rds-instance.yaml

Check the resource status:

kubectl get rdsinstances.database.aws.crossplane.io

4. Best Practices for CrossPlane Automation

✅ Use Infrastructure Compositions

  • Define reusable Kubernetes CRDs for cloud resources.
  • Use Composition API to group resources (e.g., a full AWS VPC setup with EC2, RDS, and S3).

✅ Integrate with GitOps (ArgoCD, Flux)

  • Store CrossPlane manifests in Git repositories.
  • Use CI/CD tools to deploy and update infrastructure.

✅ RBAC and Namespace Isolation

  • Limit access to cloud resources using Kubernetes RBAC.
  • Organize teams using Kubernetes namespaces.

✅ Automate CrossPlane Upgrades

  • Regularly update CrossPlane and provider plugins.
  • Automate updates with Helm and Kubernetes Operators.

5. FAQs & Troubleshooting

❓ Why isn’t my CrossPlane resource being created?

✅ Check CrossPlane logs:

kubectl logs -l app=crossplane -n crossplane-system

✅ Ensure the provider credentials secret is correctly configured.

❓ How do I update a CrossPlane resource?

✅ Modify the YAML manifest and reapply:

kubectl apply -f updated-resource.yaml

✅ Check if the resource is being reconciled properly.

❓ Can CrossPlane manage multiple cloud providers at once?

✅ Yes! You can configure multiple ProviderConfigs and manage AWS, GCP, and Azure resources in a single cluster.

❓ What is the difference between CrossPlane and Terraform?

✅ CrossPlane is Kubernetes-native and uses a controller-based reconciliation approach.

✅ Terraform is declarative but requires manual execution (terraform apply).

✅ CrossPlane is always active, whereas Terraform is event-driven.

6. Conclusion

CrossPlane is a powerful tool that brings Kubernetes-native Infrastructure as Code (IaC) to multi-cloud environments. By leveraging CrossPlane compositions, GitOps workflows, and RBAC security, organizations can simplify infrastructure automation while maintaining full control over cloud resources. 🚀

Start using CrossPlane today and streamline your cloud-native infrastructure!

📢 Have questions or feedback? Drop a comment below or connect with me on Twitter/X@spysood!

Originally published on Medium.