Crossplane est une plateforme d'Infrastructure as Code native Kubernetes, CNCF Graduated, développée par Upbound. Elle étend l'API Kubernetes avec des CRDs représentant les ressources cloud (bases de données RDS, buckets S3, VPC, etc.) comme des objets K8s. Le contrôleur Crossplane observe ces déclarations et provisionne l'infrastructure réelle via des providers (provider-aws, provider-azure, provider-gcp). Les Compositions permettent de construire des abstractions (XRDs) qui exposent des interfaces simplifiées aux équipes applicatives tout en cachant la complexité de l'infrastructure.
Informations essentielles
Origine : Upbound → CNCF Graduated · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · Releases · Marketplace providers
Support : CNCF Graduated. Maintenu par Upbound, communauté active.
Stack par défaut
| Composant | Valeur |
|---|---|
| CRDs core | Provider, ProviderConfig, Composition, CompositeResourceDefinition (XRD) |
| Providers officiels | provider-upjet-aws, provider-upjet-azure, provider-upjet-gcp, provider-helm, provider-kubernetes |
| Namespace install | crossplane-system |
| Réconciliation | Continue (comme tout contrôleur K8s) |
| GitOps | Natif avec Argo CD ou FluxCD |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.22+ |
| Credentials cloud | IAM/ServicePrincipal/ServiceAccount avec droits de provisionnement |
| Helm | 3.x (pour l'installation) |
Installation
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane crossplane-stable/crossplane \
--namespace crossplane-system \
--create-namespace
# Vérifier
kubectl get pods -n crossplane-system
# crossplane, crossplane-rbac-manager Running
Installer un provider
# Exemple : provider AWS (Upjet - généré depuis le Terraform AWS provider)
cat <<EOF | kubectl apply -f -
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
name: provider-aws-s3
spec:
package: xpkg.upbound.io/upbound/provider-aws-s3:latest
EOF
# Vérifier
kubectl get providers
# provider-aws-s3 True ...
Configurer les credentials du provider
# Secret contenant les credentials AWS
apiVersion: v1
kind: Secret
metadata:
name: aws-creds
namespace: crossplane-system
type: Opaque
stringData:
credentials: |
[default]
aws_access_key_id = AKIAXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
---
# ProviderConfig - associer les credentials au provider
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
name: default
spec:
credentials:
source: Secret
secretRef:
namespace: crossplane-system
name: aws-creds
key: credentials
Provisionner une ressource cloud
# Créer un bucket S3 directement
apiVersion: s3.aws.upbound.io/v1beta1
kind: Bucket
metadata:
name: my-app-assets
spec:
forProvider:
region: eu-west-1
tags:
environment: production
team: backend
providerConfigRef:
name: default
kubectl apply -f bucket.yaml
# Suivre le provisionnement
kubectl get bucket my-app-assets
# READY SYNCED EXTERNAL-NAME AGE
# True True my-app-assets 2m
# Voir les détails et l'ARN AWS
kubectl describe bucket my-app-assets
Compositions et XRDs - abstractions pour les équipes
Les Compositions permettent de créer des ressources composites (par ex. "base de données applicative" = RDS + subnet group + security group) et d'exposer une interface simplifiée aux développeurs via une XRD.
Définir une XRD (l'API exposée)
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xpostgresqlinstances.database.example.com
spec:
group: database.example.com
names:
kind: XPostgreSQLInstance
plural: xpostgresqlinstances
claimNames:
kind: PostgreSQLInstance
plural: postgresqlinstances
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
parameters:
type: object
properties:
storageGB:
type: integer
region:
type: string
Claim utilisateur (interface simplifiée)
# Ce que les développeurs voient et utilisent
apiVersion: database.example.com/v1alpha1
kind: PostgreSQLInstance
metadata:
name: my-app-db
namespace: production
spec:
parameters:
storageGB: 20
region: eu-west-1
compositionRef:
name: postgresql-aws
writeConnectionSecretToRef:
name: my-app-db-conn # Connection string injectée dans ce Secret
Mise à jour
helm repo update
helm upgrade crossplane crossplane-stable/crossplane \
--namespace crossplane-system \
--reuse-values
Troubleshooting
# État des providers
kubectl get providers
# État des ressources managées
kubectl get managed # Toutes les ressources cloud gérées par Crossplane
# Ressource bloquée en non-Ready
kubectl describe bucket my-app-assets
# Vérifier section "Status > Conditions" pour les erreurs
# Logs du contrôleur Crossplane
kubectl logs -n crossplane-system \
-l app=crossplane --tail=50
# Logs du provider (pour les erreurs API cloud)
kubectl logs -n crossplane-system \
-l pkg.crossplane.io/revision=provider-aws-s3 --tail=50
# Lister les CRDs installées par un provider
kubectl get crds | grep aws.upbound.io
Ressources
- Site officiel : https://crossplane.io
- Documentation : https://docs.crossplane.io/
- GitHub : https://github.com/crossplane/crossplane
- Marketplace providers : https://marketplace.upbound.io/
- Releases : https://github.com/crossplane/crossplane/releases