Packaging & Config

Crossplane

Infrastructure as Code Kubernetes-native CNCF Graduated - provisionner AWS/Azure/GCP via CRDs K8s, Compositions, XRDs, intégration GitOps native. Apache 2.0.

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

ComposantValeur
CRDs coreProvider, ProviderConfig, Composition, CompositeResourceDefinition (XRD)
Providers officielsprovider-upjet-aws, provider-upjet-azure, provider-upjet-gcp, provider-helm, provider-kubernetes
Namespace installcrossplane-system
RéconciliationContinue (comme tout contrôleur K8s)
GitOpsNatif avec Argo CD ou FluxCD

Prérequis

RessourceValeur
Kubernetes1.22+
Credentials cloudIAM/ServicePrincipal/ServiceAccount avec droits de provisionnement
Helm3.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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic